diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -878,7 +878,7 @@ Instruction::BinaryOps Opcode = I.getOpcode(); SimplifyQuery Q = SQ.getWithInstruction(&I); - + SelectInst *InnerSelect = nullptr; Value *Cond, *True = nullptr, *False = nullptr; // Special-case for add/negate combination. Replace the zero in the negation @@ -921,6 +921,13 @@ False = simplifyBinOp(Opcode, C, RHS, FMF, Q); if (Value *NewSel = foldAddNegate(B, C, RHS)) return NewSel; + if (I.getOpcode() == BinaryOperator::Xor) return nullptr; + if (!True && isa_and_nonnull(False)) + True = Builder.CreateBinOp(Opcode, B, RHS); + else if (!False && isa_and_nonnull(True)) + False = Builder.CreateBinOp(Opcode, C, RHS); + + InnerSelect = cast(LHS); } else if (RHSIsSelect && RHS->hasOneUse()) { // X op (D ? E : F) -> D ? (X op E) : (X op F) Cond = D; @@ -928,13 +935,22 @@ False = simplifyBinOp(Opcode, LHS, F, FMF, Q); if (Value *NewSel = foldAddNegate(E, F, LHS)) return NewSel; + + if (!True && isa_and_nonnull(False)) + True = Builder.CreateBinOp(Opcode, LHS, E); + else if (!False && isa_and_nonnull(True)) + False = Builder.CreateBinOp(Opcode, LHS, F); + + InnerSelect = cast(RHS); } if (!True || !False) return nullptr; - Value *SI = Builder.CreateSelect(Cond, True, False); + auto *SI = cast(Builder.CreateSelect(Cond, True, False)); SI->takeName(&I); + if (InnerSelect) + SI->copyMetadata(*InnerSelect); return SI; } diff --git a/llvm/test/Transforms/InstCombine/and-or-icmps.ll b/llvm/test/Transforms/InstCombine/and-or-icmps.ll --- a/llvm/test/Transforms/InstCombine/and-or-icmps.ll +++ b/llvm/test/Transforms/InstCombine/and-or-icmps.ll @@ -51,8 +51,8 @@ define i1 @PR2330(i32 %a, i32 %b) { ; CHECK-LABEL: @PR2330( ; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[B:%.*]], [[A:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 8 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[AND:%.*]] = icmp ult i32 [[TMP1]], 8 +; CHECK-NEXT: ret i1 [[AND]] ; %cmp1 = icmp ult i32 %a, 8 %cmp2 = icmp ult i32 %b, 8 @@ -80,8 +80,8 @@ define i1 @or_eq_with_one_bit_diff_constants1(i32 %x) { ; CHECK-LABEL: @or_eq_with_one_bit_diff_constants1( ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -2 -; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 50 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[OR:%.*]] = icmp eq i32 [[TMP1]], 50 +; CHECK-NEXT: ret i1 [[OR]] ; %cmp1 = icmp eq i32 %x, 50 %cmp2 = icmp eq i32 %x, 51 @@ -92,8 +92,8 @@ define i1 @or_eq_with_one_bit_diff_constants1_logical(i32 %x) { ; CHECK-LABEL: @or_eq_with_one_bit_diff_constants1_logical( ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -2 -; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 50 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[OR:%.*]] = icmp eq i32 [[TMP1]], 50 +; CHECK-NEXT: ret i1 [[OR]] ; %cmp1 = icmp eq i32 %x, 50 %cmp2 = icmp eq i32 %x, 51 @@ -106,8 +106,8 @@ define i1 @and_ne_with_one_bit_diff_constants1(i32 %x) { ; CHECK-LABEL: @and_ne_with_one_bit_diff_constants1( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -52 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[AND:%.*]] = icmp ult i32 [[TMP1]], -2 +; CHECK-NEXT: ret i1 [[AND]] ; %cmp1 = icmp ne i32 %x, 51 %cmp2 = icmp ne i32 %x, 50 @@ -118,8 +118,8 @@ define i1 @and_ne_with_one_bit_diff_constants1_logical(i32 %x) { ; CHECK-LABEL: @and_ne_with_one_bit_diff_constants1_logical( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -52 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[AND:%.*]] = icmp ult i32 [[TMP1]], -2 +; CHECK-NEXT: ret i1 [[AND]] ; %cmp1 = icmp ne i32 %x, 51 %cmp2 = icmp ne i32 %x, 50 @@ -132,8 +132,8 @@ define i1 @or_eq_with_one_bit_diff_constants2(i32 %x) { ; CHECK-LABEL: @or_eq_with_one_bit_diff_constants2( ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -33 -; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 65 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[OR:%.*]] = icmp eq i32 [[TMP1]], 65 +; CHECK-NEXT: ret i1 [[OR]] ; %cmp1 = icmp eq i32 %x, 97 %cmp2 = icmp eq i32 %x, 65 @@ -144,8 +144,8 @@ define i1 @or_eq_with_one_bit_diff_constants2_logical(i32 %x) { ; CHECK-LABEL: @or_eq_with_one_bit_diff_constants2_logical( ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -33 -; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 65 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[OR:%.*]] = icmp eq i32 [[TMP1]], 65 +; CHECK-NEXT: ret i1 [[OR]] ; %cmp1 = icmp eq i32 %x, 97 %cmp2 = icmp eq i32 %x, 65 @@ -156,8 +156,8 @@ define i1 @and_ne_with_one_bit_diff_constants2(i19 %x) { ; CHECK-LABEL: @and_ne_with_one_bit_diff_constants2( ; CHECK-NEXT: [[TMP1:%.*]] = and i19 [[X:%.*]], -129 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i19 [[TMP1]], 65 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[AND:%.*]] = icmp ne i19 [[TMP1]], 65 +; CHECK-NEXT: ret i1 [[AND]] ; %cmp1 = icmp ne i19 %x, 65 %cmp2 = icmp ne i19 %x, 193 @@ -168,8 +168,8 @@ define i1 @and_ne_with_one_bit_diff_constants2_logical(i19 %x) { ; CHECK-LABEL: @and_ne_with_one_bit_diff_constants2_logical( ; CHECK-NEXT: [[TMP1:%.*]] = and i19 [[X:%.*]], -129 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i19 [[TMP1]], 65 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[AND:%.*]] = icmp ne i19 [[TMP1]], 65 +; CHECK-NEXT: ret i1 [[AND]] ; %cmp1 = icmp ne i19 %x, 65 %cmp2 = icmp ne i19 %x, 193 @@ -182,8 +182,8 @@ define i1 @or_eq_with_one_bit_diff_constants3(i8 %x) { ; CHECK-LABEL: @or_eq_with_one_bit_diff_constants3( ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], 127 -; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 126 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[OR:%.*]] = icmp eq i8 [[TMP1]], 126 +; CHECK-NEXT: ret i1 [[OR]] ; %cmp1 = icmp eq i8 %x, 254 %cmp2 = icmp eq i8 %x, 126 @@ -194,8 +194,8 @@ define i1 @or_eq_with_one_bit_diff_constants3_logical(i8 %x) { ; CHECK-LABEL: @or_eq_with_one_bit_diff_constants3_logical( ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], 127 -; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i8 [[TMP1]], 126 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[OR:%.*]] = icmp eq i8 [[TMP1]], 126 +; CHECK-NEXT: ret i1 [[OR]] ; %cmp1 = icmp eq i8 %x, 254 %cmp2 = icmp eq i8 %x, 126 @@ -206,8 +206,8 @@ define i1 @and_ne_with_one_bit_diff_constants3(i8 %x) { ; CHECK-LABEL: @and_ne_with_one_bit_diff_constants3( ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], 127 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i8 [[TMP1]], 65 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[AND:%.*]] = icmp ne i8 [[TMP1]], 65 +; CHECK-NEXT: ret i1 [[AND]] ; %cmp1 = icmp ne i8 %x, 65 %cmp2 = icmp ne i8 %x, 193 @@ -218,8 +218,8 @@ define i1 @and_ne_with_one_bit_diff_constants3_logical(i8 %x) { ; CHECK-LABEL: @and_ne_with_one_bit_diff_constants3_logical( ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], 127 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i8 [[TMP1]], 65 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[AND:%.*]] = icmp ne i8 [[TMP1]], 65 +; CHECK-NEXT: ret i1 [[AND]] ; %cmp1 = icmp ne i8 %x, 65 %cmp2 = icmp ne i8 %x, 193 @@ -233,8 +233,8 @@ define i1 @or_eq_with_diff_one(i8 %x) { ; CHECK-LABEL: @or_eq_with_diff_one( ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X:%.*]], -13 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 2 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[OR:%.*]] = icmp ult i8 [[TMP1]], 2 +; CHECK-NEXT: ret i1 [[OR]] ; %cmp1 = icmp eq i8 %x, 13 %cmp2 = icmp eq i8 %x, 14 @@ -245,8 +245,8 @@ define i1 @or_eq_with_diff_one_logical(i8 %x) { ; CHECK-LABEL: @or_eq_with_diff_one_logical( ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X:%.*]], -13 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 2 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[OR:%.*]] = icmp ult i8 [[TMP1]], 2 +; CHECK-NEXT: ret i1 [[OR]] ; %cmp1 = icmp eq i8 %x, 13 %cmp2 = icmp eq i8 %x, 14 @@ -259,8 +259,8 @@ define i1 @and_ne_with_diff_one(i32 %x) { ; CHECK-LABEL: @and_ne_with_diff_one( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -41 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[AND:%.*]] = icmp ult i32 [[TMP1]], -2 +; CHECK-NEXT: ret i1 [[AND]] ; %cmp1 = icmp ne i32 %x, 40 %cmp2 = icmp ne i32 %x, 39 @@ -271,8 +271,8 @@ define i1 @and_ne_with_diff_one_logical(i32 %x) { ; CHECK-LABEL: @and_ne_with_diff_one_logical( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -41 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[AND:%.*]] = icmp ult i32 [[TMP1]], -2 +; CHECK-NEXT: ret i1 [[AND]] ; %cmp1 = icmp ne i32 %x, 40 %cmp2 = icmp ne i32 %x, 39 @@ -286,8 +286,8 @@ define i1 @or_eq_with_diff_one_signed(i32 %x) { ; CHECK-LABEL: @or_eq_with_diff_one_signed( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], 1 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 2 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[OR:%.*]] = icmp ult i32 [[TMP1]], 2 +; CHECK-NEXT: ret i1 [[OR]] ; %cmp1 = icmp eq i32 %x, 0 %cmp2 = icmp eq i32 %x, -1 @@ -298,8 +298,8 @@ define i1 @or_eq_with_diff_one_signed_logical(i32 %x) { ; CHECK-LABEL: @or_eq_with_diff_one_signed_logical( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], 1 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 2 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[OR:%.*]] = icmp ult i32 [[TMP1]], 2 +; CHECK-NEXT: ret i1 [[OR]] ; %cmp1 = icmp eq i32 %x, 0 %cmp2 = icmp eq i32 %x, -1 @@ -310,8 +310,8 @@ define i1 @and_ne_with_diff_one_signed(i64 %x) { ; CHECK-LABEL: @and_ne_with_diff_one_signed( ; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[X:%.*]], -1 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i64 [[TMP1]], -2 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[AND:%.*]] = icmp ult i64 [[TMP1]], -2 +; CHECK-NEXT: ret i1 [[AND]] ; %cmp1 = icmp ne i64 %x, -1 %cmp2 = icmp ne i64 %x, 0 @@ -322,8 +322,8 @@ define i1 @and_ne_with_diff_one_signed_logical(i64 %x) { ; CHECK-LABEL: @and_ne_with_diff_one_signed_logical( ; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[X:%.*]], -1 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i64 [[TMP1]], -2 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[AND:%.*]] = icmp ult i64 [[TMP1]], -2 +; CHECK-NEXT: ret i1 [[AND]] ; %cmp1 = icmp ne i64 %x, -1 %cmp2 = icmp ne i64 %x, 0 @@ -336,8 +336,8 @@ define <2 x i1> @or_eq_with_one_bit_diff_constants2_splatvec(<2 x i32> %x) { ; CHECK-LABEL: @or_eq_with_one_bit_diff_constants2_splatvec( ; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[X:%.*]], -; CHECK-NEXT: [[TMP2:%.*]] = icmp eq <2 x i32> [[TMP1]], -; CHECK-NEXT: ret <2 x i1> [[TMP2]] +; CHECK-NEXT: [[OR:%.*]] = icmp eq <2 x i32> [[TMP1]], +; CHECK-NEXT: ret <2 x i1> [[OR]] ; %cmp1 = icmp eq <2 x i32> %x, %cmp2 = icmp eq <2 x i32> %x, @@ -348,8 +348,8 @@ define <2 x i1> @and_ne_with_diff_one_splatvec(<2 x i32> %x) { ; CHECK-LABEL: @and_ne_with_diff_one_splatvec( ; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i32> [[X:%.*]], -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult <2 x i32> [[TMP1]], -; CHECK-NEXT: ret <2 x i1> [[TMP2]] +; CHECK-NEXT: [[AND:%.*]] = icmp ult <2 x i32> [[TMP1]], +; CHECK-NEXT: ret <2 x i1> [[AND]] ; %cmp1 = icmp ne <2 x i32> %x, %cmp2 = icmp ne <2 x i32> %x, @@ -420,8 +420,8 @@ define i1 @PR42691_1(i32 %x) { ; CHECK-LABEL: @PR42691_1( -; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[X:%.*]], 2147483646 -; CHECK-NEXT: ret i1 [[TMP1]] +; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[X:%.*]], 2147483646 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp slt i32 %x, 0 %c2 = icmp eq i32 %x, 2147483647 @@ -431,8 +431,8 @@ define i1 @PR42691_1_logical(i32 %x) { ; CHECK-LABEL: @PR42691_1_logical( -; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[X:%.*]], 2147483646 -; CHECK-NEXT: ret i1 [[TMP1]] +; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[X:%.*]], 2147483646 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp slt i32 %x, 0 %c2 = icmp eq i32 %x, 2147483647 @@ -442,8 +442,8 @@ define i1 @PR42691_2(i32 %x) { ; CHECK-LABEL: @PR42691_2( -; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 [[X:%.*]], -2 -; CHECK-NEXT: ret i1 [[TMP1]] +; CHECK-NEXT: [[C:%.*]] = icmp sgt i32 [[X:%.*]], -2 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp ult i32 %x, 2147483648 %c2 = icmp eq i32 %x, 4294967295 @@ -453,8 +453,8 @@ define i1 @PR42691_2_logical(i32 %x) { ; CHECK-LABEL: @PR42691_2_logical( -; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 [[X:%.*]], -2 -; CHECK-NEXT: ret i1 [[TMP1]] +; CHECK-NEXT: [[C:%.*]] = icmp sgt i32 [[X:%.*]], -2 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp ult i32 %x, 2147483648 %c2 = icmp eq i32 %x, 4294967295 @@ -464,8 +464,8 @@ define i1 @PR42691_3(i32 %x) { ; CHECK-LABEL: @PR42691_3( -; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 [[X:%.*]], -2147483647 -; CHECK-NEXT: ret i1 [[TMP1]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[X:%.*]], -2147483647 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp sge i32 %x, 0 %c2 = icmp eq i32 %x, -2147483648 @@ -475,8 +475,8 @@ define i1 @PR42691_3_logical(i32 %x) { ; CHECK-LABEL: @PR42691_3_logical( -; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i32 [[X:%.*]], -2147483647 -; CHECK-NEXT: ret i1 [[TMP1]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[X:%.*]], -2147483647 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp sge i32 %x, 0 %c2 = icmp eq i32 %x, -2147483648 @@ -486,8 +486,8 @@ define i1 @PR42691_4(i32 %x) { ; CHECK-LABEL: @PR42691_4( -; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 [[X:%.*]], 1 -; CHECK-NEXT: ret i1 [[TMP1]] +; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X:%.*]], 1 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp uge i32 %x, 2147483648 %c2 = icmp eq i32 %x, 0 @@ -497,8 +497,8 @@ define i1 @PR42691_4_logical(i32 %x) { ; CHECK-LABEL: @PR42691_4_logical( -; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 [[X:%.*]], 1 -; CHECK-NEXT: ret i1 [[TMP1]] +; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[X:%.*]], 1 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp uge i32 %x, 2147483648 %c2 = icmp eq i32 %x, 0 @@ -509,8 +509,8 @@ define i1 @PR42691_5(i32 %x) { ; CHECK-LABEL: @PR42691_5( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -2147483647 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2147483646 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[TMP1]], -2147483646 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp slt i32 %x, 1 %c2 = icmp eq i32 %x, 2147483647 @@ -521,8 +521,8 @@ define i1 @PR42691_5_logical(i32 %x) { ; CHECK-LABEL: @PR42691_5_logical( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -2147483647 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2147483646 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[TMP1]], -2147483646 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp slt i32 %x, 1 %c2 = icmp eq i32 %x, 2147483647 @@ -533,8 +533,8 @@ define i1 @PR42691_6(i32 %x) { ; CHECK-LABEL: @PR42691_6( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], 1 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2147483646 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[TMP1]], -2147483646 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp ult i32 %x, 2147483649 %c2 = icmp eq i32 %x, 4294967295 @@ -545,8 +545,8 @@ define i1 @PR42691_6_logical(i32 %x) { ; CHECK-LABEL: @PR42691_6_logical( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], 1 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2147483646 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[TMP1]], -2147483646 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp ult i32 %x, 2147483649 %c2 = icmp eq i32 %x, 4294967295 @@ -557,8 +557,8 @@ define i1 @PR42691_7(i32 %x) { ; CHECK-LABEL: @PR42691_7( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -1 -; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[TMP1]], 0 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp uge i32 %x, 2147483649 %c2 = icmp eq i32 %x, 0 @@ -569,8 +569,8 @@ define i1 @PR42691_7_logical(i32 %x) { ; CHECK-LABEL: @PR42691_7_logical( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -1 -; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C:%.*]] = icmp slt i32 [[TMP1]], 0 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp uge i32 %x, 2147483649 %c2 = icmp eq i32 %x, 0 @@ -581,8 +581,8 @@ define i1 @PR42691_8(i32 %x) { ; CHECK-LABEL: @PR42691_8( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], 2147483647 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2147483635 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[TMP1]], -2147483635 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp slt i32 %x, 14 %c2 = icmp ne i32 %x, -2147483648 @@ -593,8 +593,8 @@ define i1 @PR42691_8_logical(i32 %x) { ; CHECK-LABEL: @PR42691_8_logical( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], 2147483647 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -2147483635 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[TMP1]], -2147483635 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp slt i32 %x, 14 %c2 = icmp ne i32 %x, -2147483648 @@ -605,8 +605,8 @@ define i1 @PR42691_9(i32 %x) { ; CHECK-LABEL: @PR42691_9( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -14 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 2147483633 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[TMP1]], 2147483633 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp sgt i32 %x, 13 %c2 = icmp ne i32 %x, 2147483647 @@ -617,8 +617,8 @@ define i1 @PR42691_9_logical(i32 %x) { ; CHECK-LABEL: @PR42691_9_logical( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -14 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 2147483633 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[TMP1]], 2147483633 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp sgt i32 %x, 13 %c2 = icmp ne i32 %x, 2147483647 @@ -629,8 +629,8 @@ define i1 @PR42691_10(i32 %x) { ; CHECK-LABEL: @PR42691_10( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -14 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -15 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[TMP1]], -15 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp ugt i32 %x, 13 %c2 = icmp ne i32 %x, 4294967295 @@ -641,8 +641,8 @@ define i1 @PR42691_10_logical(i32 %x) { ; CHECK-LABEL: @PR42691_10_logical( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[X:%.*]], -14 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], -15 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[TMP1]], -15 +; CHECK-NEXT: ret i1 [[C]] ; %c1 = icmp ugt i32 %x, 13 %c2 = icmp ne i32 %x, 4294967295 @@ -654,8 +654,8 @@ ; CHECK-LABEL: @substitute_constant_and_eq_eq( ; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42 ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[Y:%.*]], 42 -; CHECK-NEXT: [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = and i1 [[C1]], [[TMP1]] +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp eq i8 %x, 42 %c2 = icmp eq i8 %x, %y @@ -667,8 +667,8 @@ ; CHECK-LABEL: @substitute_constant_and_eq_eq_logical( ; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42 ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[Y:%.*]], 42 -; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C1]], i1 [[TMP1]], i1 false -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = select i1 [[C1]], i1 [[TMP1]], i1 false +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp eq i8 %x, 42 %c2 = icmp eq i8 %x, %y @@ -680,8 +680,8 @@ ; CHECK-LABEL: @substitute_constant_and_eq_eq_commute( ; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42 ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[Y:%.*]], 42 -; CHECK-NEXT: [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = and i1 [[C1]], [[TMP1]] +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp eq i8 %x, 42 %c2 = icmp eq i8 %x, %y @@ -693,8 +693,8 @@ ; CHECK-LABEL: @substitute_constant_and_eq_eq_commute_logical( ; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42 ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[Y:%.*]], 42 -; CHECK-NEXT: [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = and i1 [[C1]], [[TMP1]] +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp eq i8 %x, 42 %c2 = icmp eq i8 %x, %y @@ -706,8 +706,8 @@ ; CHECK-LABEL: @substitute_constant_and_eq_ugt_swap( ; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i8 [[Y:%.*]], 42 -; CHECK-NEXT: [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = and i1 [[C1]], [[TMP1]] +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp eq i8 %x, 42 %c2 = icmp ugt i8 %y, %x @@ -719,8 +719,8 @@ ; CHECK-LABEL: @substitute_constant_and_eq_ugt_swap_logical( ; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i8 [[Y:%.*]], 42 -; CHECK-NEXT: [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = and i1 [[C1]], [[TMP1]] +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp eq i8 %x, 42 %c2 = icmp ugt i8 %y, %x @@ -732,8 +732,8 @@ ; CHECK-LABEL: @substitute_constant_and_eq_ne_vec( ; CHECK-NEXT: [[C1:%.*]] = icmp eq <2 x i8> [[X:%.*]], ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i8> [[Y:%.*]], -; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i1> [[C1]], [[TMP1]] -; CHECK-NEXT: ret <2 x i1> [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = and <2 x i1> [[C1]], [[TMP1]] +; CHECK-NEXT: ret <2 x i1> [[R]] ; %c1 = icmp eq <2 x i8> %x, %c2 = icmp ne <2 x i8> %x, %y @@ -745,8 +745,8 @@ ; CHECK-LABEL: @substitute_constant_and_eq_ne_vec_logical( ; CHECK-NEXT: [[C1:%.*]] = icmp eq <2 x i8> [[X:%.*]], ; CHECK-NEXT: [[TMP1:%.*]] = icmp ne <2 x i8> [[Y:%.*]], -; CHECK-NEXT: [[TMP2:%.*]] = select <2 x i1> [[C1]], <2 x i1> [[TMP1]], <2 x i1> zeroinitializer -; CHECK-NEXT: ret <2 x i1> [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = select <2 x i1> [[C1]], <2 x i1> [[TMP1]], <2 x i1> zeroinitializer +; CHECK-NEXT: ret <2 x i1> [[R]] ; %c1 = icmp eq <2 x i8> %x, %c2 = icmp ne <2 x i8> %x, %y @@ -759,8 +759,8 @@ ; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42 ; CHECK-NEXT: call void @use(i1 [[C1]]) ; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i8 [[Y:%.*]], 42 -; CHECK-NEXT: [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = and i1 [[C1]], [[TMP1]] +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp eq i8 %x, 42 call void @use(i1 %c1) @@ -774,8 +774,8 @@ ; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[X:%.*]], 42 ; CHECK-NEXT: call void @use(i1 [[C1]]) ; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i8 [[Y:%.*]], 42 -; CHECK-NEXT: [[TMP2:%.*]] = and i1 [[C1]], [[TMP1]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = and i1 [[C1]], [[TMP1]] +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp eq i8 %x, 42 call void @use(i1 %c1) @@ -906,8 +906,8 @@ ; CHECK-LABEL: @substitute_constant_or_ne_swap_sle( ; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42 ; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i8 [[Y:%.*]], 43 -; CHECK-NEXT: [[TMP2:%.*]] = or i1 [[C1]], [[TMP1]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = or i1 [[C1]], [[TMP1]] +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp ne i8 %x, 42 %c2 = icmp sle i8 %y, %x @@ -919,8 +919,8 @@ ; CHECK-LABEL: @substitute_constant_or_ne_swap_sle_logical( ; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42 ; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i8 [[Y:%.*]], 43 -; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[C1]], i1 true, i1 [[TMP1]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = select i1 [[C1]], i1 true, i1 [[TMP1]] +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp ne i8 %x, 42 %c2 = icmp sle i8 %y, %x @@ -932,8 +932,8 @@ ; CHECK-LABEL: @substitute_constant_or_ne_uge_commute( ; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i8 [[Y:%.*]], 43 -; CHECK-NEXT: [[TMP2:%.*]] = or i1 [[C1]], [[TMP1]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = or i1 [[C1]], [[TMP1]] +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp ne i8 %x, 42 %c2 = icmp uge i8 %x, %y @@ -945,8 +945,8 @@ ; CHECK-LABEL: @substitute_constant_or_ne_uge_commute_logical( ; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i8 [[Y:%.*]], 43 -; CHECK-NEXT: [[TMP2:%.*]] = or i1 [[C1]], [[TMP1]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = or i1 [[C1]], [[TMP1]] +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp ne i8 %x, 42 %c2 = icmp uge i8 %x, %y @@ -1013,8 +1013,8 @@ ; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42 ; CHECK-NEXT: call void @use(i1 [[C1]]) ; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i8 [[Y:%.*]], 43 -; CHECK-NEXT: [[TMP2:%.*]] = or i1 [[C1]], [[TMP1]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = or i1 [[C1]], [[TMP1]] +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp ne i8 %x, 42 call void @use(i1 %c1) @@ -1028,8 +1028,8 @@ ; CHECK-NEXT: [[C1:%.*]] = icmp ne i8 [[X:%.*]], 42 ; CHECK-NEXT: call void @use(i1 [[C1]]) ; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i8 [[Y:%.*]], 43 -; CHECK-NEXT: [[TMP2:%.*]] = or i1 [[C1]], [[TMP1]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = or i1 [[C1]], [[TMP1]] +; CHECK-NEXT: ret i1 [[R]] ; %c1 = icmp ne i8 %x, 42 call void @use(i1 %c1) @@ -1073,8 +1073,8 @@ define i1 @or_ranges_overlap(i8 %x) { ; CHECK-LABEL: @or_ranges_overlap( ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X:%.*]], -5 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 16 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C7:%.*]] = icmp ult i8 [[TMP1]], 16 +; CHECK-NEXT: ret i1 [[C7]] ; %c1 = icmp uge i8 %x, 5 %c2 = icmp ule i8 %x, 10 @@ -1089,8 +1089,8 @@ define i1 @or_ranges_adjacent(i8 %x) { ; CHECK-LABEL: @or_ranges_adjacent( ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X:%.*]], -5 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 16 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C7:%.*]] = icmp ult i8 [[TMP1]], 16 +; CHECK-NEXT: ret i1 [[C7]] ; %c1 = icmp uge i8 %x, 5 %c2 = icmp ule i8 %x, 10 @@ -1105,10 +1105,10 @@ define i1 @or_ranges_separated(i8 %x) { ; CHECK-LABEL: @or_ranges_separated( ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X:%.*]], -5 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 6 -; CHECK-NEXT: [[TMP3:%.*]] = add i8 [[X]], -12 -; CHECK-NEXT: [[TMP4:%.*]] = icmp ult i8 [[TMP3]], 9 -; CHECK-NEXT: [[C7:%.*]] = or i1 [[TMP2]], [[TMP4]] +; CHECK-NEXT: [[C3:%.*]] = icmp ult i8 [[TMP1]], 6 +; CHECK-NEXT: [[TMP2:%.*]] = add i8 [[X]], -12 +; CHECK-NEXT: [[C6:%.*]] = icmp ult i8 [[TMP2]], 9 +; CHECK-NEXT: [[C7:%.*]] = or i1 [[C3]], [[C6]] ; CHECK-NEXT: ret i1 [[C7]] ; %c1 = icmp uge i8 %x, 5 @@ -1124,8 +1124,8 @@ define i1 @or_ranges_single_elem_right(i8 %x) { ; CHECK-LABEL: @or_ranges_single_elem_right( ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X:%.*]], -5 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 7 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C6:%.*]] = icmp ult i8 [[TMP1]], 7 +; CHECK-NEXT: ret i1 [[C6]] ; %c1 = icmp uge i8 %x, 5 %c2 = icmp ule i8 %x, 10 @@ -1138,8 +1138,8 @@ define i1 @or_ranges_single_elem_left(i8 %x) { ; CHECK-LABEL: @or_ranges_single_elem_left( ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X:%.*]], -4 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 7 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C6:%.*]] = icmp ult i8 [[TMP1]], 7 +; CHECK-NEXT: ret i1 [[C6]] ; %c1 = icmp uge i8 %x, 5 %c2 = icmp ule i8 %x, 10 @@ -1152,8 +1152,8 @@ define i1 @and_ranges_overlap(i8 %x) { ; CHECK-LABEL: @and_ranges_overlap( ; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X:%.*]], -7 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i8 [[TMP1]], 4 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[C7:%.*]] = icmp ult i8 [[TMP1]], 4 +; CHECK-NEXT: ret i1 [[C7]] ; %c1 = icmp uge i8 %x, 5 %c2 = icmp ule i8 %x, 10 @@ -1167,8 +1167,8 @@ define i1 @and_ranges_overlap_single(i8 %x) { ; CHECK-LABEL: @and_ranges_overlap_single( -; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i8 [[X:%.*]], 10 -; CHECK-NEXT: ret i1 [[TMP1]] +; CHECK-NEXT: [[C7:%.*]] = icmp eq i8 [[X:%.*]], 10 +; CHECK-NEXT: ret i1 [[C7]] ; %c1 = icmp uge i8 %x, 5 %c2 = icmp ule i8 %x, 10 @@ -1197,8 +1197,8 @@ define i1 @and_ranges_signed_pred(i64 %x) { ; CHECK-LABEL: @and_ranges_signed_pred( ; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[X:%.*]], -9223372036854775681 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i64 [[TMP1]], -9223372036854775553 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[T5:%.*]] = icmp ult i64 [[TMP1]], -9223372036854775553 +; CHECK-NEXT: ret i1 [[T5]] ; %t1 = add i64 %x, 127 %t2 = icmp slt i64 %t1, 1024 @@ -1212,8 +1212,8 @@ ; CHECK-LABEL: @and_two_ranges_to_mask_and_range( ; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[C:%.*]], -33 ; CHECK-NEXT: [[TMP2:%.*]] = add i8 [[TMP1]], -91 -; CHECK-NEXT: [[TMP3:%.*]] = icmp ult i8 [[TMP2]], -26 -; CHECK-NEXT: ret i1 [[TMP3]] +; CHECK-NEXT: [[AND:%.*]] = icmp ult i8 [[TMP2]], -26 +; CHECK-NEXT: ret i1 [[AND]] ; %c.off = add i8 %c, -97 %cmp1 = icmp ugt i8 %c.off, 25 @@ -1260,8 +1260,8 @@ define i1 @and_two_ranges_to_mask_and_range_no_add_on_one_range(i16 %x) { ; CHECK-LABEL: @and_two_ranges_to_mask_and_range_no_add_on_one_range( ; CHECK-NEXT: [[TMP1:%.*]] = and i16 [[X:%.*]], -20 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ugt i16 [[TMP1]], 11 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[AND:%.*]] = icmp ugt i16 [[TMP1]], 11 +; CHECK-NEXT: ret i1 [[AND]] ; %cmp1 = icmp uge i16 %x, 12 %cmp2 = icmp ult i16 %x, 16 @@ -1278,8 +1278,8 @@ ; CHECK-LABEL: @is_ascii_alphabetic( ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[CHAR:%.*]], -33 ; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], -65 -; CHECK-NEXT: [[TMP3:%.*]] = icmp ult i32 [[TMP2]], 26 -; CHECK-NEXT: ret i1 [[TMP3]] +; CHECK-NEXT: [[LOGICAL:%.*]] = icmp ult i32 [[TMP2]], 26 +; CHECK-NEXT: ret i1 [[LOGICAL]] ; %add1 = add nsw i32 %char, -65 %cmp1 = icmp ult i32 %add1, 26 @@ -1293,8 +1293,8 @@ ; CHECK-LABEL: @is_ascii_alphabetic_inverted( ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[CHAR:%.*]], -33 ; CHECK-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], -91 -; CHECK-NEXT: [[TMP3:%.*]] = icmp ult i32 [[TMP2]], -26 -; CHECK-NEXT: ret i1 [[TMP3]] +; CHECK-NEXT: [[LOGICAL:%.*]] = icmp ult i32 [[TMP2]], -26 +; CHECK-NEXT: ret i1 [[LOGICAL]] ; %add1 = add nsw i32 %char, -91 %cmp1 = icmp ult i32 %add1, -26 @@ -1311,8 +1311,8 @@ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = and i1 [[C1]], [[TMP3]] -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[AND2:%.*]] = and i1 [[C1]], [[TMP3]] +; CHECK-NEXT: ret i1 [[AND2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1332,8 +1332,8 @@ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = and i1 [[C1]], [[TMP3]] -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[AND2:%.*]] = and i1 [[C1]], [[TMP3]] +; CHECK-NEXT: ret i1 [[AND2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1353,8 +1353,8 @@ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = and i1 [[TMP3]], [[C1]] -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[AND2:%.*]] = and i1 [[TMP3]], [[C1]] +; CHECK-NEXT: ret i1 [[AND2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1374,8 +1374,8 @@ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = and i1 [[TMP3]], [[C1]] -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[AND2:%.*]] = and i1 [[TMP3]], [[C1]] +; CHECK-NEXT: ret i1 [[AND2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1395,8 +1395,8 @@ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[C1]], i1 [[TMP3]], i1 false -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[C1]], i1 [[TMP3]], i1 false +; CHECK-NEXT: ret i1 [[AND2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1416,8 +1416,8 @@ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[C1]], i1 [[TMP3]], i1 false -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[C1]], i1 [[TMP3]], i1 false +; CHECK-NEXT: ret i1 [[AND2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1433,13 +1433,14 @@ define i1 @bitwise_and_logical_and_icmps_comm2(i8 %x, i8 %y, i8 %z) { ; CHECK-LABEL: @bitwise_and_logical_and_icmps_comm2( ; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42 +; CHECK-NEXT: [[X_M1:%.*]] = and i8 [[X:%.*]], 1 ; CHECK-NEXT: [[Z_SHIFT:%.*]] = shl nuw i8 1, [[Z:%.*]] -; CHECK-NEXT: [[TMP1:%.*]] = freeze i8 [[Z_SHIFT]] -; CHECK-NEXT: [[TMP2:%.*]] = or i8 [[TMP1]], 1 -; CHECK-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], [[X:%.*]] -; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i8 [[TMP3]], [[TMP2]] -; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP4]], i1 [[C1]], i1 false -; CHECK-NEXT: ret i1 [[TMP5]] +; CHECK-NEXT: [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]] +; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[X_M1]], 0 +; CHECK-NEXT: [[C3:%.*]] = icmp ne i8 [[X_M2]], 0 +; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[C1]], [[C3]] +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[C2]], i1 [[TMP1]], i1 false +; CHECK-NEXT: ret i1 [[AND2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1455,12 +1456,14 @@ define i1 @bitwise_and_logical_and_icmps_comm3(i8 %x, i8 %y, i8 %z) { ; CHECK-LABEL: @bitwise_and_logical_and_icmps_comm3( ; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42 +; CHECK-NEXT: [[X_M1:%.*]] = and i8 [[X:%.*]], 1 ; CHECK-NEXT: [[Z_SHIFT:%.*]] = shl nuw i8 1, [[Z:%.*]] -; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 -; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] -; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i1 [[C1]], i1 false -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]] +; CHECK-NEXT: [[C2:%.*]] = icmp ne i8 [[X_M1]], 0 +; CHECK-NEXT: [[C3:%.*]] = icmp ne i8 [[X_M2]], 0 +; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[C3]], [[C1]] +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[C2]], i1 [[TMP1]], i1 false +; CHECK-NEXT: ret i1 [[AND2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1662,8 +1665,8 @@ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[C1]], [[TMP3]] -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[OR2:%.*]] = or i1 [[C1]], [[TMP3]] +; CHECK-NEXT: ret i1 [[OR2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1683,8 +1686,8 @@ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[C1]], [[TMP3]] -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[OR2:%.*]] = or i1 [[C1]], [[TMP3]] +; CHECK-NEXT: ret i1 [[OR2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1704,8 +1707,8 @@ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP3]], [[C1]] -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[OR2:%.*]] = or i1 [[TMP3]], [[C1]] +; CHECK-NEXT: ret i1 [[OR2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1725,8 +1728,8 @@ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = or i1 [[TMP3]], [[C1]] -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[OR2:%.*]] = or i1 [[TMP3]], [[C1]] +; CHECK-NEXT: ret i1 [[OR2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1746,8 +1749,8 @@ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[C1]], i1 true, i1 [[TMP3]] -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[OR2:%.*]] = select i1 [[C1]], i1 true, i1 [[TMP3]] +; CHECK-NEXT: ret i1 [[OR2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1767,8 +1770,8 @@ ; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 ; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] ; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[C1]], i1 true, i1 [[TMP3]] -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[OR2:%.*]] = select i1 [[C1]], i1 true, i1 [[TMP3]] +; CHECK-NEXT: ret i1 [[OR2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1784,13 +1787,14 @@ define i1 @bitwise_or_logical_or_icmps_comm2(i8 %x, i8 %y, i8 %z) { ; CHECK-LABEL: @bitwise_or_logical_or_icmps_comm2( ; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42 +; CHECK-NEXT: [[X_M1:%.*]] = and i8 [[X:%.*]], 1 ; CHECK-NEXT: [[Z_SHIFT:%.*]] = shl nuw i8 1, [[Z:%.*]] -; CHECK-NEXT: [[TMP1:%.*]] = freeze i8 [[Z_SHIFT]] -; CHECK-NEXT: [[TMP2:%.*]] = or i8 [[TMP1]], 1 -; CHECK-NEXT: [[TMP3:%.*]] = and i8 [[TMP2]], [[X:%.*]] -; CHECK-NEXT: [[TMP4:%.*]] = icmp ne i8 [[TMP3]], [[TMP2]] -; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP4]], i1 true, i1 [[C1]] -; CHECK-NEXT: ret i1 [[TMP5]] +; CHECK-NEXT: [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]] +; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[X_M1]], 0 +; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[X_M2]], 0 +; CHECK-NEXT: [[TMP1:%.*]] = or i1 [[C1]], [[C3]] +; CHECK-NEXT: [[OR2:%.*]] = select i1 [[C2]], i1 true, i1 [[TMP1]] +; CHECK-NEXT: ret i1 [[OR2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -1806,12 +1810,14 @@ define i1 @bitwise_or_logical_or_icmps_comm3(i8 %x, i8 %y, i8 %z) { ; CHECK-LABEL: @bitwise_or_logical_or_icmps_comm3( ; CHECK-NEXT: [[C1:%.*]] = icmp eq i8 [[Y:%.*]], 42 +; CHECK-NEXT: [[X_M1:%.*]] = and i8 [[X:%.*]], 1 ; CHECK-NEXT: [[Z_SHIFT:%.*]] = shl nuw i8 1, [[Z:%.*]] -; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[Z_SHIFT]], 1 -; CHECK-NEXT: [[TMP2:%.*]] = and i8 [[TMP1]], [[X:%.*]] -; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i8 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i1 true, i1 [[C1]] -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[X_M2:%.*]] = and i8 [[Z_SHIFT]], [[X]] +; CHECK-NEXT: [[C2:%.*]] = icmp eq i8 [[X_M1]], 0 +; CHECK-NEXT: [[C3:%.*]] = icmp eq i8 [[X_M2]], 0 +; CHECK-NEXT: [[TMP1:%.*]] = or i1 [[C3]], [[C1]] +; CHECK-NEXT: [[OR2:%.*]] = select i1 [[C2]], i1 true, i1 [[TMP1]] +; CHECK-NEXT: ret i1 [[OR2]] ; %c1 = icmp eq i8 %y, 42 %x.m1 = and i8 %x, 1 @@ -2008,10 +2014,13 @@ define i1 @bitwise_and_logical_and_masked_icmp_asymmetric(i1 %c, i32 %x) { ; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_asymmetric( -; CHECK-NEXT: [[X_M2:%.*]] = and i32 [[X:%.*]], 11 +; CHECK-NEXT: [[X_M1:%.*]] = and i32 [[X:%.*]], 255 +; CHECK-NEXT: [[C1:%.*]] = icmp ne i32 [[X_M1]], 0 +; CHECK-NEXT: [[X_M2:%.*]] = and i32 [[X]], 11 ; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[X_M2]], 11 -; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[C2]], i1 [[C:%.*]], i1 false -; CHECK-NEXT: ret i1 [[TMP1]] +; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[C2]], [[C:%.*]] +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[C1]], i1 [[TMP1]], i1 false +; CHECK-NEXT: ret i1 [[AND2]] ; %x.m1 = and i32 %x, 255 %c1 = icmp ne i32 %x.m1, 0 @@ -2024,10 +2033,13 @@ define i1 @bitwise_and_logical_and_masked_icmp_allzeros(i1 %c, i32 %x) { ; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_allzeros( -; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 15 -; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 0 -; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i1 [[C:%.*]], i1 false -; CHECK-NEXT: ret i1 [[TMP3]] +; CHECK-NEXT: [[X_M1:%.*]] = and i32 [[X:%.*]], 8 +; CHECK-NEXT: [[C1:%.*]] = icmp eq i32 [[X_M1]], 0 +; CHECK-NEXT: [[X_M2:%.*]] = and i32 [[X]], 7 +; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[X_M2]], 0 +; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[C2]], [[C:%.*]] +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[C1]], i1 [[TMP1]], i1 false +; CHECK-NEXT: ret i1 [[AND2]] ; %x.m1 = and i32 %x, 8 %c1 = icmp eq i32 %x.m1, 0 @@ -2040,11 +2052,13 @@ define i1 @bitwise_and_logical_and_masked_icmp_allzeros_poison1(i1 %c, i32 %x, i32 %y) { ; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_allzeros_poison1( -; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[Y:%.*]], 7 -; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[X:%.*]] -; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP2]], 0 -; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i1 [[C:%.*]], i1 false -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[X_M1:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[C1:%.*]] = icmp eq i32 [[X_M1]], 0 +; CHECK-NEXT: [[X_M2:%.*]] = and i32 [[X]], 7 +; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[X_M2]], 0 +; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[C2]], [[C:%.*]] +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[C1]], i1 [[TMP1]], i1 false +; CHECK-NEXT: ret i1 [[AND2]] ; %x.m1 = and i32 %x, %y %c1 = icmp eq i32 %x.m1, 0 @@ -2059,10 +2073,10 @@ ; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_allzeros_poison2( ; CHECK-NEXT: [[X_M1:%.*]] = and i32 [[X:%.*]], 8 ; CHECK-NEXT: [[C1:%.*]] = icmp eq i32 [[X_M1]], 0 -; CHECK-NEXT: [[AND1:%.*]] = select i1 [[C1]], i1 [[C:%.*]], i1 false ; CHECK-NEXT: [[X_M2:%.*]] = and i32 [[X]], [[Y:%.*]] ; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[X_M2]], 0 -; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[C2]] +; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[C2]], [[C:%.*]] +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[C1]], i1 [[TMP1]], i1 false ; CHECK-NEXT: ret i1 [[AND2]] ; %x.m1 = and i32 %x, 8 @@ -2076,10 +2090,13 @@ define i1 @bitwise_and_logical_and_masked_icmp_allones(i1 %c, i32 %x) { ; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_allones( -; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 15 -; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP1]], 15 -; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], i1 [[C:%.*]], i1 false -; CHECK-NEXT: ret i1 [[TMP3]] +; CHECK-NEXT: [[X_M1:%.*]] = and i32 [[X:%.*]], 8 +; CHECK-NEXT: [[C1:%.*]] = icmp ne i32 [[X_M1]], 0 +; CHECK-NEXT: [[X_M2:%.*]] = and i32 [[X]], 7 +; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[X_M2]], 7 +; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[C2]], [[C:%.*]] +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[C1]], i1 [[TMP1]], i1 false +; CHECK-NEXT: ret i1 [[AND2]] ; %x.m1 = and i32 %x, 8 %c1 = icmp eq i32 %x.m1, 8 @@ -2092,11 +2109,13 @@ define i1 @bitwise_and_logical_and_masked_icmp_allones_poison1(i1 %c, i32 %x, i32 %y) { ; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_allones_poison1( -; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[Y:%.*]], 7 -; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], [[X:%.*]] -; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i32 [[TMP2]], [[TMP1]] -; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i1 [[C:%.*]], i1 false -; CHECK-NEXT: ret i1 [[TMP4]] +; CHECK-NEXT: [[X_M1:%.*]] = and i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[C1:%.*]] = icmp eq i32 [[X_M1]], [[Y]] +; CHECK-NEXT: [[X_M2:%.*]] = and i32 [[X]], 7 +; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[X_M2]], 7 +; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[C2]], [[C:%.*]] +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[C1]], i1 [[TMP1]], i1 false +; CHECK-NEXT: ret i1 [[AND2]] ; %x.m1 = and i32 %x, %y %c1 = icmp eq i32 %x.m1, %y @@ -2111,10 +2130,10 @@ ; CHECK-LABEL: @bitwise_and_logical_and_masked_icmp_allones_poison2( ; CHECK-NEXT: [[X_M1:%.*]] = and i32 [[X:%.*]], 8 ; CHECK-NEXT: [[C1:%.*]] = icmp ne i32 [[X_M1]], 0 -; CHECK-NEXT: [[AND1:%.*]] = select i1 [[C1]], i1 [[C:%.*]], i1 false ; CHECK-NEXT: [[X_M2:%.*]] = and i32 [[X]], [[Y:%.*]] ; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[X_M2]], [[Y]] -; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[C2]] +; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[C2]], [[C:%.*]] +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[C1]], i1 [[TMP1]], i1 false ; CHECK-NEXT: ret i1 [[AND2]] ; %x.m1 = and i32 %x, 8 @@ -2129,8 +2148,8 @@ define i1 @samesign(i32 %x, i32 %y) { ; CHECK-LABEL: @samesign( ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP1]], -1 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp sgt i32 [[TMP1]], -1 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y %lt = icmp slt i32 %a, 0 @@ -2143,8 +2162,8 @@ define <2 x i1> @samesign_different_sign_bittest1(<2 x i32> %x, <2 x i32> %y) { ; CHECK-LABEL: @samesign_different_sign_bittest1( ; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i32> [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt <2 x i32> [[TMP1]], -; CHECK-NEXT: ret <2 x i1> [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp sgt <2 x i32> [[TMP1]], +; CHECK-NEXT: ret <2 x i1> [[R]] ; %a = and <2 x i32> %x, %y %lt = icmp sle <2 x i32> %a, @@ -2157,8 +2176,8 @@ define i1 @samesign_different_sign_bittest2(i32 %x, i32 %y) { ; CHECK-LABEL: @samesign_different_sign_bittest2( ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP1]], -1 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp sgt i32 [[TMP1]], -1 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y %lt = icmp slt i32 %a, 0 @@ -2171,8 +2190,8 @@ define i1 @samesign_commute1(i32 %x, i32 %y) { ; CHECK-LABEL: @samesign_commute1( ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP1]], -1 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp sgt i32 [[TMP1]], -1 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y %lt = icmp slt i32 %a, 0 @@ -2185,8 +2204,8 @@ define i1 @samesign_commute2(i32 %x, i32 %y) { ; CHECK-LABEL: @samesign_commute2( ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP1]], -1 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp sgt i32 [[TMP1]], -1 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y %lt = icmp slt i32 %a, 0 @@ -2199,8 +2218,8 @@ define i1 @samesign_commute3(i32 %x, i32 %y) { ; CHECK-LABEL: @samesign_commute3( ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP1]], -1 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp sgt i32 [[TMP1]], -1 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y %lt = icmp slt i32 %a, 0 @@ -2251,8 +2270,8 @@ ; CHECK-NEXT: [[O:%.*]] = or i32 [[X]], [[Y]] ; CHECK-NEXT: call void @use32(i32 [[O]]) ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X]], [[Y]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP1]], -1 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp sgt i32 [[TMP1]], -1 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y call void @use32(i32 %a) @@ -2270,8 +2289,8 @@ ; CHECK-NEXT: [[GT:%.*]] = icmp sgt i32 [[O]], -1 ; CHECK-NEXT: call void @use(i1 [[GT]]) ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X]], [[Y]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP1]], -1 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp sgt i32 [[TMP1]], -1 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y %lt = icmp slt i32 %a, 0 @@ -2323,8 +2342,8 @@ define i1 @samesign_inverted(i32 %x, i32 %y) { ; CHECK-LABEL: @samesign_inverted( ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp slt i32 [[TMP1]], 0 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y %gt = icmp sgt i32 %a, -1 @@ -2337,8 +2356,8 @@ define i1 @samesign_inverted_different_sign_bittest1(i32 %x, i32 %y) { ; CHECK-LABEL: @samesign_inverted_different_sign_bittest1( ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp slt i32 [[TMP1]], 0 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y %gt = icmp sge i32 %a, 0 @@ -2351,8 +2370,8 @@ define i1 @samesign_inverted_different_sign_bittest2(i32 %x, i32 %y) { ; CHECK-LABEL: @samesign_inverted_different_sign_bittest2( ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp slt i32 [[TMP1]], 0 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y %gt = icmp sgt i32 %a, -1 @@ -2365,8 +2384,8 @@ define i1 @samesign_inverted_commute1(i32 %x, i32 %y) { ; CHECK-LABEL: @samesign_inverted_commute1( ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp slt i32 [[TMP1]], 0 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y %gt = icmp sgt i32 %a, -1 @@ -2379,8 +2398,8 @@ define i1 @samesign_inverted_commute2(i32 %x, i32 %y) { ; CHECK-LABEL: @samesign_inverted_commute2( ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp slt i32 [[TMP1]], 0 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y %gt = icmp sgt i32 %a, -1 @@ -2393,8 +2412,8 @@ define i1 @samesign_inverted_commute3(i32 %x, i32 %y) { ; CHECK-LABEL: @samesign_inverted_commute3( ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[Y:%.*]], [[X:%.*]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp slt i32 [[TMP1]], 0 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y %gt = icmp sgt i32 %a, -1 @@ -2444,8 +2463,8 @@ ; CHECK-NEXT: [[O:%.*]] = or i32 [[X]], [[Y]] ; CHECK-NEXT: call void @use32(i32 [[O]]) ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[X]], [[Y]] -; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP1]], 0 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[R:%.*]] = icmp slt i32 [[TMP1]], 0 +; CHECK-NEXT: ret i1 [[R]] ; %a = and i32 %x, %y call void @use32(i32 %a) diff --git a/llvm/test/Transforms/InstCombine/and2.ll b/llvm/test/Transforms/InstCombine/and2.ll --- a/llvm/test/Transforms/InstCombine/and2.ll +++ b/llvm/test/Transforms/InstCombine/and2.ll @@ -34,8 +34,8 @@ define i1 @test7(i32 %i, i1 %b) { ; CHECK-LABEL: @test7( ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[I:%.*]], 0 -; CHECK-NEXT: [[TMP2:%.*]] = and i1 [[TMP1]], [[B:%.*]] -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[AND2:%.*]] = and i1 [[TMP1]], [[B:%.*]] +; CHECK-NEXT: ret i1 [[AND2]] ; %cmp1 = icmp slt i32 %i, 1 %cmp2 = icmp sgt i32 %i, -1 @@ -46,9 +46,11 @@ define i1 @test7_logical(i32 %i, i1 %b) { ; CHECK-LABEL: @test7_logical( -; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[I:%.*]], 0 -; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i1 [[B:%.*]], i1 false -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[I:%.*]], 1 +; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[I]], -1 +; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[CMP2]], [[B:%.*]] +; CHECK-NEXT: [[AND2:%.*]] = select i1 [[CMP1]], i1 [[TMP1]], i1 false +; CHECK-NEXT: ret i1 [[AND2]] ; %cmp1 = icmp slt i32 %i, 1 %cmp2 = icmp sgt i32 %i, -1 @@ -60,8 +62,8 @@ define i1 @test8(i32 %i) { ; CHECK-LABEL: @test8( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[I:%.*]], -1 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 13 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[TMP1]], 13 +; CHECK-NEXT: ret i1 [[COND]] ; %cmp1 = icmp ne i32 %i, 0 %cmp2 = icmp ult i32 %i, 14 @@ -72,8 +74,8 @@ define i1 @test8_logical(i32 %i) { ; CHECK-LABEL: @test8_logical( ; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[I:%.*]], -1 -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i32 [[TMP1]], 13 -; CHECK-NEXT: ret i1 [[TMP2]] +; CHECK-NEXT: [[COND:%.*]] = icmp ult i32 [[TMP1]], 13 +; CHECK-NEXT: ret i1 [[COND]] ; %cmp1 = icmp ne i32 %i, 0 %cmp2 = icmp ult i32 %i, 14 @@ -84,8 +86,8 @@ define <2 x i1> @test8vec(<2 x i32> %i) { ; CHECK-LABEL: @test8vec( ; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i32> [[I:%.*]], -; CHECK-NEXT: [[TMP2:%.*]] = icmp ult <2 x i32> [[TMP1]], -; CHECK-NEXT: ret <2 x i1> [[TMP2]] +; CHECK-NEXT: [[COND:%.*]] = icmp ult <2 x i32> [[TMP1]], +; CHECK-NEXT: ret <2 x i1> [[COND]] ; %cmp1 = icmp ne <2 x i32> %i, zeroinitializer %cmp2 = icmp ult <2 x i32> %i, diff --git a/llvm/test/Transforms/InstCombine/binop-select.ll b/llvm/test/Transforms/InstCombine/binop-select.ll --- a/llvm/test/Transforms/InstCombine/binop-select.ll +++ b/llvm/test/Transforms/InstCombine/binop-select.ll @@ -8,9 +8,8 @@ define i32 @test1(i1 %c, i32 %x, i32 %y) { ; CHECK-LABEL: @test1( -; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[X:%.*]] -; CHECK-NEXT: [[COND:%.*]] = select i1 [[C:%.*]], i32 [[SUB]], i32 [[Y:%.*]] -; CHECK-NEXT: [[ADD:%.*]] = add i32 [[COND]], [[X]] +; CHECK-NEXT: [[TMP1:%.*]] = add i32 [[Y:%.*]], [[X:%.*]] +; CHECK-NEXT: [[ADD:%.*]] = select i1 [[C:%.*]], i32 0, i32 [[TMP1]] ; CHECK-NEXT: ret i32 [[ADD]] ; %sub = sub i32 0, %x @@ -21,9 +20,8 @@ define i32 @test2(i1 %c, i32 %x, i32 %y) { ; CHECK-LABEL: @test2( -; CHECK-NEXT: [[SUB:%.*]] = sub i32 0, [[X:%.*]] -; CHECK-NEXT: [[COND:%.*]] = select i1 [[C:%.*]], i32 [[SUB]], i32 [[X]] -; CHECK-NEXT: [[ADD:%.*]] = add i32 [[COND]], [[X]] +; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[X:%.*]], 1 +; CHECK-NEXT: [[ADD:%.*]] = select i1 [[C:%.*]], i32 0, i32 [[TMP1]] ; CHECK-NEXT: ret i32 [[ADD]] ; %sub = sub i32 0, %x diff --git a/llvm/test/Transforms/InstCombine/icmp-add.ll b/llvm/test/Transforms/InstCombine/icmp-add.ll --- a/llvm/test/Transforms/InstCombine/icmp-add.ll +++ b/llvm/test/Transforms/InstCombine/icmp-add.ll @@ -980,8 +980,8 @@ define i32 @increment_max(i32 %x) { ; CHECK-LABEL: @increment_max( ; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 -1) -; CHECK-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], 1 -; CHECK-NEXT: ret i32 [[TMP2]] +; CHECK-NEXT: [[S:%.*]] = add nsw i32 [[TMP1]], 1 +; CHECK-NEXT: ret i32 [[S]] ; %a = add nsw i32 %x, 1 %c = icmp sgt i32 %a, 0 @@ -992,8 +992,8 @@ define i32 @decrement_max(i32 %x) { ; CHECK-LABEL: @decrement_max( ; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 1) -; CHECK-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1 -; CHECK-NEXT: ret i32 [[TMP2]] +; CHECK-NEXT: [[S:%.*]] = add nsw i32 [[TMP1]], -1 +; CHECK-NEXT: ret i32 [[S]] ; %a = add nsw i32 %x, -1 %c = icmp sgt i32 %a, 0 @@ -1004,8 +1004,8 @@ define i32 @increment_min(i32 %x) { ; CHECK-LABEL: @increment_min( ; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 -1) -; CHECK-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], 1 -; CHECK-NEXT: ret i32 [[TMP2]] +; CHECK-NEXT: [[S:%.*]] = add nsw i32 [[TMP1]], 1 +; CHECK-NEXT: ret i32 [[S]] ; %a = add nsw i32 %x, 1 %c = icmp slt i32 %a, 0 @@ -1016,8 +1016,8 @@ define i32 @decrement_min(i32 %x) { ; CHECK-LABEL: @decrement_min( ; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 1) -; CHECK-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP1]], -1 -; CHECK-NEXT: ret i32 [[TMP2]] +; CHECK-NEXT: [[S:%.*]] = add nsw i32 [[TMP1]], -1 +; CHECK-NEXT: ret i32 [[S]] ; %a = add nsw i32 %x, -1 %c = icmp slt i32 %a, 0 diff --git a/llvm/test/Transforms/InstCombine/max_known_bits.ll b/llvm/test/Transforms/InstCombine/max_known_bits.ll --- a/llvm/test/Transforms/InstCombine/max_known_bits.ll +++ b/llvm/test/Transforms/InstCombine/max_known_bits.ll @@ -19,9 +19,9 @@ ; By analyzing the clamp pattern, we can tell the add doesn't have signed overflow. define i16 @min_max_clamp(i16 %x) { ; CHECK-LABEL: @min_max_clamp( -; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.smax.i16(i16 [[X:%.*]], i16 -2048) -; CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.smin.i16(i16 [[TMP1]], i16 2047) -; CHECK-NEXT: [[E:%.*]] = add nsw i16 [[TMP2]], 1 +; CHECK-NEXT: [[B:%.*]] = call i16 @llvm.smax.i16(i16 [[X:%.*]], i16 -2048) +; CHECK-NEXT: [[D:%.*]] = call i16 @llvm.smin.i16(i16 [[B]], i16 2047) +; CHECK-NEXT: [[E:%.*]] = add nsw i16 [[D]], 1 ; CHECK-NEXT: ret i16 [[E]] ; %a = icmp sgt i16 %x, -2048 @@ -35,9 +35,9 @@ ; Same as above with min/max reversed. define i16 @min_max_clamp_2(i16 %x) { ; CHECK-LABEL: @min_max_clamp_2( -; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.smin.i16(i16 [[X:%.*]], i16 2047) -; CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.smax.i16(i16 [[TMP1]], i16 -2048) -; CHECK-NEXT: [[E:%.*]] = add nsw i16 [[TMP2]], 1 +; CHECK-NEXT: [[B:%.*]] = call i16 @llvm.smin.i16(i16 [[X:%.*]], i16 2047) +; CHECK-NEXT: [[D:%.*]] = call i16 @llvm.smax.i16(i16 [[B]], i16 -2048) +; CHECK-NEXT: [[E:%.*]] = add nsw i16 [[D]], 1 ; CHECK-NEXT: ret i16 [[E]] ; %a = icmp slt i16 %x, 2047 @@ -53,10 +53,10 @@ ; overflow the original type and can be moved before the extend. define i32 @min_max_clamp_3(i16 %x) { ; CHECK-LABEL: @min_max_clamp_3( -; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.smax.i16(i16 [[X:%.*]], i16 -2048) -; CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.smin.i16(i16 [[TMP1]], i16 2047) -; CHECK-NEXT: [[TMP3:%.*]] = sext i16 [[TMP2]] to i32 -; CHECK-NEXT: ret i32 [[TMP3]] +; CHECK-NEXT: [[B:%.*]] = call i16 @llvm.smax.i16(i16 [[X:%.*]], i16 -2048) +; CHECK-NEXT: [[D:%.*]] = call i16 @llvm.smin.i16(i16 [[B]], i16 2047) +; CHECK-NEXT: [[TMP1:%.*]] = sext i16 [[D]] to i32 +; CHECK-NEXT: ret i32 [[TMP1]] ; %a = icmp sgt i16 %x, -2048 %b = select i1 %a, i16 %x, i16 -2048 @@ -71,10 +71,10 @@ ; Same as above with min/max order reversed define i32 @min_max_clamp_4(i16 %x) { ; CHECK-LABEL: @min_max_clamp_4( -; CHECK-NEXT: [[TMP1:%.*]] = call i16 @llvm.smin.i16(i16 [[X:%.*]], i16 2047) -; CHECK-NEXT: [[TMP2:%.*]] = call i16 @llvm.smax.i16(i16 [[TMP1]], i16 -2048) -; CHECK-NEXT: [[TMP3:%.*]] = sext i16 [[TMP2]] to i32 -; CHECK-NEXT: ret i32 [[TMP3]] +; CHECK-NEXT: [[B:%.*]] = call i16 @llvm.smin.i16(i16 [[X:%.*]], i16 2047) +; CHECK-NEXT: [[D:%.*]] = call i16 @llvm.smax.i16(i16 [[B]], i16 -2048) +; CHECK-NEXT: [[TMP1:%.*]] = sext i16 [[D]] to i32 +; CHECK-NEXT: ret i32 [[TMP1]] ; %a = icmp slt i16 %x, 2047 %b = select i1 %a, i16 %x, i16 2047 diff --git a/llvm/test/Transforms/InstCombine/minmax-demandbits.ll b/llvm/test/Transforms/InstCombine/minmax-demandbits.ll --- a/llvm/test/Transforms/InstCombine/minmax-demandbits.ll +++ b/llvm/test/Transforms/InstCombine/minmax-demandbits.ll @@ -26,8 +26,8 @@ define i32 @and_umax_more(i32 %A) { ; CHECK-LABEL: @and_umax_more( -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.umax.i32(i32 [[A:%.*]], i32 32) -; CHECK-NEXT: [[X:%.*]] = and i32 [[TMP1]], -32 +; CHECK-NEXT: [[L1:%.*]] = call i32 @llvm.umax.i32(i32 [[A:%.*]], i32 32) +; CHECK-NEXT: [[X:%.*]] = and i32 [[L1]], -32 ; CHECK-NEXT: ret i32 [[X]] ; %l0 = icmp ugt i32 32, %A @@ -117,8 +117,8 @@ define i8 @f_1_1(i8 %A) { ; CHECK-LABEL: @f_1_1( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 1) -; CHECK-NEXT: [[X:%.*]] = and i8 [[TMP1]], 1 +; CHECK-NEXT: [[L1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 1) +; CHECK-NEXT: [[X:%.*]] = and i8 [[L1]], 1 ; CHECK-NEXT: ret i8 [[X]] ; %l2 = icmp ugt i8 %A, 1 @@ -129,8 +129,8 @@ define i8 @f_32_32(i8 %A) { ; CHECK-LABEL: @f_32_32( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 32) -; CHECK-NEXT: [[X:%.*]] = and i8 [[TMP1]], -32 +; CHECK-NEXT: [[L1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 32) +; CHECK-NEXT: [[X:%.*]] = and i8 [[L1]], -32 ; CHECK-NEXT: ret i8 [[X]] ; %l2 = icmp ugt i8 %A, 32 @@ -141,8 +141,8 @@ define i8 @f_191_192(i8 %A) { ; CHECK-LABEL: @f_191_192( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 -65) -; CHECK-NEXT: [[X:%.*]] = and i8 [[TMP1]], -64 +; CHECK-NEXT: [[L1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 -65) +; CHECK-NEXT: [[X:%.*]] = and i8 [[L1]], -64 ; CHECK-NEXT: ret i8 [[X]] ; %l2 = icmp ugt i8 %A, 191 @@ -153,8 +153,8 @@ define i8 @f_10_1(i8 %A) { ; CHECK-LABEL: @f_10_1( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 10) -; CHECK-NEXT: [[X:%.*]] = and i8 [[TMP1]], 1 +; CHECK-NEXT: [[L1:%.*]] = call i8 @llvm.umax.i8(i8 [[A:%.*]], i8 10) +; CHECK-NEXT: [[X:%.*]] = and i8 [[L1]], 1 ; CHECK-NEXT: ret i8 [[X]] ; %l2 = icmp ugt i8 %A, 10 @@ -218,8 +218,8 @@ define i8 @and_min_7_9(i8 %A) { ; CHECK-LABEL: @and_min_7_9( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umin.i8(i8 [[A:%.*]], i8 -9) -; CHECK-NEXT: [[R:%.*]] = and i8 [[TMP1]], -8 +; CHECK-NEXT: [[MIN:%.*]] = call i8 @llvm.umin.i8(i8 [[A:%.*]], i8 -9) +; CHECK-NEXT: [[R:%.*]] = and i8 [[MIN]], -8 ; CHECK-NEXT: ret i8 [[R]] ; %l2 = icmp ult i8 %A, -9 diff --git a/llvm/test/Transforms/InstCombine/not.ll b/llvm/test/Transforms/InstCombine/not.ll --- a/llvm/test/Transforms/InstCombine/not.ll +++ b/llvm/test/Transforms/InstCombine/not.ll @@ -537,8 +537,9 @@ define i1 @not_logicalAnd_not_op1(i1 %x, i1 %y) { ; CHECK-LABEL: @not_logicalAnd_not_op1( -; CHECK-NEXT: [[NOT_X:%.*]] = xor i1 [[X:%.*]], true -; CHECK-NEXT: [[NOTAND:%.*]] = select i1 [[NOT_X]], i1 true, i1 [[Y:%.*]] +; CHECK-NEXT: [[NOTY:%.*]] = xor i1 [[Y:%.*]], true +; CHECK-NEXT: [[AND:%.*]] = select i1 [[X:%.*]], i1 [[NOTY]], i1 false +; CHECK-NEXT: [[NOTAND:%.*]] = xor i1 [[AND]], true ; CHECK-NEXT: ret i1 [[NOTAND]] ; %noty = xor i1 %y, true @@ -593,8 +594,9 @@ define i1 @not_logicalOr_not_op1(i1 %x, i1 %y) { ; CHECK-LABEL: @not_logicalOr_not_op1( -; CHECK-NEXT: [[NOT_X:%.*]] = xor i1 [[X:%.*]], true -; CHECK-NEXT: [[NOTOR:%.*]] = select i1 [[NOT_X]], i1 [[Y:%.*]], i1 false +; CHECK-NEXT: [[NOTY:%.*]] = xor i1 [[Y:%.*]], true +; CHECK-NEXT: [[OR:%.*]] = select i1 [[X:%.*]], i1 true, i1 [[NOTY]] +; CHECK-NEXT: [[NOTOR:%.*]] = xor i1 [[OR]], true ; CHECK-NEXT: ret i1 [[NOTOR]] ; %noty = xor i1 %y, true diff --git a/llvm/test/Transforms/InstCombine/rem.ll b/llvm/test/Transforms/InstCombine/rem.ll --- a/llvm/test/Transforms/InstCombine/rem.ll +++ b/llvm/test/Transforms/InstCombine/rem.ll @@ -236,8 +236,8 @@ define i32 @test4(i32 %X, i1 %C) { ; CHECK-LABEL: @test4( -; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[C:%.*]], i32 0, i32 7 -; CHECK-NEXT: [[R:%.*]] = and i32 [[TMP1]], [[X:%.*]] +; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 7 +; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i32 0, i32 [[TMP1]] ; CHECK-NEXT: ret i32 [[R]] ; %V = select i1 %C, i32 1, i32 8 diff --git a/llvm/test/Transforms/InstCombine/select-2.ll b/llvm/test/Transforms/InstCombine/select-2.ll --- a/llvm/test/Transforms/InstCombine/select-2.ll +++ b/llvm/test/Transforms/InstCombine/select-2.ll @@ -33,8 +33,8 @@ define float @t3(float %x, float %y) { ; CHECK-LABEL: @t3( ; CHECK-NEXT: [[T1:%.*]] = fcmp ogt float [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[X_OP:%.*]] = fadd fast float [[X]], 1.000000e+00 -; CHECK-NEXT: [[T3:%.*]] = select i1 [[T1]], float [[X_OP]], float 2.000000e+00 +; CHECK-NEXT: [[TMP1:%.*]] = fadd fast float [[X]], 1.000000e+00 +; CHECK-NEXT: [[T3:%.*]] = select i1 [[T1]], float [[TMP1]], float 2.000000e+00 ; CHECK-NEXT: ret float [[T3]] ; %t1 = fcmp ogt float %x, %y @@ -45,8 +45,8 @@ define i8 @ashr_exact_poison_constant_fold(i1 %b, i8 %x) { ; CHECK-LABEL: @ashr_exact_poison_constant_fold( -; CHECK-NEXT: [[X_OP:%.*]] = ashr exact i8 [[X:%.*]], 3 -; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 [[X_OP]], i8 5 +; CHECK-NEXT: [[TMP1:%.*]] = ashr exact i8 [[X:%.*]], 3 +; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 [[TMP1]], i8 5 ; CHECK-NEXT: ret i8 [[R]] ; %s = select i1 %b, i8 %x, i8 42 @@ -56,8 +56,8 @@ define i8 @ashr_exact(i1 %b, i8 %x) { ; CHECK-LABEL: @ashr_exact( -; CHECK-NEXT: [[X_OP:%.*]] = ashr exact i8 [[X:%.*]], 3 -; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 [[X_OP]], i8 2 +; CHECK-NEXT: [[TMP1:%.*]] = ashr exact i8 [[X:%.*]], 3 +; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 [[TMP1]], i8 2 ; CHECK-NEXT: ret i8 [[R]] ; %s = select i1 %b, i8 %x, i8 16 @@ -67,8 +67,8 @@ define i8 @shl_nsw_nuw_poison_constant_fold(i1 %b, i8 %x) { ; CHECK-LABEL: @shl_nsw_nuw_poison_constant_fold( -; CHECK-NEXT: [[X_OP:%.*]] = shl nuw nsw i8 16, [[X:%.*]] -; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 -128, i8 [[X_OP]] +; CHECK-NEXT: [[TMP1:%.*]] = shl nuw nsw i8 16, [[X:%.*]] +; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 -128, i8 [[TMP1]] ; CHECK-NEXT: ret i8 [[R]] ; %s = select i1 %b, i8 3, i8 %x @@ -78,8 +78,8 @@ define i8 @shl_nsw_nuw(i1 %b, i8 %x) { ; CHECK-LABEL: @shl_nsw_nuw( -; CHECK-NEXT: [[X_OP:%.*]] = shl nuw nsw i8 7, [[X:%.*]] -; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 56, i8 [[X_OP]] +; CHECK-NEXT: [[TMP1:%.*]] = shl nuw nsw i8 7, [[X:%.*]] +; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 56, i8 [[TMP1]] ; CHECK-NEXT: ret i8 [[R]] ; %s = select i1 %b, i8 3, i8 %x @@ -89,8 +89,8 @@ define i8 @add_nsw_poison_constant_fold(i1 %b, i8 %x) { ; CHECK-LABEL: @add_nsw_poison_constant_fold( -; CHECK-NEXT: [[X_OP:%.*]] = add nsw i8 [[X:%.*]], 64 -; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 [[X_OP]], i8 -127 +; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X:%.*]], 64 +; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 [[TMP1]], i8 -127 ; CHECK-NEXT: ret i8 [[R]] ; %s = select i1 %b, i8 %x, i8 65 @@ -100,8 +100,8 @@ define i8 @add_nsw(i1 %b, i8 %x) { ; CHECK-LABEL: @add_nsw( -; CHECK-NEXT: [[X_OP:%.*]] = add nsw i8 [[X:%.*]], 64 -; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 [[X_OP]], i8 71 +; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[X:%.*]], 64 +; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.*]], i8 [[TMP1]], i8 71 ; CHECK-NEXT: ret i8 [[R]] ; %s = select i1 %b, i8 %x, i8 7 diff --git a/llvm/test/Transforms/InstCombine/sub-ashr-or-to-icmp-select.ll b/llvm/test/Transforms/InstCombine/sub-ashr-or-to-icmp-select.ll --- a/llvm/test/Transforms/InstCombine/sub-ashr-or-to-icmp-select.ll +++ b/llvm/test/Transforms/InstCombine/sub-ashr-or-to-icmp-select.ll @@ -12,8 +12,8 @@ define i32 @clamp255_i32(i32 %x) { ; CHECK-LABEL: @clamp255_i32( -; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 255) -; CHECK-NEXT: [[AND:%.*]] = and i32 [[TMP1]], 255 +; CHECK-NEXT: [[OR:%.*]] = call i32 @llvm.smin.i32(i32 [[X:%.*]], i32 255) +; CHECK-NEXT: [[AND:%.*]] = and i32 [[OR]], 255 ; CHECK-NEXT: ret i32 [[AND]] ; %sub = sub nsw i32 255, %x diff --git a/llvm/test/Transforms/InstCombine/subtract-from-one-hand-of-select.ll b/llvm/test/Transforms/InstCombine/subtract-from-one-hand-of-select.ll --- a/llvm/test/Transforms/InstCombine/subtract-from-one-hand-of-select.ll +++ b/llvm/test/Transforms/InstCombine/subtract-from-one-hand-of-select.ll @@ -13,8 +13,8 @@ define i8 @t0_sub_from_trueval(i1 %c, i8 %Op0, i8 %FalseVal) { ; CHECK-LABEL: @t0_sub_from_trueval( ; CHECK-NEXT: [[TMP1:%.*]] = sub i8 [[OP0:%.*]], [[FALSEVAL:%.*]] -; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i8 0, i8 [[TMP1]], !prof !0 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: [[R1:%.*]] = select i1 [[C:%.*]], i8 0, i8 [[TMP1]] +; CHECK-NEXT: ret i8 [[R1]] ; %o = select i1 %c, i8 %Op0, i8 %FalseVal, !prof !0 ; while there, ensure preservation of prof md %r = sub i8 %Op0, %o @@ -23,8 +23,8 @@ define i8 @t1_sub_from_falseval(i1 %c, i8 %TrueVal, i8 %Op0) { ; CHECK-LABEL: @t1_sub_from_falseval( ; CHECK-NEXT: [[TMP1:%.*]] = sub i8 [[OP0:%.*]], [[TRUEVAL:%.*]] -; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i8 [[TMP1]], i8 0, !prof !0 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: [[R1:%.*]] = select i1 [[C:%.*]], i8 [[TMP1]], i8 0 +; CHECK-NEXT: ret i8 [[R1]] ; %o = select i1 %c, i8 %TrueVal, i8 %Op0, !prof !0 ; while there, ensure preservation of prof md %r = sub i8 %Op0, %o @@ -36,8 +36,8 @@ define <2 x i8> @t2_vec(i1 %c, <2 x i8> %Op0, <2 x i8> %FalseVal) { ; CHECK-LABEL: @t2_vec( ; CHECK-NEXT: [[TMP1:%.*]] = sub <2 x i8> [[OP0:%.*]], [[FALSEVAL:%.*]] -; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], <2 x i8> zeroinitializer, <2 x i8> [[TMP1]] -; CHECK-NEXT: ret <2 x i8> [[R]] +; CHECK-NEXT: [[R1:%.*]] = select i1 [[C:%.*]], <2 x i8> zeroinitializer, <2 x i8> [[TMP1]] +; CHECK-NEXT: ret <2 x i8> [[R1]] ; %o = select i1 %c, <2 x i8> %Op0, <2 x i8> %FalseVal %r = sub <2 x i8> %Op0, %o diff --git a/llvm/test/Transforms/InstCombine/subtract-of-one-hand-of-select.ll b/llvm/test/Transforms/InstCombine/subtract-of-one-hand-of-select.ll --- a/llvm/test/Transforms/InstCombine/subtract-of-one-hand-of-select.ll +++ b/llvm/test/Transforms/InstCombine/subtract-of-one-hand-of-select.ll @@ -13,8 +13,8 @@ define i8 @t0_sub_of_trueval(i1 %c, i8 %Op1, i8 %FalseVal) { ; CHECK-LABEL: @t0_sub_of_trueval( ; CHECK-NEXT: [[TMP1:%.*]] = sub i8 [[FALSEVAL:%.*]], [[OP1:%.*]] -; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i8 0, i8 [[TMP1]], !prof !0 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: [[R1:%.*]] = select i1 [[C:%.*]], i8 0, i8 [[TMP1]] +; CHECK-NEXT: ret i8 [[R1]] ; %o = select i1 %c, i8 %Op1, i8 %FalseVal, !prof !0 ; while there, ensure preservation of prof md %r = sub i8 %o, %Op1 @@ -23,8 +23,8 @@ define i8 @t1_sub_of_falseval(i1 %c, i8 %TrueVal, i8 %Op1) { ; CHECK-LABEL: @t1_sub_of_falseval( ; CHECK-NEXT: [[TMP1:%.*]] = sub i8 [[TRUEVAL:%.*]], [[OP1:%.*]] -; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i8 [[TMP1]], i8 0, !prof !0 -; CHECK-NEXT: ret i8 [[R]] +; CHECK-NEXT: [[R1:%.*]] = select i1 [[C:%.*]], i8 [[TMP1]], i8 0 +; CHECK-NEXT: ret i8 [[R1]] ; %o = select i1 %c, i8 %TrueVal, i8 %Op1, !prof !0 ; while there, ensure preservation of prof md %r = sub i8 %o, %Op1 @@ -36,8 +36,8 @@ define <2 x i8> @t2_vec(i1 %c, <2 x i8> %Op1, <2 x i8> %FalseVal) { ; CHECK-LABEL: @t2_vec( ; CHECK-NEXT: [[TMP1:%.*]] = sub <2 x i8> [[FALSEVAL:%.*]], [[OP1:%.*]] -; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], <2 x i8> zeroinitializer, <2 x i8> [[TMP1]] -; CHECK-NEXT: ret <2 x i8> [[R]] +; CHECK-NEXT: [[R1:%.*]] = select i1 [[C:%.*]], <2 x i8> zeroinitializer, <2 x i8> [[TMP1]] +; CHECK-NEXT: ret <2 x i8> [[R1]] ; %o = select i1 %c, <2 x i8> %Op1, <2 x i8> %FalseVal %r = sub <2 x i8> %o, %Op1 diff --git a/llvm/test/Transforms/InstCombine/widenable-conditions.ll b/llvm/test/Transforms/InstCombine/widenable-conditions.ll --- a/llvm/test/Transforms/InstCombine/widenable-conditions.ll +++ b/llvm/test/Transforms/InstCombine/widenable-conditions.ll @@ -176,9 +176,9 @@ define i1 @test4_logical(i1 %a, i1 %b, i1 %c) { ; CHECK-LABEL: @test4_logical( ; CHECK-NEXT: [[WC:%.*]] = call i1 @llvm.experimental.widenable.condition() -; CHECK-NEXT: [[LHS:%.*]] = select i1 [[A:%.*]], i1 [[B:%.*]], i1 false -; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[LHS]], [[WC]] -; CHECK-NEXT: [[AND:%.*]] = select i1 [[TMP1]], i1 [[C:%.*]], i1 false +; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[WC]], [[B:%.*]] +; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[A:%.*]], i1 [[TMP1]], i1 false +; CHECK-NEXT: [[AND:%.*]] = select i1 [[TMP2]], i1 [[C:%.*]], i1 false ; CHECK-NEXT: ret i1 [[AND]] ; %wc = call i1 @llvm.experimental.widenable.condition() diff --git a/llvm/test/Transforms/InstCombine/with_overflow.ll b/llvm/test/Transforms/InstCombine/with_overflow.ll --- a/llvm/test/Transforms/InstCombine/with_overflow.ll +++ b/llvm/test/Transforms/InstCombine/with_overflow.ll @@ -535,9 +535,9 @@ define { i8, i1 } @uadd_always_overflow(i8 %x) nounwind { ; CHECK-LABEL: @uadd_always_overflow( -; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], 63 -; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { i8, i1 } { i8 poison, i1 true }, i8 [[TMP1]], 0 -; CHECK-NEXT: ret { i8, i1 } [[TMP2]] +; CHECK-NEXT: [[A:%.*]] = and i8 [[X:%.*]], 63 +; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { i8, i1 } { i8 poison, i1 true }, i8 [[A]], 0 +; CHECK-NEXT: ret { i8, i1 } [[TMP1]] ; %y = or i8 %x, 192 %a = call { i8, i1 } @llvm.uadd.with.overflow.i8(i8 %y, i8 64) @@ -569,10 +569,10 @@ define { i8, i1 } @sadd_always_overflow(i8 %x) nounwind { ; CHECK-LABEL: @sadd_always_overflow( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 100) -; CHECK-NEXT: [[A:%.*]] = add nuw i8 [[TMP1]], 28 -; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { i8, i1 } { i8 poison, i1 true }, i8 [[A]], 0 -; CHECK-NEXT: ret { i8, i1 } [[TMP2]] +; CHECK-NEXT: [[Y:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 100) +; CHECK-NEXT: [[A:%.*]] = add nuw i8 [[Y]], 28 +; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { i8, i1 } { i8 poison, i1 true }, i8 [[A]], 0 +; CHECK-NEXT: ret { i8, i1 } [[TMP1]] ; %c = icmp sgt i8 %x, 100 %y = select i1 %c, i8 %x, i8 100 @@ -582,10 +582,10 @@ define { i8, i1 } @ssub_always_overflow(i8 %x) nounwind { ; CHECK-LABEL: @ssub_always_overflow( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 29) -; CHECK-NEXT: [[A:%.*]] = sub nuw i8 -100, [[TMP1]] -; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { i8, i1 } { i8 poison, i1 true }, i8 [[A]], 0 -; CHECK-NEXT: ret { i8, i1 } [[TMP2]] +; CHECK-NEXT: [[Y:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 29) +; CHECK-NEXT: [[A:%.*]] = sub nuw i8 -100, [[Y]] +; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { i8, i1 } { i8 poison, i1 true }, i8 [[A]], 0 +; CHECK-NEXT: ret { i8, i1 } [[TMP1]] ; %c = icmp sgt i8 %x, 29 %y = select i1 %c, i8 %x, i8 29 @@ -595,8 +595,8 @@ define { i8, i1 } @smul_always_overflow(i8 %x) nounwind { ; CHECK-LABEL: @smul_always_overflow( -; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 100) -; CHECK-NEXT: [[A:%.*]] = call { i8, i1 } @llvm.smul.with.overflow.i8(i8 [[TMP1]], i8 2) +; CHECK-NEXT: [[Y:%.*]] = call i8 @llvm.smax.i8(i8 [[X:%.*]], i8 100) +; CHECK-NEXT: [[A:%.*]] = call { i8, i1 } @llvm.smul.with.overflow.i8(i8 [[Y]], i8 2) ; CHECK-NEXT: ret { i8, i1 } [[A]] ; %c = icmp sgt i8 %x, 100