Skip to content

Commit cf47af4

Browse files
authored
[InstCombine] Generalize folds for inversion of icmp operands (#74317)
We have a bunch of folds that basically perform X pred Y to ~Y pred ~X for various special cases where this saves an instruction. Generalize these folds to use isFreeToInvert(). We have to make sure that we consume an instruction in either of the inversions, otherwise we're just going to swap the icmp back and forth. Fixes llvm/llvm-project#74302.
1 parent d0d5ef8 commit cf47af4

File tree

6 files changed

+50
-71
lines changed

6 files changed

+50
-71
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7034,7 +7034,7 @@ Instruction *InstCombinerImpl::visitICmpInst(ICmpInst &I) {
70347034
return Res;
70357035

70367036
{
7037-
Value *X, *Y, *Z;
7037+
Value *X, *Y;
70387038
// Transform (X & ~Y) == 0 --> (X & Y) != 0
70397039
// and (X & ~Y) != 0 --> (X & Y) == 0
70407040
// if A is a power of 2.
@@ -7044,32 +7044,18 @@ Instruction *InstCombinerImpl::visitICmpInst(ICmpInst &I) {
70447044
return new ICmpInst(I.getInversePredicate(), Builder.CreateAnd(X, Y),
70457045
Op1);
70467046

7047-
// Transform (~X ^ Y) s< ~Z --> (X ^ Y) s> Z,
7048-
// (~X ^ Y) s> ~Z --> (X ^ Y) s< Z,
7049-
// (~X ^ Y) s<= ~Z --> (X ^ Y) s>= Z,
7050-
// (~X ^ Y) s>= ~Z --> (X ^ Y) s<= Z,
7051-
// (~X ^ Y) u< ~Z --> (X ^ Y) u< Z,
7052-
// (~X ^ Y) u> ~Z --> (X ^ Y) u< Z,
7053-
// (~X ^ Y) u<= ~Z --> (X ^ Y) u>= Z,
7054-
// (~X ^ Y) u>= ~Z --> (X ^ Y) u<= Z,
7055-
// (~X ^ Y) == ~Z --> (X ^ Y) == Z,
7056-
// and (~X ^ Y) != ~Z --> (X ^ Y) != Z,
7057-
if (match(&I, m_c_ICmp(Pred, m_c_Xor(m_Not(m_Value(X)), m_Value(Y)),
7058-
m_Not(m_Value(Z)))) &&
7059-
(I.getOperand(0)->hasOneUse() || I.getOperand(1)->hasOneUse()))
7060-
return new ICmpInst(I.getSwappedPredicate(Pred), Builder.CreateXor(X, Y),
7061-
Z);
7062-
7063-
// ~X < ~Y --> Y < X
7064-
// ~X < C --> X > ~C
7065-
if (match(Op0, m_Not(m_Value(X)))) {
7066-
if (match(Op1, m_Not(m_Value(Y))))
7067-
return new ICmpInst(I.getPredicate(), Y, X);
7068-
7069-
const APInt *C;
7070-
if (match(Op1, m_APInt(C)))
7071-
return new ICmpInst(I.getSwappedPredicate(), X,
7072-
ConstantInt::get(Op1->getType(), ~(*C)));
7047+
// Op0 pred Op1 -> ~Op1 pred ~Op0, if this allows us to drop an instruction.
7048+
if (Op0->getType()->isIntOrIntVectorTy()) {
7049+
bool ConsumesOp0, ConsumesOp1;
7050+
if (isFreeToInvert(Op0, Op0->hasOneUse(), ConsumesOp0) &&
7051+
isFreeToInvert(Op1, Op1->hasOneUse(), ConsumesOp1) &&
7052+
(ConsumesOp0 || ConsumesOp1)) {
7053+
Value *InvOp0 = getFreelyInverted(Op0, Op0->hasOneUse(), &Builder);
7054+
Value *InvOp1 = getFreelyInverted(Op1, Op1->hasOneUse(), &Builder);
7055+
assert(InvOp0 && InvOp1 &&
7056+
"Mismatch between isFreeToInvert and getFreelyInverted");
7057+
return new ICmpInst(I.getSwappedPredicate(), InvOp0, InvOp1);
7058+
}
70737059
}
70747060

70757061
Instruction *AddI = nullptr;

llvm/test/Analysis/ValueTracking/knownbits-and-or-xor-lowbit.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,9 @@ define i1 @sub_YX_and_bit0_is_zero_fail(i8 %x, i8 %C) nounwind {
147147

148148
define <2 x i1> @sub_YX_xor_bit0_is_one_fail(<2 x i8> %x, <2 x i8> %C) nounwind {
149149
; CHECK-LABEL: @sub_YX_xor_bit0_is_one_fail(
150-
; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i8> [[X:%.*]], <i8 -1, i8 -1>
151-
; CHECK-NEXT: [[Y:%.*]] = add <2 x i8> [[TMP1]], [[C:%.*]]
152-
; CHECK-NEXT: [[W:%.*]] = xor <2 x i8> [[Y]], [[X]]
153-
; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[W]], <i8 12, i8 12>
150+
; CHECK-NEXT: [[TMP1:%.*]] = sub <2 x i8> [[X:%.*]], [[C:%.*]]
151+
; CHECK-NEXT: [[TMP2:%.*]] = xor <2 x i8> [[TMP1]], [[X]]
152+
; CHECK-NEXT: [[R:%.*]] = icmp eq <2 x i8> [[TMP2]], <i8 -13, i8 -13>
154153
; CHECK-NEXT: ret <2 x i1> [[R]]
155154
;
156155
%C1 = sub <2 x i8> %C, <i8 1, i8 1>

llvm/test/Transforms/InstCombine/icmp-uge-of-not-of-shl-allones-by-bits-and-val-to-icmp-eq-of-lshr-val-by-bits-and-0.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ define i1 @both(i8 %bits0, i8 %bits1) {
101101
; CHECK-LABEL: @both(
102102
; CHECK-NEXT: [[T0:%.*]] = shl nsw i8 -1, [[BITS0:%.*]]
103103
; CHECK-NEXT: [[T2:%.*]] = shl nsw i8 -1, [[BITS1:%.*]]
104-
; CHECK-NEXT: [[R:%.*]] = icmp uge i8 [[T2]], [[T0]]
104+
; CHECK-NEXT: [[R:%.*]] = icmp ule i8 [[T0]], [[T2]]
105105
; CHECK-NEXT: ret i1 [[R]]
106106
;
107107
%t0 = shl i8 -1, %bits0

llvm/test/Transforms/InstCombine/icmp-ult-of-not-of-shl-allones-by-bits-and-val-to-icmp-ne-of-lshr-val-by-bits-and-0.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ define i1 @both(i8 %bits0, i8 %bits1) {
101101
; CHECK-LABEL: @both(
102102
; CHECK-NEXT: [[T0:%.*]] = shl nsw i8 -1, [[BITS0:%.*]]
103103
; CHECK-NEXT: [[T2:%.*]] = shl nsw i8 -1, [[BITS1:%.*]]
104-
; CHECK-NEXT: [[R:%.*]] = icmp ult i8 [[T2]], [[T0]]
104+
; CHECK-NEXT: [[R:%.*]] = icmp ugt i8 [[T0]], [[T2]]
105105
; CHECK-NEXT: ret i1 [[R]]
106106
;
107107
%t0 = shl i8 -1, %bits0

llvm/test/Transforms/InstCombine/not.ll

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ define i1 @invert_fcmp(float %X, float %Y) {
3939

4040
define i1 @not_not_cmp(i32 %a, i32 %b) {
4141
; CHECK-LABEL: @not_not_cmp(
42-
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[B:%.*]], [[A:%.*]]
42+
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], [[B:%.*]]
4343
; CHECK-NEXT: ret i1 [[CMP]]
4444
;
4545
%nota = xor i32 %a, -1
@@ -50,7 +50,7 @@ define i1 @not_not_cmp(i32 %a, i32 %b) {
5050

5151
define <2 x i1> @not_not_cmp_vector(<2 x i32> %a, <2 x i32> %b) {
5252
; CHECK-LABEL: @not_not_cmp_vector(
53-
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt <2 x i32> [[B:%.*]], [[A:%.*]]
53+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult <2 x i32> [[A:%.*]], [[B:%.*]]
5454
; CHECK-NEXT: ret <2 x i1> [[CMP]]
5555
;
5656
%nota = xor <2 x i32> %a, <i32 -1, i32 -1>
@@ -727,9 +727,8 @@ define i8 @bitcast_to_scalar_sext_bool_use2(<4 x i1> %b) {
727727
define i1 @invert_both_cmp_operands_add(i32 %a, i32 %b) {
728728
; CHECK-LABEL: @invert_both_cmp_operands_add(
729729
; CHECK-NEXT: entry:
730-
; CHECK-NEXT: [[NOT_A:%.*]] = xor i32 [[A:%.*]], -1
731-
; CHECK-NEXT: [[ADD:%.*]] = add i32 [[NOT_A]], [[B:%.*]]
732-
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[ADD]], 0
730+
; CHECK-NEXT: [[TMP0:%.*]] = sub i32 [[A:%.*]], [[B:%.*]]
731+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], -1
733732
; CHECK-NEXT: ret i1 [[CMP]]
734733
;
735734
entry:
@@ -742,9 +741,8 @@ entry:
742741
define i1 @invert_both_cmp_operands_sub(i32 %a, i32 %b) {
743742
; CHECK-LABEL: @invert_both_cmp_operands_sub(
744743
; CHECK-NEXT: entry:
745-
; CHECK-NEXT: [[NOT_A:%.*]] = xor i32 [[A:%.*]], -1
746-
; CHECK-NEXT: [[ADD:%.*]] = sub i32 [[NOT_A]], [[B:%.*]]
747-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i32 [[ADD]], 42
744+
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[A:%.*]], [[B:%.*]]
745+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[TMP0]], -43
748746
; CHECK-NEXT: ret i1 [[CMP]]
749747
;
750748
entry:
@@ -757,12 +755,9 @@ entry:
757755
define i1 @invert_both_cmp_operands_complex(i1 %x, i32 %a, i32 %b, i32 %c) {
758756
; CHECK-LABEL: @invert_both_cmp_operands_complex(
759757
; CHECK-NEXT: entry:
760-
; CHECK-NEXT: [[NOT_A:%.*]] = xor i32 [[A:%.*]], -1
761-
; CHECK-NEXT: [[NOT_B:%.*]] = xor i32 [[B:%.*]], -1
762-
; CHECK-NEXT: [[NOT_C:%.*]] = xor i32 [[C:%.*]], -1
763-
; CHECK-NEXT: [[ADD:%.*]] = add i32 [[NOT_A]], [[C]]
764-
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[X:%.*]], i32 [[ADD]], i32 [[NOT_B]]
765-
; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[SELECT]], [[NOT_C]]
758+
; CHECK-NEXT: [[TMP0:%.*]] = sub i32 [[A:%.*]], [[C:%.*]]
759+
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[X:%.*]], i32 [[TMP0]], i32 [[B:%.*]]
760+
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[TMP1]], [[C]]
766761
; CHECK-NEXT: ret i1 [[CMP]]
767762
;
768763
entry:

llvm/test/Transforms/PhaseOrdering/X86/vdiv.ll

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -64,89 +64,88 @@ define void @vdiv(ptr %x, ptr %y, double %a, i32 %N) #0 {
6464
; CHECK-NEXT: br i1 [[CMP_N]], label [[FOR_END]], label [[FOR_BODY_PREHEADER9]]
6565
; CHECK: for.body.preheader9:
6666
; CHECK-NEXT: [[INDVARS_IV_PH:%.*]] = phi i64 [ 0, [[FOR_BODY_PREHEADER]] ], [ [[N_VEC]], [[MIDDLE_BLOCK]] ]
67-
; CHECK-NEXT: [[TMP18:%.*]] = xor i64 [[INDVARS_IV_PH]], -1
68-
; CHECK-NEXT: [[TMP19:%.*]] = add nsw i64 [[TMP18]], [[WIDE_TRIP_COUNT]]
6967
; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[WIDE_TRIP_COUNT]], 7
7068
; CHECK-NEXT: [[LCMP_MOD_NOT:%.*]] = icmp eq i64 [[XTRAITER]], 0
7169
; CHECK-NEXT: br i1 [[LCMP_MOD_NOT]], label [[FOR_BODY_PROL_LOOPEXIT:%.*]], label [[FOR_BODY_PROL_PREHEADER:%.*]]
7270
; CHECK: for.body.prol.preheader:
73-
; CHECK-NEXT: [[TMP20:%.*]] = fdiv fast double 1.000000e+00, [[A]]
71+
; CHECK-NEXT: [[TMP18:%.*]] = fdiv fast double 1.000000e+00, [[A]]
7472
; CHECK-NEXT: br label [[FOR_BODY_PROL:%.*]]
7573
; CHECK: for.body.prol:
7674
; CHECK-NEXT: [[INDVARS_IV_PROL:%.*]] = phi i64 [ [[INDVARS_IV_NEXT_PROL:%.*]], [[FOR_BODY_PROL]] ], [ [[INDVARS_IV_PH]], [[FOR_BODY_PROL_PREHEADER]] ]
7775
; CHECK-NEXT: [[PROL_ITER:%.*]] = phi i64 [ [[PROL_ITER_NEXT:%.*]], [[FOR_BODY_PROL]] ], [ 0, [[FOR_BODY_PROL_PREHEADER]] ]
7876
; CHECK-NEXT: [[ARRAYIDX_PROL:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 [[INDVARS_IV_PROL]]
7977
; CHECK-NEXT: [[T0_PROL:%.*]] = load double, ptr [[ARRAYIDX_PROL]], align 8, !tbaa [[TBAA3]]
80-
; CHECK-NEXT: [[TMP21:%.*]] = fmul fast double [[T0_PROL]], [[TMP20]]
78+
; CHECK-NEXT: [[TMP19:%.*]] = fmul fast double [[T0_PROL]], [[TMP18]]
8179
; CHECK-NEXT: [[ARRAYIDX2_PROL:%.*]] = getelementptr inbounds double, ptr [[X]], i64 [[INDVARS_IV_PROL]]
82-
; CHECK-NEXT: store double [[TMP21]], ptr [[ARRAYIDX2_PROL]], align 8, !tbaa [[TBAA3]]
80+
; CHECK-NEXT: store double [[TMP19]], ptr [[ARRAYIDX2_PROL]], align 8, !tbaa [[TBAA3]]
8381
; CHECK-NEXT: [[INDVARS_IV_NEXT_PROL]] = add nuw nsw i64 [[INDVARS_IV_PROL]], 1
8482
; CHECK-NEXT: [[PROL_ITER_NEXT]] = add i64 [[PROL_ITER]], 1
8583
; CHECK-NEXT: [[PROL_ITER_CMP_NOT:%.*]] = icmp eq i64 [[PROL_ITER_NEXT]], [[XTRAITER]]
8684
; CHECK-NEXT: br i1 [[PROL_ITER_CMP_NOT]], label [[FOR_BODY_PROL_LOOPEXIT]], label [[FOR_BODY_PROL]], !llvm.loop [[LOOP10:![0-9]+]]
8785
; CHECK: for.body.prol.loopexit:
8886
; CHECK-NEXT: [[INDVARS_IV_UNR:%.*]] = phi i64 [ [[INDVARS_IV_PH]], [[FOR_BODY_PREHEADER9]] ], [ [[INDVARS_IV_NEXT_PROL]], [[FOR_BODY_PROL]] ]
89-
; CHECK-NEXT: [[TMP22:%.*]] = icmp ult i64 [[TMP19]], 7
90-
; CHECK-NEXT: br i1 [[TMP22]], label [[FOR_END]], label [[FOR_BODY_PREHEADER9_NEW:%.*]]
87+
; CHECK-NEXT: [[TMP20:%.*]] = sub nsw i64 [[INDVARS_IV_PH]], [[WIDE_TRIP_COUNT]]
88+
; CHECK-NEXT: [[TMP21:%.*]] = icmp ugt i64 [[TMP20]], -8
89+
; CHECK-NEXT: br i1 [[TMP21]], label [[FOR_END]], label [[FOR_BODY_PREHEADER9_NEW:%.*]]
9190
; CHECK: for.body.preheader9.new:
91+
; CHECK-NEXT: [[TMP22:%.*]] = fdiv fast double 1.000000e+00, [[A]]
9292
; CHECK-NEXT: [[TMP23:%.*]] = fdiv fast double 1.000000e+00, [[A]]
9393
; CHECK-NEXT: [[TMP24:%.*]] = fdiv fast double 1.000000e+00, [[A]]
9494
; CHECK-NEXT: [[TMP25:%.*]] = fdiv fast double 1.000000e+00, [[A]]
9595
; CHECK-NEXT: [[TMP26:%.*]] = fdiv fast double 1.000000e+00, [[A]]
9696
; CHECK-NEXT: [[TMP27:%.*]] = fdiv fast double 1.000000e+00, [[A]]
9797
; CHECK-NEXT: [[TMP28:%.*]] = fdiv fast double 1.000000e+00, [[A]]
9898
; CHECK-NEXT: [[TMP29:%.*]] = fdiv fast double 1.000000e+00, [[A]]
99-
; CHECK-NEXT: [[TMP30:%.*]] = fdiv fast double 1.000000e+00, [[A]]
10099
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
101100
; CHECK: for.body:
102101
; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_UNR]], [[FOR_BODY_PREHEADER9_NEW]] ], [ [[INDVARS_IV_NEXT_7:%.*]], [[FOR_BODY]] ]
103102
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 [[INDVARS_IV]]
104103
; CHECK-NEXT: [[T0:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA3]]
105-
; CHECK-NEXT: [[TMP31:%.*]] = fmul fast double [[T0]], [[TMP23]]
104+
; CHECK-NEXT: [[TMP30:%.*]] = fmul fast double [[T0]], [[TMP22]]
106105
; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds double, ptr [[X]], i64 [[INDVARS_IV]]
107-
; CHECK-NEXT: store double [[TMP31]], ptr [[ARRAYIDX2]], align 8, !tbaa [[TBAA3]]
106+
; CHECK-NEXT: store double [[TMP30]], ptr [[ARRAYIDX2]], align 8, !tbaa [[TBAA3]]
108107
; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 1
109108
; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 [[INDVARS_IV_NEXT]]
110109
; CHECK-NEXT: [[T0_1:%.*]] = load double, ptr [[ARRAYIDX_1]], align 8, !tbaa [[TBAA3]]
111-
; CHECK-NEXT: [[TMP32:%.*]] = fmul fast double [[T0_1]], [[TMP24]]
110+
; CHECK-NEXT: [[TMP31:%.*]] = fmul fast double [[T0_1]], [[TMP23]]
112111
; CHECK-NEXT: [[ARRAYIDX2_1:%.*]] = getelementptr inbounds double, ptr [[X]], i64 [[INDVARS_IV_NEXT]]
113-
; CHECK-NEXT: store double [[TMP32]], ptr [[ARRAYIDX2_1]], align 8, !tbaa [[TBAA3]]
112+
; CHECK-NEXT: store double [[TMP31]], ptr [[ARRAYIDX2_1]], align 8, !tbaa [[TBAA3]]
114113
; CHECK-NEXT: [[INDVARS_IV_NEXT_1:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 2
115114
; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 [[INDVARS_IV_NEXT_1]]
116115
; CHECK-NEXT: [[T0_2:%.*]] = load double, ptr [[ARRAYIDX_2]], align 8, !tbaa [[TBAA3]]
117-
; CHECK-NEXT: [[TMP33:%.*]] = fmul fast double [[T0_2]], [[TMP25]]
116+
; CHECK-NEXT: [[TMP32:%.*]] = fmul fast double [[T0_2]], [[TMP24]]
118117
; CHECK-NEXT: [[ARRAYIDX2_2:%.*]] = getelementptr inbounds double, ptr [[X]], i64 [[INDVARS_IV_NEXT_1]]
119-
; CHECK-NEXT: store double [[TMP33]], ptr [[ARRAYIDX2_2]], align 8, !tbaa [[TBAA3]]
118+
; CHECK-NEXT: store double [[TMP32]], ptr [[ARRAYIDX2_2]], align 8, !tbaa [[TBAA3]]
120119
; CHECK-NEXT: [[INDVARS_IV_NEXT_2:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 3
121120
; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 [[INDVARS_IV_NEXT_2]]
122121
; CHECK-NEXT: [[T0_3:%.*]] = load double, ptr [[ARRAYIDX_3]], align 8, !tbaa [[TBAA3]]
123-
; CHECK-NEXT: [[TMP34:%.*]] = fmul fast double [[T0_3]], [[TMP26]]
122+
; CHECK-NEXT: [[TMP33:%.*]] = fmul fast double [[T0_3]], [[TMP25]]
124123
; CHECK-NEXT: [[ARRAYIDX2_3:%.*]] = getelementptr inbounds double, ptr [[X]], i64 [[INDVARS_IV_NEXT_2]]
125-
; CHECK-NEXT: store double [[TMP34]], ptr [[ARRAYIDX2_3]], align 8, !tbaa [[TBAA3]]
124+
; CHECK-NEXT: store double [[TMP33]], ptr [[ARRAYIDX2_3]], align 8, !tbaa [[TBAA3]]
126125
; CHECK-NEXT: [[INDVARS_IV_NEXT_3:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 4
127126
; CHECK-NEXT: [[ARRAYIDX_4:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 [[INDVARS_IV_NEXT_3]]
128127
; CHECK-NEXT: [[T0_4:%.*]] = load double, ptr [[ARRAYIDX_4]], align 8, !tbaa [[TBAA3]]
129-
; CHECK-NEXT: [[TMP35:%.*]] = fmul fast double [[T0_4]], [[TMP27]]
128+
; CHECK-NEXT: [[TMP34:%.*]] = fmul fast double [[T0_4]], [[TMP26]]
130129
; CHECK-NEXT: [[ARRAYIDX2_4:%.*]] = getelementptr inbounds double, ptr [[X]], i64 [[INDVARS_IV_NEXT_3]]
131-
; CHECK-NEXT: store double [[TMP35]], ptr [[ARRAYIDX2_4]], align 8, !tbaa [[TBAA3]]
130+
; CHECK-NEXT: store double [[TMP34]], ptr [[ARRAYIDX2_4]], align 8, !tbaa [[TBAA3]]
132131
; CHECK-NEXT: [[INDVARS_IV_NEXT_4:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 5
133132
; CHECK-NEXT: [[ARRAYIDX_5:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 [[INDVARS_IV_NEXT_4]]
134133
; CHECK-NEXT: [[T0_5:%.*]] = load double, ptr [[ARRAYIDX_5]], align 8, !tbaa [[TBAA3]]
135-
; CHECK-NEXT: [[TMP36:%.*]] = fmul fast double [[T0_5]], [[TMP28]]
134+
; CHECK-NEXT: [[TMP35:%.*]] = fmul fast double [[T0_5]], [[TMP27]]
136135
; CHECK-NEXT: [[ARRAYIDX2_5:%.*]] = getelementptr inbounds double, ptr [[X]], i64 [[INDVARS_IV_NEXT_4]]
137-
; CHECK-NEXT: store double [[TMP36]], ptr [[ARRAYIDX2_5]], align 8, !tbaa [[TBAA3]]
136+
; CHECK-NEXT: store double [[TMP35]], ptr [[ARRAYIDX2_5]], align 8, !tbaa [[TBAA3]]
138137
; CHECK-NEXT: [[INDVARS_IV_NEXT_5:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 6
139138
; CHECK-NEXT: [[ARRAYIDX_6:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 [[INDVARS_IV_NEXT_5]]
140139
; CHECK-NEXT: [[T0_6:%.*]] = load double, ptr [[ARRAYIDX_6]], align 8, !tbaa [[TBAA3]]
141-
; CHECK-NEXT: [[TMP37:%.*]] = fmul fast double [[T0_6]], [[TMP29]]
140+
; CHECK-NEXT: [[TMP36:%.*]] = fmul fast double [[T0_6]], [[TMP28]]
142141
; CHECK-NEXT: [[ARRAYIDX2_6:%.*]] = getelementptr inbounds double, ptr [[X]], i64 [[INDVARS_IV_NEXT_5]]
143-
; CHECK-NEXT: store double [[TMP37]], ptr [[ARRAYIDX2_6]], align 8, !tbaa [[TBAA3]]
142+
; CHECK-NEXT: store double [[TMP36]], ptr [[ARRAYIDX2_6]], align 8, !tbaa [[TBAA3]]
144143
; CHECK-NEXT: [[INDVARS_IV_NEXT_6:%.*]] = add nuw nsw i64 [[INDVARS_IV]], 7
145144
; CHECK-NEXT: [[ARRAYIDX_7:%.*]] = getelementptr inbounds double, ptr [[Y]], i64 [[INDVARS_IV_NEXT_6]]
146145
; CHECK-NEXT: [[T0_7:%.*]] = load double, ptr [[ARRAYIDX_7]], align 8, !tbaa [[TBAA3]]
147-
; CHECK-NEXT: [[TMP38:%.*]] = fmul fast double [[T0_7]], [[TMP30]]
146+
; CHECK-NEXT: [[TMP37:%.*]] = fmul fast double [[T0_7]], [[TMP29]]
148147
; CHECK-NEXT: [[ARRAYIDX2_7:%.*]] = getelementptr inbounds double, ptr [[X]], i64 [[INDVARS_IV_NEXT_6]]
149-
; CHECK-NEXT: store double [[TMP38]], ptr [[ARRAYIDX2_7]], align 8, !tbaa [[TBAA3]]
148+
; CHECK-NEXT: store double [[TMP37]], ptr [[ARRAYIDX2_7]], align 8, !tbaa [[TBAA3]]
150149
; CHECK-NEXT: [[INDVARS_IV_NEXT_7]] = add nuw nsw i64 [[INDVARS_IV]], 8
151150
; CHECK-NEXT: [[EXITCOND_NOT_7:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT_7]], [[WIDE_TRIP_COUNT]]
152151
; CHECK-NEXT: br i1 [[EXITCOND_NOT_7]], label [[FOR_END]], label [[FOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]

0 commit comments

Comments
 (0)