Skip to content

Commit 54a1631

Browse files
[LLVM][AArch64] Refactor lowering of fixed length integer setcc operations.
The original code is essentially performing isel during legalisation with the AArch64 specific nodes offering no additional value compared to ISD::SETCC. Whilst not the motivating case, the effect of removing the indirection means global-isel no longer misses out on the custom handling. If agreeable I hope to follow this with matching refactoring of the floating point based setcc operations.
1 parent 52de49e commit 54a1631

12 files changed

+186
-387
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 43 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -2057,6 +2057,15 @@ void AArch64TargetLowering::addTypeForNEON(MVT VT) {
20572057
setOperationAction(ISD::READ_REGISTER, MVT::i128, Custom);
20582058
setOperationAction(ISD::WRITE_REGISTER, MVT::i128, Custom);
20592059
}
2060+
2061+
if (VT.isInteger()) {
2062+
// Let common code emit inverted variants of compares we do support.
2063+
setCondCodeAction(ISD::SETNE, VT, Expand);
2064+
setCondCodeAction(ISD::SETLE, VT, Expand);
2065+
setCondCodeAction(ISD::SETLT, VT, Expand);
2066+
setCondCodeAction(ISD::SETULE, VT, Expand);
2067+
setCondCodeAction(ISD::SETULT, VT, Expand);
2068+
}
20602069
}
20612070

20622071
bool AArch64TargetLowering::shouldExpandGetActiveLaneMask(EVT ResVT,
@@ -2581,31 +2590,21 @@ unsigned AArch64TargetLowering::ComputeNumSignBitsForTargetNode(
25812590
unsigned VTBits = VT.getScalarSizeInBits();
25822591
unsigned Opcode = Op.getOpcode();
25832592
switch (Opcode) {
2584-
case AArch64ISD::CMEQ:
2585-
case AArch64ISD::CMGE:
2586-
case AArch64ISD::CMGT:
2587-
case AArch64ISD::CMHI:
2588-
case AArch64ISD::CMHS:
2589-
case AArch64ISD::FCMEQ:
2590-
case AArch64ISD::FCMGE:
2591-
case AArch64ISD::FCMGT:
2592-
case AArch64ISD::CMEQz:
2593-
case AArch64ISD::CMGEz:
2594-
case AArch64ISD::CMGTz:
2595-
case AArch64ISD::CMLEz:
2596-
case AArch64ISD::CMLTz:
2597-
case AArch64ISD::FCMEQz:
2598-
case AArch64ISD::FCMGEz:
2599-
case AArch64ISD::FCMGTz:
2600-
case AArch64ISD::FCMLEz:
2601-
case AArch64ISD::FCMLTz:
2602-
// Compares return either 0 or all-ones
2603-
return VTBits;
2604-
case AArch64ISD::VASHR: {
2605-
unsigned Tmp =
2606-
DAG.ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
2607-
return std::min<uint64_t>(Tmp + Op.getConstantOperandVal(1), VTBits);
2608-
}
2593+
case AArch64ISD::FCMEQ:
2594+
case AArch64ISD::FCMGE:
2595+
case AArch64ISD::FCMGT:
2596+
case AArch64ISD::FCMEQz:
2597+
case AArch64ISD::FCMGEz:
2598+
case AArch64ISD::FCMGTz:
2599+
case AArch64ISD::FCMLEz:
2600+
case AArch64ISD::FCMLTz:
2601+
// Compares return either 0 or all-ones
2602+
return VTBits;
2603+
case AArch64ISD::VASHR: {
2604+
unsigned Tmp =
2605+
DAG.ComputeNumSignBits(Op.getOperand(0), DemandedElts, Depth + 1);
2606+
return std::min<uint64_t>(Tmp + Op.getConstantOperandVal(1), VTBits);
2607+
}
26092608
}
26102609

26112610
return 1;
@@ -2812,19 +2811,9 @@ const char *AArch64TargetLowering::getTargetNodeName(unsigned Opcode) const {
28122811
MAKE_CASE(AArch64ISD::VASHR)
28132812
MAKE_CASE(AArch64ISD::VSLI)
28142813
MAKE_CASE(AArch64ISD::VSRI)
2815-
MAKE_CASE(AArch64ISD::CMEQ)
2816-
MAKE_CASE(AArch64ISD::CMGE)
2817-
MAKE_CASE(AArch64ISD::CMGT)
2818-
MAKE_CASE(AArch64ISD::CMHI)
2819-
MAKE_CASE(AArch64ISD::CMHS)
28202814
MAKE_CASE(AArch64ISD::FCMEQ)
28212815
MAKE_CASE(AArch64ISD::FCMGE)
28222816
MAKE_CASE(AArch64ISD::FCMGT)
2823-
MAKE_CASE(AArch64ISD::CMEQz)
2824-
MAKE_CASE(AArch64ISD::CMGEz)
2825-
MAKE_CASE(AArch64ISD::CMGTz)
2826-
MAKE_CASE(AArch64ISD::CMLEz)
2827-
MAKE_CASE(AArch64ISD::CMLTz)
28282817
MAKE_CASE(AArch64ISD::FCMEQz)
28292818
MAKE_CASE(AArch64ISD::FCMGEz)
28302819
MAKE_CASE(AArch64ISD::FCMGTz)
@@ -15814,9 +15803,6 @@ static SDValue EmitVectorComparison(SDValue LHS, SDValue RHS,
1581415803
SplatBitSize, HasAnyUndefs);
1581515804

1581615805
bool IsZero = IsCnst && SplatValue == 0;
15817-
bool IsOne =
15818-
IsCnst && SrcVT.getScalarSizeInBits() == SplatBitSize && SplatValue == 1;
15819-
bool IsMinusOne = IsCnst && SplatValue.isAllOnes();
1582015806

1582115807
if (SrcVT.getVectorElementType().isFloatingPoint()) {
1582215808
switch (CC) {
@@ -15863,50 +15849,7 @@ static SDValue EmitVectorComparison(SDValue LHS, SDValue RHS,
1586315849
}
1586415850
}
1586515851

15866-
switch (CC) {
15867-
default:
15868-
return SDValue();
15869-
case AArch64CC::NE: {
15870-
SDValue Cmeq;
15871-
if (IsZero)
15872-
Cmeq = DAG.getNode(AArch64ISD::CMEQz, dl, VT, LHS);
15873-
else
15874-
Cmeq = DAG.getNode(AArch64ISD::CMEQ, dl, VT, LHS, RHS);
15875-
return DAG.getNOT(dl, Cmeq, VT);
15876-
}
15877-
case AArch64CC::EQ:
15878-
if (IsZero)
15879-
return DAG.getNode(AArch64ISD::CMEQz, dl, VT, LHS);
15880-
return DAG.getNode(AArch64ISD::CMEQ, dl, VT, LHS, RHS);
15881-
case AArch64CC::GE:
15882-
if (IsZero)
15883-
return DAG.getNode(AArch64ISD::CMGEz, dl, VT, LHS);
15884-
return DAG.getNode(AArch64ISD::CMGE, dl, VT, LHS, RHS);
15885-
case AArch64CC::GT:
15886-
if (IsZero)
15887-
return DAG.getNode(AArch64ISD::CMGTz, dl, VT, LHS);
15888-
if (IsMinusOne)
15889-
return DAG.getNode(AArch64ISD::CMGEz, dl, VT, LHS);
15890-
return DAG.getNode(AArch64ISD::CMGT, dl, VT, LHS, RHS);
15891-
case AArch64CC::LE:
15892-
if (IsZero)
15893-
return DAG.getNode(AArch64ISD::CMLEz, dl, VT, LHS);
15894-
return DAG.getNode(AArch64ISD::CMGE, dl, VT, RHS, LHS);
15895-
case AArch64CC::LS:
15896-
return DAG.getNode(AArch64ISD::CMHS, dl, VT, RHS, LHS);
15897-
case AArch64CC::LO:
15898-
return DAG.getNode(AArch64ISD::CMHI, dl, VT, RHS, LHS);
15899-
case AArch64CC::LT:
15900-
if (IsZero)
15901-
return DAG.getNode(AArch64ISD::CMLTz, dl, VT, LHS);
15902-
if (IsOne)
15903-
return DAG.getNode(AArch64ISD::CMLEz, dl, VT, LHS);
15904-
return DAG.getNode(AArch64ISD::CMGT, dl, VT, RHS, LHS);
15905-
case AArch64CC::HI:
15906-
return DAG.getNode(AArch64ISD::CMHI, dl, VT, LHS, RHS);
15907-
case AArch64CC::HS:
15908-
return DAG.getNode(AArch64ISD::CMHS, dl, VT, LHS, RHS);
15909-
}
15852+
return SDValue();
1591015853
}
1591115854

1591215855
SDValue AArch64TargetLowering::LowerVSETCC(SDValue Op,
@@ -15927,9 +15870,11 @@ SDValue AArch64TargetLowering::LowerVSETCC(SDValue Op,
1592715870
if (LHS.getValueType().getVectorElementType().isInteger()) {
1592815871
assert(LHS.getValueType() == RHS.getValueType());
1592915872
AArch64CC::CondCode AArch64CC = changeIntCCToAArch64CC(CC);
15930-
SDValue Cmp =
15931-
EmitVectorComparison(LHS, RHS, AArch64CC, false, CmpVT, dl, DAG);
15932-
return DAG.getSExtOrTrunc(Cmp, dl, Op.getValueType());
15873+
if (SDValue Cmp =
15874+
EmitVectorComparison(LHS, RHS, AArch64CC, false, CmpVT, dl, DAG))
15875+
return DAG.getSExtOrTrunc(Cmp, dl, Op.getValueType());
15876+
15877+
return Op;
1593315878
}
1593415879

1593515880
// Lower isnan(x) | isnan(never-nan) to x != x.
@@ -18128,7 +18073,9 @@ static SDValue foldVectorXorShiftIntoCmp(SDNode *N, SelectionDAG &DAG,
1812818073
if (!ShiftAmt || ShiftAmt->getZExtValue() != ShiftEltTy.getSizeInBits() - 1)
1812918074
return SDValue();
1813018075

18131-
return DAG.getNode(AArch64ISD::CMGEz, SDLoc(N), VT, Shift.getOperand(0));
18076+
SDLoc DL(N);
18077+
SDValue Zero = DAG.getConstant(0, DL, Shift.getValueType());
18078+
return DAG.getSetCC(DL, VT, Shift.getOperand(0), Zero, ISD::SETGE);
1813218079
}
1813318080

1813418081
// Given a vecreduce_add node, detect the below pattern and convert it to the
@@ -18739,7 +18686,8 @@ static SDValue performMulVectorCmpZeroCombine(SDNode *N, SelectionDAG &DAG) {
1873918686

1874018687
SDLoc DL(N);
1874118688
SDValue In = DAG.getNode(AArch64ISD::NVCAST, DL, HalfVT, Srl.getOperand(0));
18742-
SDValue CM = DAG.getNode(AArch64ISD::CMLTz, DL, HalfVT, In);
18689+
SDValue Zero = DAG.getConstant(0, DL, In.getValueType());
18690+
SDValue CM = DAG.getSetCC(DL, HalfVT, Zero, In, ISD::SETGT);
1874318691
return DAG.getNode(AArch64ISD::NVCAST, DL, VT, CM);
1874418692
}
1874518693

@@ -25268,6 +25216,14 @@ static SDValue performSETCCCombine(SDNode *N,
2526825216
if (SDValue V = performOrXorChainCombine(N, DAG))
2526925217
return V;
2527025218

25219+
EVT CmpVT = LHS.getValueType();
25220+
25221+
APInt SplatLHSVal;
25222+
if (CmpVT.isInteger() && Cond == ISD::SETGT &&
25223+
ISD::isConstantSplatVector(LHS.getNode(), SplatLHSVal) &&
25224+
SplatLHSVal.isOne())
25225+
return DAG.getSetCC(DL, VT, DAG.getConstant(0, DL, CmpVT), RHS, ISD::SETGE);
25226+
2527125227
return SDValue();
2527225228
}
2527325229

llvm/lib/Target/AArch64/AArch64ISelLowering.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -241,21 +241,11 @@ enum NodeType : unsigned {
241241
VSRI,
242242

243243
// Vector comparisons
244-
CMEQ,
245-
CMGE,
246-
CMGT,
247-
CMHI,
248-
CMHS,
249244
FCMEQ,
250245
FCMGE,
251246
FCMGT,
252247

253248
// Vector zero comparisons
254-
CMEQz,
255-
CMGEz,
256-
CMGTz,
257-
CMLEz,
258-
CMLTz,
259249
FCMEQz,
260250
FCMGEz,
261251
FCMGTz,

llvm/lib/Target/AArch64/AArch64InstrFormats.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7086,7 +7086,7 @@ multiclass SIMD_FP8_CVTL<bits<2>sz, string asm, ValueType dty, SDPatternOperator
70867086
class BaseSIMDCmpTwoVector<bit Q, bit U, bits<2> size, bits<2> size2,
70877087
bits<5> opcode, RegisterOperand regtype, string asm,
70887088
string kind, string zero, ValueType dty,
7089-
ValueType sty, SDNode OpNode>
7089+
ValueType sty, SDPatternOperator OpNode>
70907090
: I<(outs regtype:$Rd), (ins regtype:$Rn), asm,
70917091
"{\t$Rd" # kind # ", $Rn" # kind # ", #" # zero #
70927092
"|" # kind # "\t$Rd, $Rn, #" # zero # "}", "",
@@ -7110,7 +7110,7 @@ class BaseSIMDCmpTwoVector<bit Q, bit U, bits<2> size, bits<2> size2,
71107110

71117111
// Comparisons support all element sizes, except 1xD.
71127112
multiclass SIMDCmpTwoVector<bit U, bits<5> opc, string asm,
7113-
SDNode OpNode> {
7113+
SDPatternOperator OpNode> {
71147114
def v8i8rz : BaseSIMDCmpTwoVector<0, U, 0b00, 0b00, opc, V64,
71157115
asm, ".8b", "0",
71167116
v8i8, v8i8, OpNode>;
@@ -7981,7 +7981,7 @@ multiclass SIMDCmpTwoScalarD<bit U, bits<5> opc, string asm,
79817981
SDPatternOperator OpNode> {
79827982
def v1i64rz : BaseSIMDCmpTwoScalar<U, 0b11, 0b00, opc, FPR64, asm, "0">;
79837983

7984-
def : Pat<(v1i64 (OpNode FPR64:$Rn)),
7984+
def : Pat<(v1i64 (OpNode v1i64:$Rn)),
79857985
(!cast<Instruction>(NAME # v1i64rz) FPR64:$Rn)>;
79867986
}
79877987

llvm/lib/Target/AArch64/AArch64InstrInfo.td

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -846,23 +846,35 @@ def AArch64vsri : SDNode<"AArch64ISD::VSRI", SDT_AArch64vshiftinsert>;
846846

847847
def AArch64bsp: SDNode<"AArch64ISD::BSP", SDT_AArch64trivec>;
848848

849-
def AArch64cmeq: SDNode<"AArch64ISD::CMEQ", SDT_AArch64binvec>;
850-
def AArch64cmge: SDNode<"AArch64ISD::CMGE", SDT_AArch64binvec>;
851-
def AArch64cmgt: SDNode<"AArch64ISD::CMGT", SDT_AArch64binvec>;
852-
def AArch64cmhi: SDNode<"AArch64ISD::CMHI", SDT_AArch64binvec>;
853-
def AArch64cmhs: SDNode<"AArch64ISD::CMHS", SDT_AArch64binvec>;
849+
def AArch64cmeq : PatFrag<(ops node:$lhs, node:$rhs),
850+
(setcc node:$lhs, node:$rhs, SETEQ)>;
851+
def AArch64cmge : PatFrag<(ops node:$lhs, node:$rhs),
852+
(setcc node:$lhs, node:$rhs, SETGE)>;
853+
def AArch64cmgt : PatFrag<(ops node:$lhs, node:$rhs),
854+
(setcc node:$lhs, node:$rhs, SETGT)>;
855+
def AArch64cmhi : PatFrag<(ops node:$lhs, node:$rhs),
856+
(setcc node:$lhs, node:$rhs, SETUGT)>;
857+
def AArch64cmhs : PatFrag<(ops node:$lhs, node:$rhs),
858+
(setcc node:$lhs, node:$rhs, SETUGE)>;
854859

855860
def AArch64fcmeq: SDNode<"AArch64ISD::FCMEQ", SDT_AArch64fcmp>;
856861
def AArch64fcmge: SDNode<"AArch64ISD::FCMGE", SDT_AArch64fcmp>;
857862
def AArch64fcmgt: SDNode<"AArch64ISD::FCMGT", SDT_AArch64fcmp>;
858863

859-
def AArch64cmeqz: SDNode<"AArch64ISD::CMEQz", SDT_AArch64unvec>;
860-
def AArch64cmgez: SDNode<"AArch64ISD::CMGEz", SDT_AArch64unvec>;
861-
def AArch64cmgtz: SDNode<"AArch64ISD::CMGTz", SDT_AArch64unvec>;
862-
def AArch64cmlez: SDNode<"AArch64ISD::CMLEz", SDT_AArch64unvec>;
863-
def AArch64cmltz: SDNode<"AArch64ISD::CMLTz", SDT_AArch64unvec>;
864+
def AArch64cmeqz : PatFrag<(ops node:$lhs),
865+
(setcc node:$lhs, immAllZerosV, SETEQ)>;
866+
def AArch64cmgez : PatFrags<(ops node:$lhs),
867+
[(setcc node:$lhs, immAllZerosV, SETGE),
868+
(setcc node:$lhs, immAllOnesV, SETGT)]>;
869+
def AArch64cmgtz : PatFrag<(ops node:$lhs),
870+
(setcc node:$lhs, immAllZerosV, SETGT)>;
871+
def AArch64cmlez : PatFrag<(ops node:$lhs),
872+
(setcc immAllZerosV, node:$lhs, SETGE)>;
873+
def AArch64cmltz : PatFrag<(ops node:$lhs),
874+
(setcc immAllZerosV, node:$lhs, SETGT)>;
875+
864876
def AArch64cmtst : PatFrag<(ops node:$LHS, node:$RHS),
865-
(vnot (AArch64cmeqz (and node:$LHS, node:$RHS)))>;
877+
(vnot (AArch64cmeqz (and node:$LHS, node:$RHS)))>;
866878

867879
def AArch64fcmeqz: SDNode<"AArch64ISD::FCMEQz", SDT_AArch64fcmpz>;
868880
def AArch64fcmgez: SDNode<"AArch64ISD::FCMGEz", SDT_AArch64fcmpz>;
@@ -5671,7 +5683,7 @@ defm CMHI : SIMDThreeSameVector<1, 0b00110, "cmhi", AArch64cmhi>;
56715683
defm CMHS : SIMDThreeSameVector<1, 0b00111, "cmhs", AArch64cmhs>;
56725684
defm CMTST : SIMDThreeSameVector<0, 0b10001, "cmtst", AArch64cmtst>;
56735685
foreach VT = [ v8i8, v16i8, v4i16, v8i16, v2i32, v4i32, v2i64 ] in {
5674-
def : Pat<(vnot (AArch64cmeqz VT:$Rn)), (!cast<Instruction>("CMTST"#VT) VT:$Rn, VT:$Rn)>;
5686+
def : Pat<(VT (vnot (AArch64cmeqz VT:$Rn))), (!cast<Instruction>("CMTST"#VT) VT:$Rn, VT:$Rn)>;
56755687
}
56765688
defm FABD : SIMDThreeSameVectorFP<1,1,0b010,"fabd", int_aarch64_neon_fabd>;
56775689
let Predicates = [HasNEON] in {

llvm/test/CodeGen/AArch64/aarch64-dup-ext.ll

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -352,17 +352,16 @@ define void @typei1_orig(i64 %a, ptr %p, ptr %q) {
352352
;
353353
; CHECK-GI-LABEL: typei1_orig:
354354
; CHECK-GI: // %bb.0:
355-
; CHECK-GI-NEXT: ldr q1, [x2]
355+
; CHECK-GI-NEXT: ldr q0, [x2]
356356
; CHECK-GI-NEXT: cmp x0, #0
357-
; CHECK-GI-NEXT: movi v0.2d, #0xffffffffffffffff
358357
; CHECK-GI-NEXT: cset w8, gt
359-
; CHECK-GI-NEXT: neg v1.8h, v1.8h
360-
; CHECK-GI-NEXT: dup v2.8h, w8
361-
; CHECK-GI-NEXT: mvn v0.16b, v0.16b
362-
; CHECK-GI-NEXT: mul v1.8h, v1.8h, v2.8h
363-
; CHECK-GI-NEXT: cmeq v1.8h, v1.8h, #0
358+
; CHECK-GI-NEXT: neg v0.8h, v0.8h
359+
; CHECK-GI-NEXT: dup v1.8h, w8
360+
; CHECK-GI-NEXT: mul v0.8h, v0.8h, v1.8h
361+
; CHECK-GI-NEXT: movi v1.2d, #0xffffffffffffffff
362+
; CHECK-GI-NEXT: cmtst v0.8h, v0.8h, v0.8h
364363
; CHECK-GI-NEXT: mvn v1.16b, v1.16b
365-
; CHECK-GI-NEXT: uzp1 v0.16b, v1.16b, v0.16b
364+
; CHECK-GI-NEXT: uzp1 v0.16b, v0.16b, v1.16b
366365
; CHECK-GI-NEXT: shl v0.16b, v0.16b, #7
367366
; CHECK-GI-NEXT: sshr v0.16b, v0.16b, #7
368367
; CHECK-GI-NEXT: str q0, [x1]

llvm/test/CodeGen/AArch64/fptosi-sat-vector.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2382,11 +2382,11 @@ define <2 x i1> @test_signed_v2f64_v2i1(<2 x double> %f) {
23822382
; CHECK-GI-LABEL: test_signed_v2f64_v2i1:
23832383
; CHECK-GI: // %bb.0:
23842384
; CHECK-GI-NEXT: fcvtzs v0.2d, v0.2d
2385-
; CHECK-GI-NEXT: movi v2.2d, #0xffffffffffffffff
23862385
; CHECK-GI-NEXT: cmlt v1.2d, v0.2d, #0
23872386
; CHECK-GI-NEXT: and v0.16b, v0.16b, v1.16b
2388-
; CHECK-GI-NEXT: cmgt v1.2d, v0.2d, v2.2d
2389-
; CHECK-GI-NEXT: bif v0.16b, v2.16b, v1.16b
2387+
; CHECK-GI-NEXT: movi v1.2d, #0xffffffffffffffff
2388+
; CHECK-GI-NEXT: cmge v2.2d, v0.2d, #0
2389+
; CHECK-GI-NEXT: bif v0.16b, v1.16b, v2.16b
23902390
; CHECK-GI-NEXT: xtn v0.2s, v0.2d
23912391
; CHECK-GI-NEXT: ret
23922392
%x = call <2 x i1> @llvm.fptosi.sat.v2f64.v2i1(<2 x double> %f)

llvm/test/CodeGen/AArch64/neon-bitwise-instructions.ll

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,8 +1499,7 @@ define <8 x i8> @vselect_cmpz_ne(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) {
14991499
;
15001500
; CHECK-GI-LABEL: vselect_cmpz_ne:
15011501
; CHECK-GI: // %bb.0:
1502-
; CHECK-GI-NEXT: cmeq v0.8b, v0.8b, #0
1503-
; CHECK-GI-NEXT: mvn v0.8b, v0.8b
1502+
; CHECK-GI-NEXT: cmtst v0.8b, v0.8b, v0.8b
15041503
; CHECK-GI-NEXT: bsl v0.8b, v1.8b, v2.8b
15051504
; CHECK-GI-NEXT: ret
15061505
%cmp = icmp ne <8 x i8> %a, zeroinitializer
@@ -1533,17 +1532,10 @@ define <8 x i8> @vselect_tst(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) {
15331532
}
15341533

15351534
define <8 x i8> @sext_tst(<8 x i8> %a, <8 x i8> %b, <8 x i8> %c) {
1536-
; CHECK-SD-LABEL: sext_tst:
1537-
; CHECK-SD: // %bb.0:
1538-
; CHECK-SD-NEXT: cmtst v0.8b, v0.8b, v1.8b
1539-
; CHECK-SD-NEXT: ret
1540-
;
1541-
; CHECK-GI-LABEL: sext_tst:
1542-
; CHECK-GI: // %bb.0:
1543-
; CHECK-GI-NEXT: and v0.8b, v0.8b, v1.8b
1544-
; CHECK-GI-NEXT: cmeq v0.8b, v0.8b, #0
1545-
; CHECK-GI-NEXT: mvn v0.8b, v0.8b
1546-
; CHECK-GI-NEXT: ret
1535+
; CHECK-LABEL: sext_tst:
1536+
; CHECK: // %bb.0:
1537+
; CHECK-NEXT: cmtst v0.8b, v0.8b, v1.8b
1538+
; CHECK-NEXT: ret
15471539
%tmp3 = and <8 x i8> %a, %b
15481540
%tmp4 = icmp ne <8 x i8> %tmp3, zeroinitializer
15491541
%d = sext <8 x i1> %tmp4 to <8 x i8>

0 commit comments

Comments
 (0)