Skip to content

Commit 2a24e6b

Browse files
committed
Revert "[InstCombine] Always try to invert non-canonical predicate of an icmp"
This reverts commit c3b8bd1. Alse adjust a couple of Clang LIT tests. Signed-off-by: Alexey Sotkin <[email protected]>
1 parent 30b8acc commit 2a24e6b

File tree

14 files changed

+273
-304
lines changed

14 files changed

+273
-304
lines changed

clang/test/CodeGen/thinlto-distributed-cfi-devirt.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ cont2:
9393
; CHECK-IR: br i1 {{.*}}, label %trap
9494

9595
; We still have to call it as virtual.
96-
; CHECK-IR: %call3 = tail call i32 %7
96+
; CHECK-IR: %call3 = tail call i32 %8
9797
%call3 = tail call i32 %8(%struct.A* nonnull %obj, i32 %call)
9898
ret i32 %call3
9999
}

clang/test/CodeGenOpenCL/convergent.cl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,10 @@ void test_merge_if(int a) {
5959
// CHECK-DAG: declare spir_func void @f() local_unnamed_addr #2
6060
// CHECK-DAG: declare spir_func void @g() local_unnamed_addr #2
6161

62-
6362
// Test two if's are not merged.
6463
// CHECK-LABEL: define spir_func void @test_no_merge_if(i32 %a) local_unnamed_addr #1
65-
// CHECK: %[[tobool:.+]] = icmp eq i32 %a, 0
66-
// CHECK: br i1 %[[tobool]], label %[[if_end:.+]], label %[[if_then:.+]]
64+
// CHECK: %[[tobool:.+]] = icmp ne i32 %a, 0
65+
// CHECK: br i1 %[[tobool]], label %[[if_then:.+]], label %[[if_end:.+]]
6766
// CHECK: [[if_then]]:
6867
// CHECK: tail call spir_func void @f()
6968
// CHECK-NOT: call spir_func void @convfun()
@@ -72,7 +71,7 @@ void test_merge_if(int a) {
7271
// CHECK: [[if_end]]:
7372
// CHECK-NOT: phi i1
7473
// CHECK: tail call spir_func void @convfun() #[[attr4:.+]]
75-
// CHECK: br i1 %[[tobool]], label %[[if_end3:.+]], label %[[if_then2:.+]]
74+
// CHECK: br i1 %[[tobool]], label %[[if_then2:.+]], label %[[if_end3:.+]]
7675
// CHECK: [[if_then2]]:
7776
// CHECK: tail call spir_func void @g()
7877
// CHECK: br label %[[if_end3:.+]]

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 2 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -5304,47 +5304,6 @@ static ICmpInst *canonicalizeCmpWithConstant(ICmpInst &I) {
53045304
return new ICmpInst(FlippedStrictness->first, Op0, FlippedStrictness->second);
53055305
}
53065306

5307-
/// If we have a comparison with a non-canonical predicate, if we can update
5308-
/// all the users, invert the predicate and adjust all the users.
5309-
static CmpInst *canonicalizeICmpPredicate(CmpInst &I) {
5310-
// Is the predicate already canonical?
5311-
CmpInst::Predicate Pred = I.getPredicate();
5312-
if (InstCombiner::isCanonicalPredicate(Pred))
5313-
return nullptr;
5314-
5315-
// Can all users be adjusted to predicate inversion?
5316-
if (!InstCombiner::canFreelyInvertAllUsersOf(&I, /*IgnoredUser=*/nullptr))
5317-
return nullptr;
5318-
5319-
// Ok, we can canonicalize comparison!
5320-
// Let's first invert the comparison's predicate.
5321-
I.setPredicate(CmpInst::getInversePredicate(Pred));
5322-
I.setName(I.getName() + ".not");
5323-
5324-
// And now let's adjust every user.
5325-
for (User *U : I.users()) {
5326-
switch (cast<Instruction>(U)->getOpcode()) {
5327-
case Instruction::Select: {
5328-
auto *SI = cast<SelectInst>(U);
5329-
SI->swapValues();
5330-
SI->swapProfMetadata();
5331-
break;
5332-
}
5333-
case Instruction::Br:
5334-
cast<BranchInst>(U)->swapSuccessors(); // swaps prof metadata too
5335-
break;
5336-
case Instruction::Xor:
5337-
U->replaceAllUsesWith(&I);
5338-
break;
5339-
default:
5340-
llvm_unreachable("Got unexpected user - out of sync with "
5341-
"canFreelyInvertAllUsersOf() ?");
5342-
}
5343-
}
5344-
5345-
return &I;
5346-
}
5347-
53485307
/// Integer compare with boolean values can always be turned into bitwise ops.
53495308
static Instruction *canonicalizeICmpBool(ICmpInst &I,
53505309
InstCombiner::BuilderTy &Builder) {
@@ -5583,11 +5542,8 @@ Instruction *InstCombinerImpl::visitICmpInst(ICmpInst &I) {
55835542
if (Instruction *Res = canonicalizeICmpBool(I, Builder))
55845543
return Res;
55855544

5586-
if (Instruction *Res = canonicalizeCmpWithConstant(I))
5587-
return Res;
5588-
5589-
if (Instruction *Res = canonicalizeICmpPredicate(I))
5590-
return Res;
5545+
if (ICmpInst *NewICmp = canonicalizeCmpWithConstant(I))
5546+
return NewICmp;
55915547

55925548
if (Instruction *Res = foldICmpWithConstant(I))
55935549
return Res;

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2584,7 +2584,21 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
25842584
if (Instruction *I = canonicalizeScalarSelectOfVecs(SI, *this))
25852585
return I;
25862586

2587+
// Canonicalize a one-use integer compare with a non-canonical predicate by
2588+
// inverting the predicate and swapping the select operands. This matches a
2589+
// compare canonicalization for conditional branches.
2590+
// TODO: Should we do the same for FP compares?
25872591
CmpInst::Predicate Pred;
2592+
if (match(CondVal, m_OneUse(m_ICmp(Pred, m_Value(), m_Value()))) &&
2593+
!isCanonicalPredicate(Pred)) {
2594+
// Swap true/false values and condition.
2595+
CmpInst *Cond = cast<CmpInst>(CondVal);
2596+
Cond->setPredicate(CmpInst::getInversePredicate(Pred));
2597+
SI.swapValues();
2598+
SI.swapProfMetadata();
2599+
Worklist.push(Cond);
2600+
return &SI;
2601+
}
25882602

25892603
if (SelType->isIntOrIntVectorTy(1) &&
25902604
TrueVal->getType() == CondVal->getType()) {

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2843,9 +2843,9 @@ Instruction *InstCombinerImpl::visitBranchInst(BranchInst &BI) {
28432843
return replaceOperand(
28442844
BI, 0, ConstantInt::getFalse(BI.getCondition()->getType()));
28452845

2846-
// Canonicalize, for example, fcmp_one -> fcmp_oeq.
2846+
// Canonicalize, for example, icmp_ne -> icmp_eq or fcmp_one -> fcmp_oeq.
28472847
CmpInst::Predicate Pred;
2848-
if (match(&BI, m_Br(m_OneUse(m_FCmp(Pred, m_Value(), m_Value())),
2848+
if (match(&BI, m_Br(m_OneUse(m_Cmp(Pred, m_Value(), m_Value())),
28492849
m_BasicBlock(), m_BasicBlock())) &&
28502850
!isCanonicalPredicate(Pred)) {
28512851
// Swap destinations and condition.

llvm/test/ThinLTO/X86/cfi-devirt.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,10 @@ cont2:
110110

111111
; Check that traps are conditional. Invalid TYPE_ID can cause
112112
; unconditional traps.
113-
; CHECK-IR: br i1 {{.*}}, label %trap, label %cont2
113+
; CHECK-IR: br i1 {{.*}}, label %trap
114114

115115
; We still have to call it as virtual.
116-
; CHECK-IR: %call3 = tail call i32 %7
116+
; CHECK-IR: %call3 = tail call i32 %8
117117
%call3 = tail call i32 %8(%struct.A* nonnull %obj, i32 %call)
118118
ret i32 %call3
119119
}

llvm/test/Transforms/InstCombine/canonicalize-selects-icmp-condition-bittest.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ declare void @use1(i1)
88
define i8 @p0(i8 %x, i8 %v0, i8 %v1) {
99
; CHECK-LABEL: @p0(
1010
; CHECK-NEXT: [[T0:%.*]] = and i8 [[X:%.*]], 1
11-
; CHECK-NEXT: [[T1_NOT:%.*]] = icmp eq i8 [[T0]], 0
12-
; CHECK-NEXT: [[R:%.*]] = select i1 [[T1_NOT]], i8 [[V1:%.*]], i8 [[V0:%.*]], !prof !0
11+
; CHECK-NEXT: [[T1:%.*]] = icmp eq i8 [[T0]], 0
12+
; CHECK-NEXT: [[R:%.*]] = select i1 [[T1]], i8 [[V1:%.*]], i8 [[V0:%.*]], !prof !0
1313
; CHECK-NEXT: ret i8 [[R]]
1414
;
1515
%t0 = and i8 %x, 1
@@ -20,8 +20,8 @@ define i8 @p0(i8 %x, i8 %v0, i8 %v1) {
2020
define i8 @p1(i8 %x, i8 %v0, i8 %v1) {
2121
; CHECK-LABEL: @p1(
2222
; CHECK-NEXT: [[T0:%.*]] = and i8 [[X:%.*]], 1
23-
; CHECK-NEXT: [[T1_NOT:%.*]] = icmp eq i8 [[T0]], 0
24-
; CHECK-NEXT: [[R:%.*]] = select i1 [[T1_NOT]], i8 [[V1:%.*]], i8 [[V0:%.*]]
23+
; CHECK-NEXT: [[T1:%.*]] = icmp eq i8 [[T0]], 0
24+
; CHECK-NEXT: [[R:%.*]] = select i1 [[T1]], i8 [[V1:%.*]], i8 [[V0:%.*]]
2525
; CHECK-NEXT: ret i8 [[R]]
2626
;
2727
%t0 = and i8 %x, 1
@@ -51,14 +51,14 @@ define i8 @t3(i8 %x, i8 %v0, i8 %v1, i8 %v2, i8 %v3, i8* %out, i1 %c) {
5151
; CHECK-LABEL: @t3(
5252
; CHECK-NEXT: bb0:
5353
; CHECK-NEXT: [[T0:%.*]] = and i8 [[X:%.*]], 1
54-
; CHECK-NEXT: [[T1_NOT:%.*]] = icmp eq i8 [[T0]], 0
54+
; CHECK-NEXT: [[T1:%.*]] = icmp ne i8 [[T0]], 0
5555
; CHECK-NEXT: br i1 [[C:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
5656
; CHECK: bb1:
57-
; CHECK-NEXT: [[R0:%.*]] = select i1 [[T1_NOT]], i8 [[V1:%.*]], i8 [[V0:%.*]]
57+
; CHECK-NEXT: [[R0:%.*]] = select i1 [[T1]], i8 [[V0:%.*]], i8 [[V1:%.*]]
5858
; CHECK-NEXT: store i8 [[R0]], i8* [[OUT:%.*]], align 1
5959
; CHECK-NEXT: br label [[BB2]]
6060
; CHECK: bb2:
61-
; CHECK-NEXT: [[R1:%.*]] = select i1 [[T1_NOT]], i8 [[V3:%.*]], i8 [[V2:%.*]]
61+
; CHECK-NEXT: [[R1:%.*]] = select i1 [[T1]], i8 [[V2:%.*]], i8 [[V3:%.*]]
6262
; CHECK-NEXT: ret i8 [[R1]]
6363
;
6464
bb0:
@@ -76,10 +76,10 @@ bb2:
7676
define i8 @t4(i8 %x, i8 %v0, i8 %v1, i8 %v2, i8 %v3, i8* %out) {
7777
; CHECK-LABEL: @t4(
7878
; CHECK-NEXT: [[T0:%.*]] = and i8 [[X:%.*]], 1
79-
; CHECK-NEXT: [[T1_NOT:%.*]] = icmp eq i8 [[T0]], 0
80-
; CHECK-NEXT: [[R0:%.*]] = select i1 [[T1_NOT]], i8 [[V1:%.*]], i8 [[V0:%.*]]
79+
; CHECK-NEXT: [[T1:%.*]] = icmp ne i8 [[T0]], 0
80+
; CHECK-NEXT: [[R0:%.*]] = select i1 [[T1]], i8 [[V0:%.*]], i8 [[V1:%.*]]
8181
; CHECK-NEXT: store i8 [[R0]], i8* [[OUT:%.*]], align 1
82-
; CHECK-NEXT: [[R1:%.*]] = select i1 [[T1_NOT]], i8 [[V3:%.*]], i8 [[V2:%.*]]
82+
; CHECK-NEXT: [[R1:%.*]] = select i1 [[T1]], i8 [[V2:%.*]], i8 [[V3:%.*]]
8383
; CHECK-NEXT: ret i8 [[R1]]
8484
;
8585
%t0 = and i8 %x, 1
@@ -112,8 +112,8 @@ define i8 @n6(i8 %x, i8 %v0, i8 %v1) {
112112
define i8 @n7(i8 %x, i8 %v0, i8 %v1) {
113113
; CHECK-LABEL: @n7(
114114
; CHECK-NEXT: [[T0:%.*]] = and i8 [[X:%.*]], 1
115-
; CHECK-NEXT: [[T1_NOT_NOT:%.*]] = icmp eq i8 [[T0]], 0
116-
; CHECK-NEXT: [[R:%.*]] = select i1 [[T1_NOT_NOT]], i8 [[V0:%.*]], i8 [[V1:%.*]]
115+
; CHECK-NEXT: [[T1:%.*]] = icmp eq i8 [[T0]], 0
116+
; CHECK-NEXT: [[R:%.*]] = select i1 [[T1]], i8 [[V0:%.*]], i8 [[V1:%.*]]
117117
; CHECK-NEXT: ret i8 [[R]]
118118
;
119119
%t0 = and i8 %x, 1

llvm/test/Transforms/InstCombine/icmp-mul-zext.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,16 @@ define i32 @sterix(i32, i8, i64) {
1313
; CHECK-NEXT: [[SHR:%.*]] = lshr i32 [[MUL]], [[SH_PROM]]
1414
; CHECK-NEXT: [[CONV2:%.*]] = zext i32 [[SHR]] to i64
1515
; CHECK-NEXT: [[MUL3:%.*]] = mul nuw nsw i64 [[CONV]], [[CONV2]]
16-
; CHECK-NEXT: [[TMP3:%.*]] = icmp ult i64 [[MUL3]], 4294967296
17-
; CHECK-NEXT: br i1 [[TMP3]], label [[LOR_RHS:%.*]], label [[LOR_END:%.*]]
16+
; CHECK-NEXT: [[TMP3:%.*]] = icmp ugt i64 [[MUL3]], 4294967295
17+
; CHECK-NEXT: br i1 [[TMP3]], label [[LOR_END:%.*]], label [[LOR_RHS:%.*]]
1818
; CHECK: lor.rhs:
1919
; CHECK-NEXT: [[AND:%.*]] = and i64 [[MUL3]], [[TMP2]]
2020
; CHECK-NEXT: [[CONV4:%.*]] = trunc i64 [[AND]] to i32
21-
; CHECK-NEXT: [[TOBOOL7_NOT:%.*]] = icmp eq i32 [[CONV4]], 0
22-
; CHECK-NEXT: [[PHITMP:%.*]] = zext i1 [[TOBOOL7_NOT]] to i32
21+
; CHECK-NEXT: [[TOBOOL7:%.*]] = icmp eq i32 [[CONV4]], 0
22+
; CHECK-NEXT: [[PHI_CAST:%.*]] = zext i1 [[TOBOOL7]] to i32
2323
; CHECK-NEXT: br label [[LOR_END]]
2424
; CHECK: lor.end:
25-
; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ [[PHITMP]], [[LOR_RHS]] ]
25+
; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ [[PHI_CAST]], [[LOR_RHS]] ]
2626
; CHECK-NEXT: ret i32 [[TMP4]]
2727
;
2828
entry:

llvm/test/Transforms/InstCombine/logical-select.ll

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ define i32 @foo(i32 %a, i32 %b, i32 %c, i32 %d) {
1919

2020
define i32 @bar(i32 %a, i32 %b, i32 %c, i32 %d) {
2121
; CHECK-LABEL: @bar(
22-
; CHECK-NEXT: [[E_NOT:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
23-
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[E_NOT]], i32 [[C:%.*]], i32 [[D:%.*]]
22+
; CHECK-NEXT: [[E:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
23+
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[E]], i32 [[C:%.*]], i32 [[D:%.*]]
2424
; CHECK-NEXT: ret i32 [[TMP1]]
2525
;
2626
%e = icmp slt i32 %a, %b
@@ -69,8 +69,8 @@ define i32 @fold_inverted_icmp_preds(i32 %a, i32 %b, i32 %c, i32 %d) {
6969
; CHECK-LABEL: @fold_inverted_icmp_preds(
7070
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
7171
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i32 [[C:%.*]], i32 0
72-
; CHECK-NEXT: [[CMP2_NOT:%.*]] = icmp slt i32 [[A]], [[B]]
73-
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP2_NOT]], i32 0, i32 [[D:%.*]]
72+
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[A]], [[B]]
73+
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP2]], i32 0, i32 [[D:%.*]]
7474
; CHECK-NEXT: [[OR:%.*]] = or i32 [[SEL1]], [[SEL2]]
7575
; CHECK-NEXT: ret i32 [[OR]]
7676
;
@@ -88,8 +88,8 @@ define i32 @fold_inverted_icmp_preds_reverse(i32 %a, i32 %b, i32 %c, i32 %d) {
8888
; CHECK-LABEL: @fold_inverted_icmp_preds_reverse(
8989
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
9090
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP1]], i32 0, i32 [[C:%.*]]
91-
; CHECK-NEXT: [[CMP2_NOT:%.*]] = icmp slt i32 [[A]], [[B]]
92-
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP2_NOT]], i32 [[D:%.*]], i32 0
91+
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[A]], [[B]]
92+
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP2]], i32 [[D:%.*]], i32 0
9393
; CHECK-NEXT: [[OR:%.*]] = or i32 [[SEL1]], [[SEL2]]
9494
; CHECK-NEXT: ret i32 [[OR]]
9595
;
@@ -124,8 +124,8 @@ define i32 @fold_inverted_fcmp_preds(float %a, float %b, i32 %c, i32 %d) {
124124

125125
define <2 x i32> @fold_inverted_icmp_vector_preds(<2 x i32> %a, <2 x i32> %b, <2 x i32> %c, <2 x i32> %d) {
126126
; CHECK-LABEL: @fold_inverted_icmp_vector_preds(
127-
; CHECK-NEXT: [[CMP1_NOT:%.*]] = icmp eq <2 x i32> [[A:%.*]], [[B:%.*]]
128-
; CHECK-NEXT: [[SEL1:%.*]] = select <2 x i1> [[CMP1_NOT]], <2 x i32> zeroinitializer, <2 x i32> [[C:%.*]]
127+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq <2 x i32> [[A:%.*]], [[B:%.*]]
128+
; CHECK-NEXT: [[SEL1:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> zeroinitializer, <2 x i32> [[C:%.*]]
129129
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq <2 x i32> [[A]], [[B]]
130130
; CHECK-NEXT: [[SEL2:%.*]] = select <2 x i1> [[CMP2]], <2 x i32> [[D:%.*]], <2 x i32> zeroinitializer
131131
; CHECK-NEXT: [[OR:%.*]] = or <2 x i32> [[SEL1]], [[SEL2]]
@@ -535,9 +535,9 @@ define <4 x i32> @vec_sel_xor_multi_use(<4 x i32> %a, <4 x i32> %b, <4 x i1> %c)
535535

536536
define i32 @allSignBits(i32 %cond, i32 %tval, i32 %fval) {
537537
; CHECK-LABEL: @allSignBits(
538-
; CHECK-NEXT: [[DOTNOT:%.*]] = icmp slt i32 [[COND:%.*]], 0
539-
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[DOTNOT]], i32 [[TVAL:%.*]], i32 [[FVAL:%.*]]
540-
; CHECK-NEXT: ret i32 [[TMP1]]
538+
; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 [[COND:%.*]], -1
539+
; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i32 [[FVAL:%.*]], i32 [[TVAL:%.*]]
540+
; CHECK-NEXT: ret i32 [[TMP2]]
541541
;
542542
%bitmask = ashr i32 %cond, 31
543543
%not_bitmask = xor i32 %bitmask, -1
@@ -549,9 +549,9 @@ define i32 @allSignBits(i32 %cond, i32 %tval, i32 %fval) {
549549

550550
define <4 x i8> @allSignBits_vec(<4 x i8> %cond, <4 x i8> %tval, <4 x i8> %fval) {
551551
; CHECK-LABEL: @allSignBits_vec(
552-
; CHECK-NEXT: [[DOTNOT:%.*]] = icmp sgt <4 x i8> [[COND:%.*]], <i8 -1, i8 -1, i8 -1, i8 -1>
553-
; CHECK-NEXT: [[TMP1:%.*]] = select <4 x i1> [[DOTNOT]], <4 x i8> [[FVAL:%.*]], <4 x i8> [[TVAL:%.*]]
554-
; CHECK-NEXT: ret <4 x i8> [[TMP1]]
552+
; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt <4 x i8> [[COND:%.*]], <i8 -1, i8 -1, i8 -1, i8 -1>
553+
; CHECK-NEXT: [[TMP2:%.*]] = select <4 x i1> [[TMP1]], <4 x i8> [[FVAL:%.*]], <4 x i8> [[TVAL:%.*]]
554+
; CHECK-NEXT: ret <4 x i8> [[TMP2]]
555555
;
556556
%bitmask = ashr <4 x i8> %cond, <i8 7, i8 7, i8 7, i8 7>
557557
%not_bitmask = xor <4 x i8> %bitmask, <i8 -1, i8 -1, i8 -1, i8 -1>

0 commit comments

Comments
 (0)