diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp index 98cfadddee8ef..899d7e0a11e6f 100644 --- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp +++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp @@ -273,7 +273,16 @@ class ConstraintInfo { public: ConstraintInfo(const DataLayout &DL, ArrayRef FunctionArgs) - : UnsignedCS(FunctionArgs), SignedCS(FunctionArgs), DL(DL) {} + : UnsignedCS(FunctionArgs), SignedCS(FunctionArgs), DL(DL) { + auto &Value2Index = getValue2Index(false); + // Add Arg > -1 constraints to unsigned system for all function arguments. + for (Value *Arg : FunctionArgs) { + ConstraintTy VarPos(SmallVector(Value2Index.size() + 1, 0), + false, false, false); + VarPos.Coefficients[Value2Index[Arg]] = -1; + UnsignedCS.addVariableRow(VarPos.Coefficients); + } + } DenseMap &getValue2Index(bool Signed) { return Signed ? SignedCS.getValue2Index() : UnsignedCS.getValue2Index(); @@ -1466,6 +1475,17 @@ void ConstraintInfo::addFact(CmpInst::Predicate Pred, Value *A, Value *B, DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned, std::move(ValuesToRelease)); + if (!R.IsSigned) { + for (Value *V : NewVariables) { + ConstraintTy VarPos(SmallVector(Value2Index.size() + 1, 0), + false, false, false); + VarPos.Coefficients[Value2Index[V]] = -1; + CSToUse.addVariableRow(VarPos.Coefficients); + DFSInStack.emplace_back(NumIn, NumOut, R.IsSigned, + SmallVector()); + } + } + if (R.isEq()) { // Also add the inverted constraint for equality constraints. for (auto &Coeff : R.Coefficients) @@ -1711,7 +1731,8 @@ static bool eliminateConstraints(Function &F, DominatorTree &DT, LoopInfo &LI, #ifndef NDEBUG unsigned SignedEntries = count_if(DFSInStack, [](const StackEntry &E) { return E.IsSigned; }); - assert(Info.getCS(false).size() == DFSInStack.size() - SignedEntries && + assert(Info.getCS(false).size() - FunctionArgs.size() == + DFSInStack.size() - SignedEntries && "updates to CS and DFSInStack are out of sync"); assert(Info.getCS(true).size() == SignedEntries && "updates to CS and DFSInStack are out of sync"); diff --git a/llvm/test/Transforms/ConstraintElimination/add-nuw.ll b/llvm/test/Transforms/ConstraintElimination/add-nuw.ll index be3b66af10e08..a8a474e6d4502 100644 --- a/llvm/test/Transforms/ConstraintElimination/add-nuw.ll +++ b/llvm/test/Transforms/ConstraintElimination/add-nuw.ll @@ -235,8 +235,7 @@ define void @test.decompose.nonconst(i8 %a, i8 %b, i8 %c, i8 %d) { ; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i8 [[A]], [[A]] ; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: [[ADD_2:%.*]] = add nuw i8 [[A]], [[D:%.*]] -; CHECK-NEXT: [[C_4:%.*]] = icmp uge i8 [[ADD_2]], [[C]] -; CHECK-NEXT: call void @use(i1 [[C_4]]) +; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: ret void ; CHECK: if.end: ; CHECK-NEXT: ret void @@ -278,14 +277,11 @@ define void @test.decompose.nonconst.no.null.check(i8 %a, i8 %b, i8 %c, i8 %d) { ; CHECK-NEXT: br i1 [[AND_0]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] ; CHECK: if.then: ; CHECK-NEXT: [[ADD_0:%.*]] = add nuw i8 [[A]], [[B]] -; CHECK-NEXT: [[T_0:%.*]] = icmp uge i8 [[ADD_0]], [[C]] -; CHECK-NEXT: call void @use(i1 [[T_0]]) +; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: [[ADD_1:%.*]] = add nuw i8 [[A]], [[A]] -; CHECK-NEXT: [[T_1:%.*]] = icmp uge i8 [[ADD_0]], [[C]] -; CHECK-NEXT: call void @use(i1 [[T_1]]) +; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: [[ADD_2:%.*]] = add nuw i8 [[A]], [[D:%.*]] -; CHECK-NEXT: [[C_4:%.*]] = icmp uge i8 [[ADD_2]], [[C]] -; CHECK-NEXT: call void @use(i1 [[C_4]]) +; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: ret void ; CHECK: if.end: ; CHECK-NEXT: ret void @@ -318,8 +314,7 @@ define i1 @test_n_must_ule_1_due_to_nuw(i8 %n, i8 %i) { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[SUB_N_1:%.*]] = add nuw i8 [[N:%.*]], -1 ; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[I:%.*]], [[SUB_N_1]] -; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[I]], [[ADD]] -; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] +; CHECK-NEXT: br i1 false, label [[IF_THEN:%.*]], label [[IF_END:%.*]] ; CHECK: if.then: ; CHECK-NEXT: ret i1 true ; CHECK: if.end: @@ -376,8 +371,7 @@ define i1 @test_n_must_ule_2_due_to_nuw(i8 %n, i8 %i) { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[SUB_N_1:%.*]] = add nuw i8 [[N:%.*]], -2 ; CHECK-NEXT: [[ADD:%.*]] = add nuw i8 [[I:%.*]], [[SUB_N_1]] -; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[I]], [[ADD]] -; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] +; CHECK-NEXT: br i1 false, label [[IF_THEN:%.*]], label [[IF_END:%.*]] ; CHECK: if.then: ; CHECK-NEXT: ret i1 true ; CHECK: if.end: @@ -435,10 +429,9 @@ define i1 @add_nuw_neg_pr54224_i16(i16 %a) { ; CHECK-LABEL: @add_nuw_neg_pr54224_i16( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[NEG2:%.*]] = add nuw i16 [[A:%.*]], -305 -; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i16 0, [[NEG2]] -; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]] +; CHECK-NEXT: br i1 false, label [[EXIT_1:%.*]], label [[EXIT_2:%.*]] ; CHECK: exit.1: -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: ret i1 true ; CHECK: exit.2: ; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i16 [[A]], 0 ; CHECK-NEXT: ret i1 [[C_3]] @@ -464,8 +457,7 @@ define i1 @add_nuw_neg_pr54224_i64(i64 %a) { ; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i64 0, [[NEG2]] ; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]] ; CHECK: exit.1: -; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i64 [[A]], 0 -; CHECK-NEXT: ret i1 [[C_2]] +; CHECK-NEXT: ret i1 true ; CHECK: exit.2: ; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i64 [[A]], 0 ; CHECK-NEXT: ret i1 [[C_3]] diff --git a/llvm/test/Transforms/ConstraintElimination/and-implied-by-operands.ll b/llvm/test/Transforms/ConstraintElimination/and-implied-by-operands.ll index 5c49ca0e96f30..6bbc73c9c996c 100644 --- a/llvm/test/Transforms/ConstraintElimination/and-implied-by-operands.ll +++ b/llvm/test/Transforms/ConstraintElimination/and-implied-by-operands.ll @@ -181,9 +181,8 @@ define i1 @test_remove_variables(i1 %c, ptr %A, i64 %B, ptr %C) { ; CHECK-NEXT: [[C_1:%.*]] = icmp ult ptr [[TMP0]], [[A:%.*]] ; CHECK-NEXT: br i1 [[C_1]], label [[THEN_2:%.*]], label [[ELSE_2:%.*]] ; CHECK: then.2: -; CHECK-NEXT: [[C_2:%.*]] = icmp ne ptr [[A]], null ; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i64 [[B:%.*]], 0 -; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_2]], [[C_3]] +; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[C_3]] ; CHECK-NEXT: ret i1 [[AND]] ; CHECK: else.2: ; CHECK-NEXT: ret i1 false diff --git a/llvm/test/Transforms/ConstraintElimination/gep-arithmetic-add.ll b/llvm/test/Transforms/ConstraintElimination/gep-arithmetic-add.ll index ea65e890e4f3b..52adc78b4e159 100644 --- a/llvm/test/Transforms/ConstraintElimination/gep-arithmetic-add.ll +++ b/llvm/test/Transforms/ConstraintElimination/gep-arithmetic-add.ll @@ -289,8 +289,7 @@ define i4 @ptr_N_step_zext_n_zext(ptr %src, ptr %lower, ptr %upper, i16 %N, i16 ; CHECK-NEXT: br i1 [[STEP_ULT_N]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]] ; CHECK: ptr.check: ; CHECK-NEXT: [[SRC_STEP:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i32 [[STEP_ADD_1_EXT]] -; CHECK-NEXT: [[CMP_STEP_START:%.*]] = icmp ult ptr [[SRC_STEP]], [[LOWER]] -; CHECK-NEXT: [[OR_CHECK:%.*]] = or i1 [[CMP_STEP_START]], false +; CHECK-NEXT: [[OR_CHECK:%.*]] = or i1 false, false ; CHECK-NEXT: br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret i4 3 @@ -344,9 +343,8 @@ define i4 @ptr_N_step_zext_n_zext_out_of_bounds(ptr %src, ptr %lower, ptr %upper ; CHECK-NEXT: br i1 [[STEP_ULT_N]], label [[PTR_CHECK:%.*]], label [[EXIT:%.*]] ; CHECK: ptr.check: ; CHECK-NEXT: [[SRC_STEP:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i32 [[STEP_ADD_2_EXT]] -; CHECK-NEXT: [[CMP_STEP_START:%.*]] = icmp ult ptr [[SRC_STEP]], [[LOWER]] ; CHECK-NEXT: [[CMP_STEP_END:%.*]] = icmp uge ptr [[SRC_STEP]], [[UPPER]] -; CHECK-NEXT: [[OR_CHECK:%.*]] = or i1 [[CMP_STEP_START]], [[CMP_STEP_END]] +; CHECK-NEXT: [[OR_CHECK:%.*]] = or i1 false, [[CMP_STEP_END]] ; CHECK-NEXT: br i1 [[OR_CHECK]], label [[TRAP_BB]], label [[EXIT]] ; CHECK: exit: ; CHECK-NEXT: ret i4 3 diff --git a/llvm/test/Transforms/ConstraintElimination/gep-arithmetic.ll b/llvm/test/Transforms/ConstraintElimination/gep-arithmetic.ll index 0a835fb38a243..a4d825b327969 100644 --- a/llvm/test/Transforms/ConstraintElimination/gep-arithmetic.ll +++ b/llvm/test/Transforms/ConstraintElimination/gep-arithmetic.ll @@ -530,9 +530,8 @@ define i4 @ptr_N_unsigned_positive(ptr %src, ptr %lower, ptr %upper, i16 %N, i16 ; CHECK-NEXT: [[SRC_END:%.*]] = getelementptr inbounds i8, ptr [[SRC:%.*]], i16 [[N:%.*]] ; CHECK-NEXT: [[CMP_SRC_START:%.*]] = icmp ult ptr [[SRC]], [[LOWER:%.*]] ; CHECK-NEXT: [[CMP_SRC_END:%.*]] = icmp uge ptr [[SRC_END]], [[UPPER:%.*]] -; CHECK-NEXT: [[N_NEG:%.*]] = icmp ult i16 [[N]], 0 ; CHECK-NEXT: [[OR_PRECOND_0:%.*]] = or i1 [[CMP_SRC_START]], [[CMP_SRC_END]] -; CHECK-NEXT: [[OR_PRECOND_1:%.*]] = or i1 [[OR_PRECOND_0]], [[N_NEG]] +; CHECK-NEXT: [[OR_PRECOND_1:%.*]] = or i1 [[OR_PRECOND_0]], false ; CHECK-NEXT: br i1 [[OR_PRECOND_1]], label [[TRAP_BB:%.*]], label [[STEP_CHECK:%.*]] ; CHECK: trap.bb: ; CHECK-NEXT: ret i4 2 diff --git a/llvm/test/Transforms/ConstraintElimination/geps-pointers-to-structs.ll b/llvm/test/Transforms/ConstraintElimination/geps-pointers-to-structs.ll index e72f1ee9b3706..a86cd5c04d5b9 100644 --- a/llvm/test/Transforms/ConstraintElimination/geps-pointers-to-structs.ll +++ b/llvm/test/Transforms/ConstraintElimination/geps-pointers-to-structs.ll @@ -369,8 +369,7 @@ define i1 @ptr.int.struct.test.ult.due.to.second.dimension.var.index(ptr %start, ; CHECK-NEXT: [[IDX_EXT:%.*]] = zext i32 [[IDX]] to i64 ; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [[STRUCT_2]], ptr [[START]], i64 6, i32 0 ; CHECK-NEXT: [[START_0_CAST:%.*]] = bitcast ptr [[START_0]] to ptr -; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0_CAST]], [[HIGH]] -; CHECK-NEXT: ret i1 [[C_0]] +; CHECK-NEXT: ret i1 true ; CHECK: if.end: ; CHECK-NEXT: ret i1 true ; diff --git a/llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll b/llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll index 9568b155af13a..a80e492e08246 100644 --- a/llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll +++ b/llvm/test/Transforms/ConstraintElimination/large-constant-ints.ll @@ -128,8 +128,7 @@ define i1 @gep_decomp_i80(ptr %a) { ; CHECK-LABEL: @gep_decomp_i80( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[A:%.*]], i80 1973801615886922022913 -; CHECK-NEXT: [[C:%.*]] = icmp eq ptr [[GEP]], null -; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]] +; CHECK-NEXT: br i1 false, label [[THEN:%.*]], label [[ELSE:%.*]] ; CHECK: then: ; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds i8, ptr [[A]], i80 1973801615886922022913 ; CHECK-NEXT: ret i1 true diff --git a/llvm/test/Transforms/ConstraintElimination/loops-bottom-tested-pointer-cmps.ll b/llvm/test/Transforms/ConstraintElimination/loops-bottom-tested-pointer-cmps.ll index 17a54b6ecbe2e..e3f2a54f321ed 100644 --- a/llvm/test/Transforms/ConstraintElimination/loops-bottom-tested-pointer-cmps.ll +++ b/llvm/test/Transforms/ConstraintElimination/loops-bottom-tested-pointer-cmps.ll @@ -23,7 +23,7 @@ define void @checks_in_loops_removable(ptr %ptr, ptr %lower, ptr %upper, i8 %n) ; CHECK-NEXT: [[PTR_IV:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV]] ; CHECK-NEXT: [[CMP_PTR_IV_LOWER:%.*]] = icmp ugt ptr [[LOWER]], [[PTR_IV]] ; CHECK-NEXT: [[CMP_PTR_IV_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV]] -; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP_PTR_IV_LOWER]], [[CMP_PTR_IV_UPPER]] +; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[CMP_PTR_IV_UPPER]] ; CHECK-NEXT: br i1 [[OR]], label [[TRAP]], label [[LOOP_LATCH]] ; CHECK: loop.latch: ; CHECK-NEXT: store i8 0, ptr [[PTR_IV]], align 4 @@ -88,7 +88,7 @@ define void @some_checks_in_loops_removable(ptr %ptr, ptr %lower, ptr %upper, i8 ; CHECK-NEXT: [[PTR_IV:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV]] ; CHECK-NEXT: [[CMP_PTR_IV_LOWER:%.*]] = icmp ugt ptr [[LOWER]], [[PTR_IV]] ; CHECK-NEXT: [[CMP_PTR_IV_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV]] -; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP_PTR_IV_LOWER]], [[CMP_PTR_IV_UPPER]] +; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[CMP_PTR_IV_UPPER]] ; CHECK-NEXT: br i1 [[OR]], label [[TRAP]], label [[LOOP_BODY:%.*]] ; CHECK: loop.body: ; CHECK-NEXT: [[IV_1:%.*]] = add nuw nsw i16 [[IV]], 1 @@ -166,7 +166,7 @@ define void @no_checks_in_loops_removable(ptr %ptr, ptr %lower, ptr %upper, i8 % ; CHECK-NEXT: [[PTR_IV:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV]] ; CHECK-NEXT: [[CMP_PTR_IV_LOWER:%.*]] = icmp ugt ptr [[LOWER]], [[PTR_IV]] ; CHECK-NEXT: [[CMP_PTR_IV_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV]] -; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP_PTR_IV_LOWER]], [[CMP_PTR_IV_UPPER]] +; CHECK-NEXT: [[OR:%.*]] = or i1 false, [[CMP_PTR_IV_UPPER]] ; CHECK-NEXT: br i1 [[OR]], label [[TRAP]], label [[LOOP_BODY:%.*]] ; CHECK: loop.body: ; CHECK-NEXT: [[IV_1:%.*]] = add nuw nsw i16 [[IV]], 1 diff --git a/llvm/test/Transforms/ConstraintElimination/loops-header-tested-base.ll b/llvm/test/Transforms/ConstraintElimination/loops-header-tested-base.ll index 8245e84108e42..7b928a030614b 100644 --- a/llvm/test/Transforms/ConstraintElimination/loops-header-tested-base.ll +++ b/llvm/test/Transforms/ConstraintElimination/loops-header-tested-base.ll @@ -20,8 +20,7 @@ define void @loop_phi_pos_start_value(i32 %y, i1 %c, i32 %n) { ; CHECK-NEXT: call void @use(i1 [[C_2]]) ; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i32 [[X]], 9 ; CHECK-NEXT: call void @use(i1 [[C_3]]) -; CHECK-NEXT: [[C_4:%.*]] = icmp sge i32 [[X]], 0 -; CHECK-NEXT: call void @use(i1 [[C_4]]) +; CHECK-NEXT: call void @use(i1 true) ; CHECK-NEXT: [[C_5:%.*]] = icmp sge i32 [[X]], 9 ; CHECK-NEXT: call void @use(i1 [[C_5]]) ; CHECK-NEXT: [[X_NEXT]] = add nsw i32 [[X]], 1 diff --git a/llvm/test/Transforms/ConstraintElimination/loops-header-tested-pointer-cmps.ll b/llvm/test/Transforms/ConstraintElimination/loops-header-tested-pointer-cmps.ll index b8ae10f42f036..66ce1ffc6ebc9 100644 --- a/llvm/test/Transforms/ConstraintElimination/loops-header-tested-pointer-cmps.ll +++ b/llvm/test/Transforms/ConstraintElimination/loops-header-tested-pointer-cmps.ll @@ -19,9 +19,8 @@ define void @test1(ptr %src, ptr noundef %lower, ptr noundef %upper, i8 %N) { ; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP_BODY:%.*]] ; CHECK: loop.body: ; CHECK-NEXT: [[SRC_IV:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[IV]] -; CHECK-NEXT: [[CMP_IV_START:%.*]] = icmp ult ptr [[SRC_IV]], [[LOWER]] ; CHECK-NEXT: [[CMP_IV_END:%.*]] = icmp uge ptr [[SRC_IV]], [[UPPER]] -; CHECK-NEXT: [[OR_1:%.*]] = or i1 [[CMP_IV_START]], [[CMP_IV_END]] +; CHECK-NEXT: [[OR_1:%.*]] = or i1 false, [[CMP_IV_END]] ; CHECK-NEXT: br i1 [[OR_1]], label [[TRAP_BB]], label [[LOOP_BODY_1:%.*]] ; CHECK: loop.body.1: ; CHECK-NEXT: [[PTR_SRC_IV:%.*]] = bitcast ptr [[SRC_IV]] to ptr @@ -120,9 +119,8 @@ define void @test2(ptr %src, ptr %lower, ptr %upper, i8 %N) { ; CHECK-NEXT: br i1 [[EC]], label [[EXIT:%.*]], label [[LOOP_BODY:%.*]] ; CHECK: loop.body: ; CHECK-NEXT: [[SRC_IV:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[IV]] -; CHECK-NEXT: [[CMP_IV_START:%.*]] = icmp ult ptr [[SRC_IV]], [[LOWER]] ; CHECK-NEXT: [[CMP_IV_END:%.*]] = icmp uge ptr [[SRC_IV]], [[UPPER]] -; CHECK-NEXT: [[OR_1:%.*]] = or i1 [[CMP_IV_START]], [[CMP_IV_END]] +; CHECK-NEXT: [[OR_1:%.*]] = or i1 false, [[CMP_IV_END]] ; CHECK-NEXT: br i1 [[OR_1]], label [[TRAP_BB]], label [[LOOP_BODY_1:%.*]] ; CHECK: loop.body.1: ; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[IV]], 1 @@ -218,7 +216,7 @@ define void @test2_with_ne(ptr %src, ptr %lower, ptr %upper, i8 %N) { ; CHECK-NEXT: [[SRC_IV:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[IV]] ; CHECK-NEXT: [[CMP_IV_START:%.*]] = icmp ult ptr [[SRC_IV]], [[LOWER]] ; CHECK-NEXT: [[CMP_IV_END:%.*]] = icmp uge ptr [[SRC_IV]], [[UPPER]] -; CHECK-NEXT: [[OR_1:%.*]] = or i1 [[CMP_IV_START]], [[CMP_IV_END]] +; CHECK-NEXT: [[OR_1:%.*]] = or i1 false, [[CMP_IV_END]] ; CHECK-NEXT: br i1 [[OR_1]], label [[TRAP_BB]], label [[LOOP_BODY_1:%.*]] ; CHECK: loop.body.1: ; CHECK-NEXT: [[ADD_1:%.*]] = add nuw nsw i8 [[IV]], 1 @@ -314,7 +312,7 @@ define void @test3(ptr %src, ptr %lower, ptr %upper, i8 %N) { ; CHECK-NEXT: [[SRC_IV:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[IV]] ; CHECK-NEXT: [[CMP_IV_START:%.*]] = icmp ult ptr [[SRC_IV]], [[LOWER]] ; CHECK-NEXT: [[CMP_IV_END:%.*]] = icmp uge ptr [[SRC_IV]], [[UPPER]] -; CHECK-NEXT: [[OR_1:%.*]] = or i1 [[CMP_IV_START]], [[CMP_IV_END]] +; CHECK-NEXT: [[OR_1:%.*]] = or i1 false, [[CMP_IV_END]] ; CHECK-NEXT: br i1 [[OR_1]], label [[TRAP_BB]], label [[LOOP_BODY_1:%.*]] ; CHECK: loop.body.1: ; CHECK-NEXT: [[SRC_IV_1:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i8 [[NEXT]] diff --git a/llvm/test/Transforms/ConstraintElimination/max-row-limit.ll b/llvm/test/Transforms/ConstraintElimination/max-row-limit.ll index 752e012791ee4..0e078109ed663 100644 --- a/llvm/test/Transforms/ConstraintElimination/max-row-limit.ll +++ b/llvm/test/Transforms/ConstraintElimination/max-row-limit.ll @@ -1,7 +1,7 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -passes=constraint-elimination -S %s | FileCheck --check-prefixes=COMMON,SIMP %s -; RUN: opt -passes=constraint-elimination -constraint-elimination-max-rows=4 -S %s | FileCheck --check-prefixes=COMMON,SIMP %s -; RUN: opt -passes=constraint-elimination -constraint-elimination-max-rows=3 -S %s | FileCheck --check-prefixes=COMMON,NOSIMP %s +; RUN: opt -passes=constraint-elimination -constraint-elimination-max-rows=9 -S %s | FileCheck --check-prefixes=COMMON,SIMP %s +; RUN: opt -passes=constraint-elimination -constraint-elimination-max-rows=8 -S %s | FileCheck --check-prefixes=COMMON,NOSIMP %s define i1 @test_max_row_limit(i32 %l0, i32 %l1, i32 %l2, i32 %l3, i32 %l4) { diff --git a/llvm/test/Transforms/ConstraintElimination/mul.ll b/llvm/test/Transforms/ConstraintElimination/mul.ll index c8a1d31a48d56..362cd33fe6505 100644 --- a/llvm/test/Transforms/ConstraintElimination/mul.ll +++ b/llvm/test/Transforms/ConstraintElimination/mul.ll @@ -9,8 +9,7 @@ define i1 @test_mul_const_nuw_unsigned_1(i8 %start, i8 %high) { ; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[START:%.*]], 4 ; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] ; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) -; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]] -; CHECK-NEXT: ret i1 [[T_1]] +; CHECK-NEXT: ret i1 true ; entry: %start.mul.4 = mul nuw i8 %start, 4 @@ -28,8 +27,7 @@ define i1 @test_mul_const_nuw_unsigned_2(i8 %start, i8 %high) { ; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] ; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) ; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2 -; CHECK-NEXT: [[T:%.*]] = icmp ult i8 [[START_MUL_2]], [[HIGH]] -; CHECK-NEXT: ret i1 [[T]] +; CHECK-NEXT: ret i1 true ; entry: %start.mul.4 = mul nuw i8 %start, 4 @@ -163,8 +161,7 @@ define i1 @test_mul_const_nuw_unsigned_8(i8 %start, i8 %high) { ; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] ; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1 ; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3 -; CHECK-NEXT: [[T_5:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_MUL_3]] -; CHECK-NEXT: ret i1 [[T_5]] +; CHECK-NEXT: ret i1 true ; entry: %start.mul.4 = mul nuw i8 %start, 4 @@ -191,8 +188,7 @@ define i1 @test_mul_const_nuw_unsigned_9(i8 %start, i8 %high) { ; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] ; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1 ; CHECK-NEXT: [[START_MUL_3:%.*]] = mul nuw i8 [[START]], 3 -; CHECK-NEXT: [[F_5:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_MUL_3]] -; CHECK-NEXT: ret i1 [[F_5]] +; CHECK-NEXT: ret i1 false ; entry: %start.mul.4 = mul nuw i8 %start, 4 @@ -371,8 +367,7 @@ define i1 @test_mul_add_const_nuw_unsigned_1(i8 %start, i8 %high) { ; CHECK-NEXT: [[START_MUL_4:%.*]] = mul nuw i8 [[ADD]], 4 ; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] ; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) -; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]] -; CHECK-NEXT: ret i1 [[T_1]] +; CHECK-NEXT: ret i1 true ; entry: %add = add nuw i8 %start, 3 @@ -392,8 +387,7 @@ define i1 @test_mul_add_const_nuw_unsigned_2(i8 %start, i8 %high) { ; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_MUL_4]], [[HIGH:%.*]] ; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) ; CHECK-NEXT: [[START_MUL_2:%.*]] = mul nuw i8 [[START]], 2 -; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_MUL_2]], [[HIGH]] -; CHECK-NEXT: ret i1 [[T_2]] +; CHECK-NEXT: ret i1 true ; entry: %add = add nuw i8 %start, 3 diff --git a/llvm/test/Transforms/ConstraintElimination/or-implied-by-operands.ll b/llvm/test/Transforms/ConstraintElimination/or-implied-by-operands.ll index fea6f2d8a5dc4..f5c108822b8cd 100644 --- a/llvm/test/Transforms/ConstraintElimination/or-implied-by-operands.ll +++ b/llvm/test/Transforms/ConstraintElimination/or-implied-by-operands.ll @@ -181,9 +181,8 @@ define i1 @test_remove_variables(i1 %c, ptr %A, i64 %B, ptr %C) { ; CHECK-NEXT: [[C_1:%.*]] = icmp ult ptr [[TMP0]], [[A:%.*]] ; CHECK-NEXT: br i1 [[C_1]], label [[THEN_2:%.*]], label [[ELSE_2:%.*]] ; CHECK: then.2: -; CHECK-NEXT: [[C_2:%.*]] = icmp ne ptr [[A]], null ; CHECK-NEXT: [[C_3:%.*]] = icmp sgt i64 [[B:%.*]], 0 -; CHECK-NEXT: [[OR:%.*]] = or i1 [[C_2]], [[C_3]] +; CHECK-NEXT: [[OR:%.*]] = or i1 true, [[C_3]] ; CHECK-NEXT: ret i1 [[OR]] ; CHECK: else.2: ; CHECK-NEXT: ret i1 false diff --git a/llvm/test/Transforms/ConstraintElimination/or.ll b/llvm/test/Transforms/ConstraintElimination/or.ll index 2f24519ddd1d5..01b8ca973efa5 100644 --- a/llvm/test/Transforms/ConstraintElimination/or.ll +++ b/llvm/test/Transforms/ConstraintElimination/or.ll @@ -135,15 +135,13 @@ define i1 @test_or_chain_ule_1(i4 %x, i4 %y, i4 %z, i4 %a, i4 %b) { ; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_7]] ; CHECK-NEXT: ret i1 [[RES_2]] ; CHECK: exit: -; CHECK-NEXT: [[RES_3:%.*]] = xor i1 false, false +; CHECK-NEXT: [[RES_3:%.*]] = xor i1 true, true ; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], true ; CHECK-NEXT: [[RES_5:%.*]] = xor i1 [[RES_4]], true ; CHECK-NEXT: [[RES_6:%.*]] = xor i1 [[RES_5]], true ; CHECK-NEXT: [[RES_7:%.*]] = xor i1 [[RES_6]], true -; CHECK-NEXT: [[C_8:%.*]] = icmp ule i4 [[X]], [[A]] -; CHECK-NEXT: [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_8]] -; CHECK-NEXT: [[C_9:%.*]] = icmp ule i4 [[X]], [[B:%.*]] -; CHECK-NEXT: [[RES_9:%.*]] = xor i1 [[RES_8]], [[C_9]] +; CHECK-NEXT: [[RES_8:%.*]] = xor i1 [[RES_7]], true +; CHECK-NEXT: [[RES_9:%.*]] = xor i1 [[RES_8]], true ; CHECK-NEXT: ret i1 [[RES_9]] ; entry: @@ -210,15 +208,13 @@ define i1 @test_or_chain_ule_2(i4 %x, i4 %y, i4 %z, i4 %a, i4 %b) { ; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], [[C_7]] ; CHECK-NEXT: ret i1 [[RES_2]] ; CHECK: exit: -; CHECK-NEXT: [[RES_3:%.*]] = xor i1 false, false +; CHECK-NEXT: [[RES_3:%.*]] = xor i1 true, true ; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], true ; CHECK-NEXT: [[RES_5:%.*]] = xor i1 [[RES_4]], true ; CHECK-NEXT: [[RES_6:%.*]] = xor i1 [[RES_5]], true ; CHECK-NEXT: [[RES_7:%.*]] = xor i1 [[RES_6]], true -; CHECK-NEXT: [[C_8:%.*]] = icmp ule i4 [[X]], [[A]] -; CHECK-NEXT: [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_8]] -; CHECK-NEXT: [[C_9:%.*]] = icmp ule i4 [[X]], [[B:%.*]] -; CHECK-NEXT: [[RES_9:%.*]] = xor i1 [[RES_8]], [[C_9]] +; CHECK-NEXT: [[RES_8:%.*]] = xor i1 [[RES_7]], true +; CHECK-NEXT: [[RES_9:%.*]] = xor i1 [[RES_8]], true ; CHECK-NEXT: ret i1 [[RES_9]] ; entry: @@ -354,8 +350,7 @@ define i1 @test_or_chain_with_and_ule(i4 %x, i4 %y, i4 %z, i4 %a, i4 %b) { ; CHECK-NEXT: [[RES_6:%.*]] = xor i1 [[RES_5]], [[C_8]] ; CHECK-NEXT: [[C_9:%.*]] = icmp ule i4 [[X]], [[B:%.*]] ; CHECK-NEXT: [[RES_7:%.*]] = xor i1 [[RES_6]], [[C_9]] -; CHECK-NEXT: [[C_10:%.*]] = icmp ule i4 2, [[X]] -; CHECK-NEXT: [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_10]] +; CHECK-NEXT: [[RES_8:%.*]] = xor i1 [[RES_7]], true ; CHECK-NEXT: [[C_11:%.*]] = icmp ugt i4 2, [[A]] ; CHECK-NEXT: [[RES_9:%.*]] = xor i1 [[RES_8]], [[C_11]] ; CHECK-NEXT: ret i1 [[RES_9]] diff --git a/llvm/test/Transforms/ConstraintElimination/reason-about-add-operands.ll b/llvm/test/Transforms/ConstraintElimination/reason-about-add-operands.ll index 3c95b192705a5..fb13417c7a6c7 100644 --- a/llvm/test/Transforms/ConstraintElimination/reason-about-add-operands.ll +++ b/llvm/test/Transforms/ConstraintElimination/reason-about-add-operands.ll @@ -14,8 +14,7 @@ define i1 @addition_with_extra_facts_and_args_ult_i64(i64 noundef %a, i64 nounde ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[B]], [[A]] ; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i64 [[ADD]], [[C]] ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]]) -; CHECK-NEXT: [[T:%.*]] = icmp ult i64 [[A]], [[C]] -; CHECK-NEXT: ret i1 [[T]] +; CHECK-NEXT: ret i1 true ; entry: %cmp.a = icmp ule i64 %a, 2048 @@ -40,8 +39,7 @@ define i1 @addition_with_extra_facts_and_args_ult_1(i16 noundef %a, i16 noundef ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]] ; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]] ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]]) -; CHECK-NEXT: [[T:%.*]] = icmp ult i16 [[A]], [[C]] -; CHECK-NEXT: ret i1 [[T]] +; CHECK-NEXT: ret i1 true ; entry: %cmp.a = icmp ule i16 %a, 2048 @@ -66,8 +64,7 @@ define i1 @addition_with_extra_facts_and_args_ult_2(i16 noundef %a, i16 noundef ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]] ; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]] ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]]) -; CHECK-NEXT: [[T:%.*]] = icmp ult i16 [[B]], [[C]] -; CHECK-NEXT: ret i1 [[T]] +; CHECK-NEXT: ret i1 true ; entry: %cmp.a = icmp ule i16 %a, 2048 @@ -92,8 +89,7 @@ define i1 @addition_with_extra_facts_and_args_ult_3(i16 noundef %a, i16 noundef ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]] ; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]] ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]]) -; CHECK-NEXT: [[F:%.*]] = icmp uge i16 [[A]], [[C]] -; CHECK-NEXT: ret i1 [[F]] +; CHECK-NEXT: ret i1 false ; entry: %cmp.a = icmp ule i16 %a, 2048 @@ -118,8 +114,7 @@ define i1 @addition_with_extra_facts_and_args_ult_4(i16 noundef %a, i16 noundef ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]] ; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]] ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]]) -; CHECK-NEXT: [[F:%.*]] = icmp uge i16 [[B]], [[C]] -; CHECK-NEXT: ret i1 [[F]] +; CHECK-NEXT: ret i1 false ; entry: %cmp.a = icmp ule i16 %a, 2048 @@ -201,8 +196,7 @@ define i1 @addition_with_extra_facts_and_return_value_ult_1() { ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]] ; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]] ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]]) -; CHECK-NEXT: [[T:%.*]] = icmp ult i16 [[A]], [[C]] -; CHECK-NEXT: ret i1 [[T]] +; CHECK-NEXT: ret i1 true ; entry: %a = call i16 @get() @@ -232,8 +226,7 @@ define i1 @addition_with_extra_facts_and_return_value_ult_2() { ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]] ; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]] ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]]) -; CHECK-NEXT: [[F:%.*]] = icmp uge i16 [[A]], [[C]] -; CHECK-NEXT: ret i1 [[F]] +; CHECK-NEXT: ret i1 false ; entry: %a = call i16 @get() @@ -259,8 +252,7 @@ define i1 @addition_no_extra_facts_with_return_value_ult_1() { ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]] ; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]] ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]]) -; CHECK-NEXT: [[T:%.*]] = icmp ult i16 [[A]], [[C]] -; CHECK-NEXT: ret i1 [[T]] +; CHECK-NEXT: ret i1 true ; entry: %a = call i16 @get() @@ -282,8 +274,7 @@ define i1 @addition_no_extra_facts_with_return_value_ult_2() { ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i16 [[B]], [[A]] ; CHECK-NEXT: [[CMP_ADD:%.*]] = icmp ult i16 [[ADD]], [[C]] ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ADD]]) -; CHECK-NEXT: [[F:%.*]] = icmp uge i16 [[A]], [[C]] -; CHECK-NEXT: ret i1 [[F]] +; CHECK-NEXT: ret i1 false ; entry: %a = call i16 @get() @@ -326,8 +317,7 @@ define i1 @assume_x_ugt_y_plus_y_via_shl_eq(i8 %x, i8 %y) { ; CHECK-NEXT: [[S:%.*]] = shl nuw i8 [[Y]], 1 ; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X]], [[S]] ; CHECK-NEXT: tail call void @llvm.assume(i1 [[C_1]]) -; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X]], [[Y]] -; CHECK-NEXT: ret i1 [[C_2]] +; CHECK-NEXT: ret i1 false ; %s = shl nuw i8 %y, 1 %c.1 = icmp ugt i8 %x, %s @@ -358,8 +348,7 @@ define i1 @assume_x_ugt_y_plus_y_via_add_eq(i8 %x, i8 %y) { ; CHECK-NEXT: [[S:%.*]] = add nuw i8 [[Y]], [[Y]] ; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X]], [[S]] ; CHECK-NEXT: tail call void @llvm.assume(i1 [[C_1]]) -; CHECK-NEXT: [[C_2:%.*]] = icmp eq i8 [[X]], [[Y]] -; CHECK-NEXT: ret i1 [[C_2]] +; CHECK-NEXT: ret i1 false ; %s = add nuw i8 %y, %y %c.1 = icmp ugt i8 %x, %s @@ -390,8 +379,7 @@ define i1 @assume_x_ugt_y_plus_y_via_shl_ne(i8 %x, i8 %y) { ; CHECK-NEXT: [[S:%.*]] = shl nuw i8 [[Y]], 1 ; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[X]], [[S]] ; CHECK-NEXT: tail call void @llvm.assume(i1 [[C_1]]) -; CHECK-NEXT: [[C_2:%.*]] = icmp ne i8 [[X]], [[Y]] -; CHECK-NEXT: ret i1 [[C_2]] +; CHECK-NEXT: ret i1 true ; %s = shl nuw i8 %y, 1 %c.1 = icmp ugt i8 %x, %s diff --git a/llvm/test/Transforms/ConstraintElimination/reproducer-remarks-debug.ll b/llvm/test/Transforms/ConstraintElimination/reproducer-remarks-debug.ll index 4fdc8e583112e..f0b20fb360597 100644 --- a/llvm/test/Transforms/ConstraintElimination/reproducer-remarks-debug.ll +++ b/llvm/test/Transforms/ConstraintElimination/reproducer-remarks-debug.ll @@ -5,6 +5,7 @@ target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" ; CHECK: Condition icmp eq ptr %a, null implied by dominating constraints +; CHECK-NEXT: -1 * %a <= 0 ; CHECK-NEXT: %a <= 0 ; CHECK-NEXT: Creating reproducer for %c.2 = icmp eq ptr %a, null ; CHECK-NEXT: found external input ptr %a diff --git a/llvm/test/Transforms/ConstraintElimination/reproducer-remarks.ll b/llvm/test/Transforms/ConstraintElimination/reproducer-remarks.ll index 9f8ae3825a8d8..f912abfc24a8f 100644 --- a/llvm/test/Transforms/ConstraintElimination/reproducer-remarks.ll +++ b/llvm/test/Transforms/ConstraintElimination/reproducer-remarks.ll @@ -183,14 +183,14 @@ else: define i32 @test_branch(i32 %a) { ; CHECK-LABEL: define i1 @"{{.+}}test_branchrepro"(i32 %a) { ; CHECK-NEXT: entry: -; CHECK-NEXT: %0 = icmp ult i32 %a, 0 +; CHECK-NEXT: %0 = icmp ult i32 %a, 4 ; CHECK-NEXT: call void @llvm.assume(i1 %0) ; CHECK-NEXT: %c.2 = icmp ugt i32 0, 0 ; CHECK-NEXT: ret i1 %c.2 ; CHECK-NEXT: } ; entry: - %c.1 = icmp ult i32 %a, 0 + %c.1 = icmp ult i32 %a, 4 br i1 %c.1, label %then, label %exit then: diff --git a/llvm/test/Transforms/ConstraintElimination/shl.ll b/llvm/test/Transforms/ConstraintElimination/shl.ll index 9f98a9d3a57ca..9fe8c147017b0 100644 --- a/llvm/test/Transforms/ConstraintElimination/shl.ll +++ b/llvm/test/Transforms/ConstraintElimination/shl.ll @@ -9,8 +9,7 @@ define i1 @test_shl_const_nuw_unsigned_1(i8 %start, i8 %high) { ; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[START:%.*]], 4 ; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] ; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) -; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]] -; CHECK-NEXT: ret i1 [[T_1]] +; CHECK-NEXT: ret i1 true ; entry: %start.shl.4 = shl nuw i8 %start, 4 @@ -28,8 +27,7 @@ define i1 @test_shl_const_nuw_unsigned_2(i8 %start, i8 %high) { ; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] ; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) ; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2 -; CHECK-NEXT: [[T:%.*]] = icmp ult i8 [[START_SHL_2]], [[HIGH]] -; CHECK-NEXT: ret i1 [[T]] +; CHECK-NEXT: ret i1 true ; entry: %start.shl.4 = shl nuw i8 %start, 4 @@ -49,8 +47,7 @@ define i1 @test_shl_const_nuw_unsigned_3(i8 %start, i8 %high) { ; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) ; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2 ; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] -; CHECK-NEXT: [[T:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_SHL_2]] -; CHECK-NEXT: ret i1 [[T]] +; CHECK-NEXT: ret i1 true ; entry: %start.shl.4 = shl nuw i8 %start, 4 @@ -94,8 +91,7 @@ define i1 @test_shl_const_nuw_unsigned_5(i8 %start, i8 %high) { ; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) ; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] ; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] -; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_SHL_4]] -; CHECK-NEXT: ret i1 [[T_4]] +; CHECK-NEXT: ret i1 true ; entry: %start.shl.4 = shl nuw i8 %start, 4 @@ -167,8 +163,7 @@ define i1 @test_shl_const_nuw_unsigned_8(i8 %start, i8 %high) { ; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] ; CHECK-NEXT: [[START_ADD_2_1:%.*]] = add nuw i8 [[START_ADD_2]], 1 ; CHECK-NEXT: [[START_SHL_3:%.*]] = shl nuw i8 [[START]], 3 -; CHECK-NEXT: [[T_5:%.*]] = icmp ule i8 [[START_ADD_1]], [[START_SHL_3]] -; CHECK-NEXT: ret i1 [[T_5]] +; CHECK-NEXT: ret i1 true ; entry: %start.shl.4 = shl nuw i8 %start, 4 @@ -296,8 +291,7 @@ define i1 @test_shl_add_const_nuw_unsigned_1(i8 %start, i8 %high) { ; CHECK-NEXT: [[START_SHL_4:%.*]] = shl nuw i8 [[ADD]], 4 ; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] ; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) -; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START]], [[HIGH]] -; CHECK-NEXT: ret i1 [[T_1]] +; CHECK-NEXT: ret i1 true ; entry: %add = add nuw i8 %start, 3 @@ -317,8 +311,7 @@ define i1 @test_shl_add_const_nuw_unsigned_2(i8 %start, i8 %high) { ; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[START_SHL_4]], [[HIGH:%.*]] ; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) ; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2 -; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_SHL_2]], [[HIGH]] -; CHECK-NEXT: ret i1 [[T_2]] +; CHECK-NEXT: ret i1 true ; entry: %add = add nuw i8 %start, 3 @@ -340,8 +333,7 @@ define i1 @test_shl_add_const_nuw_unsigned_3(i8 %start, i8 %high) { ; CHECK-NEXT: call void @llvm.assume(i1 [[C_1]]) ; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] ; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] -; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8 [[START_ADD_2]], [[START_SHL_4]] -; CHECK-NEXT: ret i1 [[T_3]] +; CHECK-NEXT: ret i1 true ; entry: %add = add nuw i8 %start, 3 @@ -365,8 +357,7 @@ define i1 @test_shl_add_const_nuw_unsigned_4(i8 %start, i8 %high) { ; CHECK-NEXT: [[START_SHL_2:%.*]] = shl nuw i8 [[START]], 2 ; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] ; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] -; CHECK-NEXT: [[T_4:%.*]] = icmp ult i8 [[START_ADD_2]], [[START_SHL_4]] -; CHECK-NEXT: ret i1 [[T_4]] +; CHECK-NEXT: ret i1 true ; entry: %add = add nuw i8 %start, 3 @@ -391,8 +382,7 @@ define i1 @test_shl_add_const_nuw_unsigned_5(i8 %start, i8 %high) { ; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] ; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] ; CHECK-NEXT: [[START_ADD_2_12:%.*]] = add nuw i8 [[START_ADD_2]], 12 -; CHECK-NEXT: [[T_5:%.*]] = icmp ule i8 [[START_ADD_2_12]], [[START_SHL_4]] -; CHECK-NEXT: ret i1 [[T_5]] +; CHECK-NEXT: ret i1 true ; entry: %add = add nuw i8 %start, 3 @@ -417,8 +407,7 @@ define i1 @test_shl_add_const_nuw_unsigned_6(i8 %start, i8 %high) { ; CHECK-NEXT: [[START_ADD_1:%.*]] = add nuw i8 [[START]], [[START]] ; CHECK-NEXT: [[START_ADD_2:%.*]] = add nuw i8 [[START_ADD_1]], [[START_ADD_1]] ; CHECK-NEXT: [[START_ADD_2_13:%.*]] = add nuw i8 [[START_ADD_2]], 13 -; CHECK-NEXT: [[F_1:%.*]] = icmp ule i8 [[START_ADD_2_13]], [[START_SHL_4]] -; CHECK-NEXT: ret i1 [[F_1]] +; CHECK-NEXT: ret i1 true ; entry: %add = add nuw i8 %start, 3 diff --git a/llvm/test/Transforms/ConstraintElimination/sub-nuw.ll b/llvm/test/Transforms/ConstraintElimination/sub-nuw.ll index 30051080178e1..0d90bc2fb3435 100644 --- a/llvm/test/Transforms/ConstraintElimination/sub-nuw.ll +++ b/llvm/test/Transforms/ConstraintElimination/sub-nuw.ll @@ -316,10 +316,9 @@ define i1 @sub_nuw_neg_i16(i16 %a) { ; CHECK-LABEL: @sub_nuw_neg_i16( ; CHECK-NEXT: entry: ; CHECK-NEXT: [[NEG2:%.*]] = sub nuw i16 [[A:%.*]], -305 -; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i16 0, [[NEG2]] -; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]] +; CHECK-NEXT: br i1 false, label [[EXIT_1:%.*]], label [[EXIT_2:%.*]] ; CHECK: exit.1: -; CHECK-NEXT: ret i1 false +; CHECK-NEXT: ret i1 true ; CHECK: exit.2: ; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i16 [[A]], 0 ; CHECK-NEXT: ret i1 [[C_3]] diff --git a/llvm/test/Transforms/PhaseOrdering/runtime-check-removal.ll b/llvm/test/Transforms/PhaseOrdering/runtime-check-removal.ll index 5128614de1d1e..89095048f2249 100644 --- a/llvm/test/Transforms/PhaseOrdering/runtime-check-removal.ll +++ b/llvm/test/Transforms/PhaseOrdering/runtime-check-removal.ll @@ -61,23 +61,6 @@ exit: define void @chained_conditions(i64 noundef %a, i64 noundef %b, i64 noundef %c, i64 noundef %d) #0 { ; CHECK-LABEL: @chained_conditions( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[A:%.*]], 2048 -; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i64 [[B:%.*]], 1024 -; CHECK-NEXT: [[OR_COND:%.*]] = or i1 [[CMP]], [[CMP1]] -; CHECK-NEXT: [[CMP3:%.*]] = icmp ugt i64 [[C:%.*]], 1024 -; CHECK-NEXT: [[OR_COND1:%.*]] = or i1 [[OR_COND]], [[CMP3]] -; CHECK-NEXT: br i1 [[OR_COND1]], label [[IF_END10:%.*]], label [[IF_END:%.*]] -; CHECK: if.end: -; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[B]], [[A]] -; CHECK-NEXT: [[ADD4:%.*]] = add nuw nsw i64 [[ADD]], [[C]] -; CHECK-NEXT: [[CMP5_NOT:%.*]] = icmp uge i64 [[ADD4]], [[D:%.*]] -; CHECK-NEXT: [[CMP8_NOT:%.*]] = icmp ult i64 [[A]], [[D]] -; CHECK-NEXT: [[OR_COND7:%.*]] = or i1 [[CMP5_NOT]], [[CMP8_NOT]] -; CHECK-NEXT: br i1 [[OR_COND7]], label [[IF_END10]], label [[IF_THEN9:%.*]] -; CHECK: if.then9: -; CHECK-NEXT: tail call void @bar() -; CHECK-NEXT: br label [[IF_END10]] -; CHECK: if.end10: ; CHECK-NEXT: ret void ; entry: