36
36
import jdk .graal .compiler .graph .NodeMap ;
37
37
import jdk .graal .compiler .nodeinfo .NodeInfo ;
38
38
import jdk .graal .compiler .nodes .FrameState ;
39
+ import jdk .graal .compiler .nodes .NodeView ;
39
40
import jdk .graal .compiler .nodes .ValueNode ;
41
+ import jdk .graal .compiler .nodes .calc .CompressBitsNode ;
40
42
import jdk .graal .compiler .nodes .spi .Canonicalizable ;
41
43
import jdk .graal .compiler .nodes .spi .CanonicalizerTool ;
42
44
import jdk .graal .compiler .nodes .spi .CoreProviders ;
43
45
import jdk .graal .compiler .replacements .nodes .MacroNode .MacroParams ;
44
46
import jdk .graal .compiler .vector .architecture .VectorArchitecture ;
47
+ import jdk .graal .compiler .vector .nodes .amd64 .IntegerToOpMaskNode ;
48
+ import jdk .graal .compiler .vector .nodes .amd64 .OpMaskToIntegerNode ;
49
+ import jdk .graal .compiler .vector .nodes .simd .LogicValueStamp ;
45
50
import jdk .graal .compiler .vector .nodes .simd .SimdConstant ;
46
51
import jdk .graal .compiler .vector .nodes .simd .SimdCompressNode ;
47
52
import jdk .graal .compiler .vector .nodes .simd .SimdExpandNode ;
@@ -103,7 +108,7 @@ private ValueNode mask() {
103
108
104
109
@ Override
105
110
public Iterable <ValueNode > vectorInputs () {
106
- return List .of (source (), mask ());
111
+ return source (). isNullConstant () ? List . of ( mask ()) : List .of (source (), mask ());
107
112
}
108
113
109
114
@ Override
@@ -121,7 +126,7 @@ public Node canonical(CanonicalizerTool tool) {
121
126
122
127
ValueNode [] args = toArgumentArray ();
123
128
ObjectStamp newSpeciesStamp = improveResultBoxStamp (tool );
124
- SimdStamp newVectorStamp = improveVectorStamp (vectorStamp , args , VCLASS_ARG_INDEX , ECLASS_ARG_INDEX , LENGTH_ARG_INDEX , tool );
129
+ SimdStamp newVectorStamp = improveResultStamp (vectorStamp , args , tool );
125
130
if (newSpeciesStamp != speciesStamp || newVectorStamp != vectorStamp ) {
126
131
return new VectorAPICompressExpandOpNode (copyParamsWithImprovedStamp (newSpeciesStamp ), newVectorStamp , null , stateAfter ());
127
132
}
@@ -138,7 +143,7 @@ public boolean canExpand(VectorArchitecture vectorArch, EconomicMap<ValueNode, S
138
143
int opr = opr ().asJavaConstant ().asInt ();
139
144
GraalError .guarantee (opr == COMPRESS_OP || opr == EXPAND_OP || opr == MASK_COMPRESS_OP , "%d" , opr );
140
145
if (opr == MASK_COMPRESS_OP ) {
141
- return false ;
146
+ return elementStamp instanceof LogicValueStamp ;
142
147
} else {
143
148
return vectorArch .getSupportedVectorCompressExpandLength (elementStamp , vectorStamp .getVectorLength ()) == vectorStamp .getVectorLength ();
144
149
}
@@ -147,13 +152,18 @@ public boolean canExpand(VectorArchitecture vectorArch, EconomicMap<ValueNode, S
147
152
@ Override
148
153
public ValueNode expand (VectorArchitecture vectorArch , NodeMap <ValueNode > expanded ) {
149
154
int opr = opr ().asJavaConstant ().asInt ();
150
- ValueNode src = expanded .get (source ());
151
155
ValueNode mask = expanded .get (mask ());
152
156
if (opr == COMPRESS_OP ) {
157
+ ValueNode src = expanded .get (source ());
153
158
return SimdCompressNode .create (src , mask );
154
- } else {
155
- GraalError . guarantee ( opr == EXPAND_OP , "%d" , opr );
159
+ } else if ( opr == EXPAND_OP ) {
160
+ ValueNode src = expanded . get ( source () );
156
161
return SimdExpandNode .create (src , mask );
162
+ } else {
163
+ GraalError .guarantee (opr == MASK_COMPRESS_OP , "unexpected opcode %d" , opr );
164
+ ValueNode maskToInt = OpMaskToIntegerNode .create (mask );
165
+ ValueNode compressedInt = new CompressBitsNode (maskToInt , maskToInt );
166
+ return new IntegerToOpMaskNode (compressedInt , mask .stamp (NodeView .DEFAULT ).unrestricted ());
157
167
}
158
168
}
159
169
0 commit comments