@@ -4050,47 +4050,49 @@ GenTree* Lowering::LowerHWIntrinsicCndSel(GenTreeHWIntrinsic* cndSelNode)
4050
4050
GenTree* nestedOp1 = nestedCndSel->Op (1 );
4051
4051
GenTree* nestedOp2 = nestedCndSel->Op (2 );
4052
4052
assert (varTypeIsMask (nestedOp1));
4053
- assert (nestedOp2->OperIsHWIntrinsic ());
4054
4053
4055
- NamedIntrinsic nestedOp2Id = nestedOp2->AsHWIntrinsic ()->GetHWIntrinsicId ();
4056
-
4057
- // If the nested op uses Pg/Z, then inactive lanes will result in zeros, so can only transform if
4058
- // op3 is all zeros. Such a Csel operation is absorbed into the instruction when emitted. Skip this optimisation
4059
- // when the nestedOp is a reduce operation.
4060
-
4061
- if (nestedOp1->IsMaskAllBitsSet () && !HWIntrinsicInfo::IsReduceOperation (nestedOp2Id) &&
4062
- (!HWIntrinsicInfo::IsZeroingMaskedOperation (nestedOp2Id) || op3->IsVectorZero ()))
4054
+ if (nestedOp2->OperIsHWIntrinsic ())
4063
4055
{
4064
- GenTree* nestedOp2 = nestedCndSel->Op (2 );
4065
- GenTree* nestedOp3 = nestedCndSel->Op (3 );
4056
+ NamedIntrinsic nestedOp2Id = nestedOp2->AsHWIntrinsic ()->GetHWIntrinsicId ();
4066
4057
4067
- JITDUMP ( " lowering nested ConditionalSelect HWIntrinisic (before): \n " );
4068
- DISPTREERANGE ( BlockRange (), cndSelNode);
4069
- JITDUMP ( " \n " );
4058
+ // If the nested op uses Pg/Z, then inactive lanes will result in zeros, so can only transform if
4059
+ // op3 is all zeros. Such a Csel operation is absorbed into the instruction when emitted. Skip this
4060
+ // optimisation when the nestedOp is a reduce operation.
4070
4061
4071
- // Transform:
4072
- //
4073
- // CndSel(mask, CndSel(AllTrue, embeddedMask(trueValOp2), trueValOp3), op3) to
4074
- // CndSel(mask, embedded(trueValOp2), op3)
4075
- //
4076
- cndSelNode->Op (2 ) = nestedCndSel->Op (2 );
4077
- if (nestedOp3->IsMaskZero ())
4078
- {
4079
- BlockRange ().Remove (nestedOp3);
4080
- }
4081
- else
4062
+ if (nestedOp1->IsMaskAllBitsSet () && !HWIntrinsicInfo::IsReduceOperation (nestedOp2Id) &&
4063
+ (!HWIntrinsicInfo::IsZeroingMaskedOperation (nestedOp2Id) || op3->IsVectorZero ()))
4082
4064
{
4083
- nestedOp3->SetUnusedValue ();
4084
- }
4065
+ GenTree* nestedOp2 = nestedCndSel->Op (2 );
4066
+ GenTree* nestedOp3 = nestedCndSel->Op (3 );
4067
+
4068
+ JITDUMP (" lowering nested ConditionalSelect HWIntrinisic (before):\n " );
4069
+ DISPTREERANGE (BlockRange (), cndSelNode);
4070
+ JITDUMP (" \n " );
4071
+
4072
+ // Transform:
4073
+ //
4074
+ // CndSel(mask, CndSel(AllTrue, embeddedMask(trueValOp2), trueValOp3), op3) to
4075
+ // CndSel(mask, embedded(trueValOp2), op3)
4076
+ //
4077
+ cndSelNode->Op (2 ) = nestedCndSel->Op (2 );
4078
+ if (nestedOp3->IsMaskZero ())
4079
+ {
4080
+ BlockRange ().Remove (nestedOp3);
4081
+ }
4082
+ else
4083
+ {
4084
+ nestedOp3->SetUnusedValue ();
4085
+ }
4085
4086
4086
- BlockRange ().Remove (nestedOp1);
4087
- BlockRange ().Remove (nestedCndSel);
4087
+ BlockRange ().Remove (nestedOp1);
4088
+ BlockRange ().Remove (nestedCndSel);
4088
4089
4089
- JITDUMP (" lowering nested ConditionalSelect HWIntrinisic (after):\n " );
4090
- DISPTREERANGE (BlockRange (), cndSelNode);
4091
- JITDUMP (" \n " );
4090
+ JITDUMP (" lowering nested ConditionalSelect HWIntrinisic (after):\n " );
4091
+ DISPTREERANGE (BlockRange (), cndSelNode);
4092
+ JITDUMP (" \n " );
4092
4093
4093
- return cndSelNode;
4094
+ return cndSelNode;
4095
+ }
4094
4096
}
4095
4097
}
4096
4098
else if (op1->IsMaskAllBitsSet ())
0 commit comments