Skip to content

Commit aa054c6

Browse files
authored
[ConstraintElim] Simplify and/or instead of replacing its operand (#139874)
In `checkOrAndOpImpliedByOther`, replacing an operand of a disjoint or is unsafe: https://alive2.llvm.org/ce/z/4R4hxN This patch performs the simplification directly, to avoid miscompilation and unnecessary canonicalization. Closes #137937.
1 parent eac7466 commit aa054c6

9 files changed

+63
-82
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1563,8 +1563,12 @@ removeEntryFromStack(const StackEntry &E, ConstraintInfo &Info,
15631563
static bool checkOrAndOpImpliedByOther(
15641564
FactOrCheck &CB, ConstraintInfo &Info, Module *ReproducerModule,
15651565
SmallVectorImpl<ReproducerEntry> &ReproducerCondStack,
1566-
SmallVectorImpl<StackEntry> &DFSInStack) {
1566+
SmallVectorImpl<StackEntry> &DFSInStack,
1567+
SmallVectorImpl<Instruction *> &ToRemove) {
15671568
Instruction *JoinOp = CB.getContextInst();
1569+
if (JoinOp->use_empty())
1570+
return false;
1571+
15681572
CmpInst *CmpToCheck = cast<CmpInst>(CB.getInstructionToSimplify());
15691573
unsigned OtherOpIdx = JoinOp->getOperand(0) == CmpToCheck ? 1 : 0;
15701574

@@ -1611,15 +1615,12 @@ static bool checkOrAndOpImpliedByOther(
16111615
if (auto ImpliedCondition =
16121616
checkCondition(CmpToCheck->getPredicate(), CmpToCheck->getOperand(0),
16131617
CmpToCheck->getOperand(1), CmpToCheck, Info)) {
1614-
if (IsOr && isa<SelectInst>(JoinOp)) {
1615-
JoinOp->setOperand(
1616-
OtherOpIdx == 0 ? 2 : 0,
1618+
if (IsOr == *ImpliedCondition)
1619+
JoinOp->replaceAllUsesWith(
16171620
ConstantInt::getBool(JoinOp->getType(), *ImpliedCondition));
1618-
} else
1619-
JoinOp->setOperand(
1620-
1 - OtherOpIdx,
1621-
ConstantInt::getBool(JoinOp->getType(), *ImpliedCondition));
1622-
1621+
else
1622+
JoinOp->replaceAllUsesWith(JoinOp->getOperand(OtherOpIdx));
1623+
ToRemove.push_back(JoinOp);
16231624
return true;
16241625
}
16251626

@@ -1852,9 +1853,9 @@ static bool eliminateConstraints(Function &F, DominatorTree &DT, LoopInfo &LI,
18521853
ReproducerModule.get(), ReproducerCondStack, S.DT, ToRemove);
18531854
if (!Simplified &&
18541855
match(CB.getContextInst(), m_LogicalOp(m_Value(), m_Value()))) {
1855-
Simplified =
1856-
checkOrAndOpImpliedByOther(CB, Info, ReproducerModule.get(),
1857-
ReproducerCondStack, DFSInStack);
1856+
Simplified = checkOrAndOpImpliedByOther(
1857+
CB, Info, ReproducerModule.get(), ReproducerCondStack, DFSInStack,
1858+
ToRemove);
18581859
}
18591860
Changed |= Simplified;
18601861
} else if (auto *MinMax = dyn_cast<MinMaxIntrinsic>(Inst)) {

llvm/test/Transforms/ConstraintElimination/and-implied-by-operands.ll

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ define i1 @test_second_and_condition_implied_by_first(i8 %x) {
66
; CHECK-NEXT: entry:
77
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10
88
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[X]], 5
9-
; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], true
10-
; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
9+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]]
1110
; CHECK: then:
1211
; CHECK-NEXT: ret i1 false
1312
; CHECK: else:
@@ -31,8 +30,7 @@ define i1 @test_first_and_condition_implied_by_second_ops(i8 %x) {
3130
; CHECK-NEXT: entry:
3231
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10
3332
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[X]], 5
34-
; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[C_1]]
35-
; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
33+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]]
3634
; CHECK: then:
3735
; CHECK-NEXT: ret i1 false
3836
; CHECK: else:
@@ -56,8 +54,7 @@ define i1 @test_second_and_condition_implied_by_first_select_form(i8 %x) {
5654
; CHECK-NEXT: entry:
5755
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10
5856
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[X]], 5
59-
; CHECK-NEXT: [[AND:%.*]] = select i1 [[C_1]], i1 true, i1 false
60-
; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
57+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]]
6158
; CHECK: then:
6259
; CHECK-NEXT: ret i1 false
6360
; CHECK: else:
@@ -105,8 +102,7 @@ define i1 @test_same_cond_for_and(i8 %x) {
105102
; CHECK-LABEL: @test_same_cond_for_and(
106103
; CHECK-NEXT: entry:
107104
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10
108-
; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[C_1]]
109-
; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
105+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]]
110106
; CHECK: then:
111107
; CHECK-NEXT: ret i1 false
112108
; CHECK: else:
@@ -152,8 +148,7 @@ define i1 @test_second_and_condition_not_implied_by_first(i8 %x) {
152148
; CHECK-NEXT: entry:
153149
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10
154150
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[X]], 5
155-
; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[C_1]]
156-
; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
151+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]]
157152
; CHECK: then:
158153
; CHECK-NEXT: ret i1 false
159154
; CHECK: else:
@@ -371,8 +366,7 @@ define i1 @test_and_used_in_false_branch(i8 %x) {
371366
; CHECK-NEXT: entry:
372367
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10
373368
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[X]], 5
374-
; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], true
375-
; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
369+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]]
376370
; CHECK: then:
377371
; CHECK-NEXT: ret i1 true
378372
; CHECK: else:
@@ -397,8 +391,7 @@ define i1 @test_or_used_in_false_branch(i8 %x) {
397391
; CHECK-NEXT: entry:
398392
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
399393
; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[X]], 5
400-
; CHECK-NEXT: [[AND:%.*]] = or i1 [[C_1]], false
401-
; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
394+
; CHECK-NEXT: br i1 [[C_1]], label [[THEN:%.*]], label [[ELSE:%.*]]
402395
; CHECK: then:
403396
; CHECK-NEXT: ret i1 [[T_1]]
404397
; CHECK: else:
@@ -423,8 +416,7 @@ define i1 @test_or_used_in_false_branch2(i8 %x) {
423416
; CHECK-NEXT: entry:
424417
; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10
425418
; CHECK-NEXT: [[T_1:%.*]] = icmp ugt i8 [[X]], 5
426-
; CHECK-NEXT: [[AND:%.*]] = or i1 false, [[T_1]]
427-
; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
419+
; CHECK-NEXT: br i1 [[T_1]], label [[THEN:%.*]], label [[ELSE:%.*]]
428420
; CHECK: then:
429421
; CHECK-NEXT: ret i1 [[T_1]]
430422
; CHECK: else:
@@ -450,8 +442,7 @@ define i1 @and_select_first_implies_second_may_be_poison(ptr noundef %A, ptr nou
450442
; CHECK-NEXT: [[C_1:%.*]] = icmp ne ptr [[A:%.*]], [[B:%.*]]
451443
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds ptr, ptr [[B]], i64 -1
452444
; CHECK-NEXT: [[C_2:%.*]] = icmp ugt ptr [[GEP]], [[A]]
453-
; CHECK-NEXT: [[AND:%.*]] = select i1 [[C_2]], i1 true, i1 false
454-
; CHECK-NEXT: ret i1 [[AND]]
445+
; CHECK-NEXT: ret i1 [[C_2]]
455446
;
456447
entry:
457448
%c.1 = icmp ne ptr %A, %B
@@ -504,8 +495,7 @@ define void @and_tree_second_implies_first(i32 noundef %v0, i32 noundef %v1, i32
504495
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[V1]], [[V2:%.*]]
505496
; CHECK-NEXT: [[AND1:%.*]] = and i1 [[CMP0]], [[CMP1]]
506497
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[V0]], [[V2]]
507-
; CHECK-NEXT: [[AND2:%.*]] = and i1 false, [[AND1]]
508-
; CHECK-NEXT: br i1 [[AND2]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
498+
; CHECK-NEXT: br i1 false, label [[IF_THEN:%.*]], label [[RETURN:%.*]]
509499
; CHECK: if.then:
510500
; CHECK-NEXT: call void @side_effect()
511501
; CHECK-NEXT: br label [[RETURN]]
@@ -535,8 +525,7 @@ define void @and_tree_second_implies_first_perm1(i32 noundef %v0, i32 noundef %v
535525
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[V1]], [[V2:%.*]]
536526
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[V0]], [[V2]]
537527
; CHECK-NEXT: [[AND1:%.*]] = and i1 [[CMP2]], [[CMP1]]
538-
; CHECK-NEXT: [[AND2:%.*]] = and i1 false, [[AND1]]
539-
; CHECK-NEXT: br i1 [[AND2]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
528+
; CHECK-NEXT: br i1 false, label [[IF_THEN:%.*]], label [[RETURN:%.*]]
540529
; CHECK: if.then:
541530
; CHECK-NEXT: call void @side_effect()
542531
; CHECK-NEXT: br label [[RETURN]]
@@ -567,8 +556,7 @@ define void @and_tree_second_implies_first_perm2(i32 noundef %v0, i32 noundef %v
567556
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[V1]], [[V2:%.*]]
568557
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[V0]], [[V2]]
569558
; CHECK-NEXT: [[AND1:%.*]] = and i1 [[CMP0]], [[CMP2]]
570-
; CHECK-NEXT: [[AND2:%.*]] = and i1 false, [[AND1]]
571-
; CHECK-NEXT: br i1 [[AND2]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
559+
; CHECK-NEXT: br i1 false, label [[IF_THEN:%.*]], label [[RETURN:%.*]]
572560
; CHECK: if.then:
573561
; CHECK-NEXT: call void @side_effect()
574562
; CHECK-NEXT: br label [[RETURN]]
@@ -629,8 +617,7 @@ define void @or_tree_second_implies_first(i32 noundef %v0, i32 noundef %v1, i32
629617
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[V1]], [[V2:%.*]]
630618
; CHECK-NEXT: [[AND1:%.*]] = or i1 [[CMP0]], [[CMP1]]
631619
; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[V0]], [[V2]]
632-
; CHECK-NEXT: [[AND2:%.*]] = or i1 true, [[AND1]]
633-
; CHECK-NEXT: br i1 [[AND2]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
620+
; CHECK-NEXT: br i1 true, label [[IF_THEN:%.*]], label [[RETURN:%.*]]
634621
; CHECK: if.then:
635622
; CHECK-NEXT: call void @side_effect()
636623
; CHECK-NEXT: br label [[RETURN]]
@@ -659,8 +646,7 @@ define void @or_tree_second_implies_first_with_unknown_cond(i64 %x, i1 %cond) {
659646
; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i64 [[X:%.*]], 1
660647
; CHECK-NEXT: [[OR1:%.*]] = select i1 [[CMP1]], i1 [[COND:%.*]], i1 false
661648
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i64 [[X]], 2
662-
; CHECK-NEXT: [[OR2:%.*]] = select i1 [[OR1]], i1 false, i1 false
663-
; CHECK-NEXT: br i1 [[OR2]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
649+
; CHECK-NEXT: br i1 false, label [[IF_THEN:%.*]], label [[IF_END:%.*]]
664650
; CHECK: if.then:
665651
; CHECK-NEXT: call void @side_effect()
666652
; CHECK-NEXT: br label [[IF_END]]

llvm/test/Transforms/ConstraintElimination/eq.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -432,8 +432,7 @@ define i1 @test_eq_for_signed_cmp(i32 noundef %v0, i32 noundef %v1, i32 noundef
432432
; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[V0]], [[V1:%.*]]
433433
; CHECK-NEXT: [[AND0:%.*]] = and i1 [[CMP1]], [[CMP]]
434434
; CHECK-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[V1]], [[V2]]
435-
; CHECK-NEXT: [[AND1:%.*]] = and i1 false, [[AND0]]
436-
; CHECK-NEXT: ret i1 [[AND1]]
435+
; CHECK-NEXT: ret i1 false
437436
;
438437
entry:
439438
%cmp = icmp eq i32 %v2, %v0
@@ -457,8 +456,7 @@ define i1 @test_eq_for_signed_cmp_with_decompsition(i32 noundef %v0, i32 noundef
457456
; CHECK-NEXT: [[AND1:%.*]] = and i1 [[AND0]], [[CMP2]]
458457
; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[CMP3]]
459458
; CHECK-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[V1]], [[V2]]
460-
; CHECK-NEXT: [[AND3:%.*]] = and i1 false, [[AND2]]
461-
; CHECK-NEXT: ret i1 [[AND3]]
459+
; CHECK-NEXT: ret i1 false
462460
;
463461
entry:
464462
%v0add = add nsw i32 %v0, %addend0

llvm/test/Transforms/ConstraintElimination/gep-arithmetic-signed-predicates.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -611,14 +611,12 @@ define i4 @ptr_N_signed_positive_assume(ptr %src, ptr %lower, ptr %upper, i16 %N
611611
; CHECK: step.check:
612612
; CHECK-NEXT: [[STEP_POS:%.*]] = icmp sge i16 [[STEP:%.*]], 0
613613
; CHECK-NEXT: [[STEP_SLT_N:%.*]] = icmp slt i16 [[STEP]], [[N]]
614-
; CHECK-NEXT: [[AND_STEP:%.*]] = and i1 false, [[STEP_SLT_N]]
615-
; CHECK-NEXT: br i1 [[AND_STEP]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]
614+
; CHECK-NEXT: br i1 false, label [[PTR_CHECK:%.*]], label [[EXIT:%.*]]
616615
; CHECK: ptr.check:
617616
; CHECK-NEXT: [[SRC_STEP:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i16 [[STEP]]
618617
; CHECK-NEXT: [[CMP_STEP_START:%.*]] = icmp slt ptr [[SRC_STEP]], [[LOWER]]
619618
; CHECK-NEXT: [[CMP_STEP_END:%.*]] = icmp sge ptr [[SRC_STEP]], [[UPPER]]
620-
; CHECK-NEXT: [[OR_CHECK:%.*]] = or i1 true, [[CMP_STEP_END]]
621-
; CHECK-NEXT: br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]]
619+
; CHECK-NEXT: br i1 true, label [[TRAP_BB]], label [[EXIT]]
622620
; CHECK: exit:
623621
; CHECK-NEXT: ret i4 3
624622
;

llvm/test/Transforms/ConstraintElimination/geps-precondition-overflow-check.ll

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ define i1 @overflow_check_2_and(ptr %dst) {
3636
; CHECK-NEXT: entry:
3737
; CHECK-NEXT: [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5
3838
; CHECK-NEXT: [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]]
39-
; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[DST_5_UGE]]
40-
; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
39+
; CHECK-NEXT: br i1 [[DST_5_UGE]], label [[THEN:%.*]], label [[ELSE:%.*]]
4140
; CHECK: then:
4241
; CHECK-NEXT: [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4
4342
; CHECK-NEXT: [[TRUE_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]]
@@ -65,8 +64,7 @@ define i1 @overflow_check_3_and(ptr %dst) {
6564
; CHECK-NEXT: entry:
6665
; CHECK-NEXT: [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5
6766
; CHECK-NEXT: [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]]
68-
; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[DST_5_UGE]]
69-
; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
67+
; CHECK-NEXT: br i1 [[DST_5_UGE]], label [[THEN:%.*]], label [[ELSE:%.*]]
7068
; CHECK: then:
7169
; CHECK-NEXT: [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4
7270
; CHECK-NEXT: [[DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]]
@@ -98,8 +96,7 @@ define i1 @overflow_check_4_and(ptr %dst) {
9896
; CHECK-NEXT: entry:
9997
; CHECK-NEXT: [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5
10098
; CHECK-NEXT: [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]]
101-
; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[DST_5_UGE]]
102-
; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
99+
; CHECK-NEXT: br i1 [[DST_5_UGE]], label [[THEN:%.*]], label [[ELSE:%.*]]
103100
; CHECK: then:
104101
; CHECK-NEXT: [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4
105102
; CHECK-NEXT: [[TRUE_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]]
@@ -152,8 +149,7 @@ define i1 @overflow_check_3_or(ptr %dst) {
152149
; CHECK-NEXT: entry:
153150
; CHECK-NEXT: [[DST_5:%.*]] = getelementptr i32, ptr [[DST:%.*]], i64 5
154151
; CHECK-NEXT: [[DST_5_UGE:%.*]] = icmp uge ptr [[DST_5]], [[DST]]
155-
; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[DST_5_UGE]]
156-
; CHECK-NEXT: br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]]
152+
; CHECK-NEXT: br i1 [[DST_5_UGE]], label [[THEN:%.*]], label [[ELSE:%.*]]
157153
; CHECK: then:
158154
; CHECK-NEXT: [[DST_4:%.*]] = getelementptr i32, ptr [[DST]], i64 4
159155
; CHECK-NEXT: [[TRUE_DST_4_UGE:%.*]] = icmp uge ptr [[DST_4]], [[DST]]

llvm/test/Transforms/ConstraintElimination/loops-bottom-tested-pointer-cmps.ll

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ define void @checks_in_loops_removable(ptr %ptr, ptr %lower, ptr %upper, i8 %n)
2323
; CHECK-NEXT: [[PTR_IV:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV]]
2424
; CHECK-NEXT: [[CMP_PTR_IV_LOWER:%.*]] = icmp ugt ptr [[LOWER]], [[PTR_IV]]
2525
; CHECK-NEXT: [[CMP_PTR_IV_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV]]
26-
; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[CMP_PTR_IV_UPPER]]
27-
; CHECK-NEXT: br i1 [[OR]], label [[TRAP]], label [[LOOP_LATCH]]
26+
; CHECK-NEXT: br i1 [[CMP_PTR_IV_UPPER]], label [[TRAP]], label [[LOOP_LATCH]]
2827
; CHECK: loop.latch:
2928
; CHECK-NEXT: store i8 0, ptr [[PTR_IV]], align 4
3029
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i16 [[IV]], 1
@@ -88,14 +87,13 @@ define void @some_checks_in_loops_removable(ptr %ptr, ptr %lower, ptr %upper, i8
8887
; CHECK-NEXT: [[PTR_IV:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV]]
8988
; CHECK-NEXT: [[CMP_PTR_IV_LOWER:%.*]] = icmp ugt ptr [[LOWER]], [[PTR_IV]]
9089
; CHECK-NEXT: [[CMP_PTR_IV_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV]]
91-
; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[CMP_PTR_IV_UPPER]]
92-
; CHECK-NEXT: br i1 [[OR]], label [[TRAP]], label [[LOOP_BODY:%.*]]
90+
; CHECK-NEXT: br i1 [[CMP_PTR_IV_UPPER]], label [[TRAP]], label [[LOOP_BODY:%.*]]
9391
; CHECK: loop.body:
9492
; CHECK-NEXT: [[IV_1:%.*]] = add nuw nsw i16 [[IV]], 1
9593
; CHECK-NEXT: [[PTR_IV_1:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV_1]]
9694
; CHECK-NEXT: [[CMP_PTR_IV_1_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV_1]]
9795
; CHECK-NEXT: [[OR_1:%.*]] = or i1 false, [[CMP_PTR_IV_1_UPPER]]
98-
; CHECK-NEXT: br i1 [[OR]], label [[TRAP]], label [[LOOP_LATCH]]
96+
; CHECK-NEXT: br i1 [[CMP_PTR_IV_UPPER]], label [[TRAP]], label [[LOOP_LATCH]]
9997
; CHECK: loop.latch:
10098
; CHECK-NEXT: store i8 0, ptr [[PTR_IV]], align 4
10199
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i16 [[IV]], 1
@@ -165,14 +163,13 @@ define void @no_checks_in_loops_removable(ptr %ptr, ptr %lower, ptr %upper, i8 %
165163
; CHECK-NEXT: [[PTR_IV:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV]]
166164
; CHECK-NEXT: [[CMP_PTR_IV_LOWER:%.*]] = icmp ugt ptr [[LOWER]], [[PTR_IV]]
167165
; CHECK-NEXT: [[CMP_PTR_IV_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV]]
168-
; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[CMP_PTR_IV_UPPER]]
169-
; CHECK-NEXT: br i1 [[OR]], label [[TRAP]], label [[LOOP_BODY:%.*]]
166+
; CHECK-NEXT: br i1 [[CMP_PTR_IV_UPPER]], label [[TRAP]], label [[LOOP_BODY:%.*]]
170167
; CHECK: loop.body:
171168
; CHECK-NEXT: [[IV_1:%.*]] = add nuw nsw i16 [[IV]], 1
172169
; CHECK-NEXT: [[PTR_IV_1:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV_1]]
173170
; CHECK-NEXT: [[CMP_PTR_IV_1_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV_1]]
174171
; CHECK-NEXT: [[OR_1:%.*]] = or i1 false, [[CMP_PTR_IV_1_UPPER]]
175-
; CHECK-NEXT: br i1 [[OR]], label [[TRAP]], label [[LOOP_LATCH]]
172+
; CHECK-NEXT: br i1 [[CMP_PTR_IV_UPPER]], label [[TRAP]], label [[LOOP_LATCH]]
176173
; CHECK: loop.latch:
177174
; CHECK-NEXT: store i8 0, ptr [[PTR_IV]], align 4
178175
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i16 [[IV]], 1

llvm/test/Transforms/ConstraintElimination/loops-header-tested-pointer-cmps.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,7 @@ define void @test2_with_ne(ptr %src, ptr %lower, ptr %upper, i8 %N) {
212212
; CHECK-NEXT: [[SRC_IV:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[IV]]
213213
; CHECK-NEXT: [[CMP_IV_START:%.*]] = icmp ult ptr [[SRC_IV]], [[LOWER]]
214214
; CHECK-NEXT: [[CMP_IV_END:%.*]] = icmp uge ptr [[SRC_IV]], [[UPPER]]
215-
; CHECK-NEXT: [[OR_1:%.*]] = or i1 false, [[CMP_IV_END]]
216-
; CHECK-NEXT: br i1 [[OR_1]], label [[TRAP_BB]], label [[LOOP_BODY_1:%.*]]
215+
; CHECK-NEXT: br i1 [[CMP_IV_END]], label [[TRAP_BB]], label [[LOOP_BODY_1:%.*]]
217216
; CHECK: loop.body.1:
218217
; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[IV]], 1
219218
; CHECK-NEXT: [[SRC_IV_1:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[ADD_1]]
@@ -306,8 +305,7 @@ define void @test3(ptr %src, ptr %lower, ptr %upper, i8 %N) {
306305
; CHECK-NEXT: [[SRC_IV:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[IV]]
307306
; CHECK-NEXT: [[CMP_IV_START:%.*]] = icmp ult ptr [[SRC_IV]], [[LOWER]]
308307
; CHECK-NEXT: [[CMP_IV_END:%.*]] = icmp uge ptr [[SRC_IV]], [[UPPER]]
309-
; CHECK-NEXT: [[OR_1:%.*]] = or i1 false, [[CMP_IV_END]]
310-
; CHECK-NEXT: br i1 [[OR_1]], label [[TRAP_BB]], label [[LOOP_BODY_1:%.*]]
308+
; CHECK-NEXT: br i1 [[CMP_IV_END]], label [[TRAP_BB]], label [[LOOP_BODY_1:%.*]]
311309
; CHECK: loop.body.1:
312310
; CHECK-NEXT: [[SRC_IV_1:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[NEXT]]
313311
; CHECK-NEXT: [[CMP_IV_1_END:%.*]] = icmp uge ptr [[SRC_IV_1]], [[UPPER]]

0 commit comments

Comments
 (0)