forked from OSchip/llvm-project
Restore fixed version of "[CodeGenPrepare] Fix isIVIncrement (PR49466)"
Change was reverted in commit8d20f2c2c6
because it was causing an infinite loop.9228f2f32
fixed the root issue in the code structure, this change just reapplies the original change w/adaptation to the new code structure.
This commit is contained in:
parent
9228f2f322
commit
7d38a91a7f
|
@ -1332,7 +1332,7 @@ getIVIncrement(const PHINode *PN, const LoopInfo *LI) {
|
|||
return None;
|
||||
auto *IVInc =
|
||||
dyn_cast<Instruction>(PN->getIncomingValueForBlock(L->getLoopLatch()));
|
||||
if (!IVInc)
|
||||
if (!IVInc || LI->getLoopFor(IVInc->getParent()) != L)
|
||||
return None;
|
||||
Instruction *LHS = nullptr;
|
||||
Constant *Step = nullptr;
|
||||
|
@ -1363,6 +1363,7 @@ bool CodeGenPrepare::replaceMathCmpWithIntrinsic(BinaryOperator *BO,
|
|||
if (!isIVIncrement(BO, LI))
|
||||
return false;
|
||||
const Loop *L = LI->getLoopFor(BO->getParent());
|
||||
assert(L && "L should not be null after isIVIncrement()");
|
||||
// Do not risk on moving increment into a child loop.
|
||||
if (LI->getLoopFor(Cmp->getParent()) != L)
|
||||
return false;
|
||||
|
|
|
@ -0,0 +1,192 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -O2 -codegenprepare -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
@b = dso_local local_unnamed_addr global i64 0, align 8
|
||||
@c = dso_local local_unnamed_addr global i64 0, align 8
|
||||
@d = dso_local local_unnamed_addr global i64 0, align 8
|
||||
@e = dso_local local_unnamed_addr global i64 0, align 8
|
||||
@f = dso_local local_unnamed_addr global i64 0, align 8
|
||||
@g = dso_local local_unnamed_addr global i64 0, align 8
|
||||
|
||||
define dso_local i32 @m() local_unnamed_addr {
|
||||
; CHECK-LABEL: @m(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP0:%.*]] = load i64, i64* @f, align 8
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = load i64, i64* @c, align 8
|
||||
; CHECK-NEXT: [[CONV18:%.*]] = trunc i64 [[TMP1]] to i32
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = load i64, i64* @d, align 8
|
||||
; CHECK-NEXT: [[CONV43:%.*]] = trunc i64 [[TMP2]] to i8
|
||||
; CHECK-NEXT: br label [[FOR_COND:%.*]]
|
||||
; CHECK: for.cond:
|
||||
; CHECK-NEXT: [[J_0:%.*]] = phi i32 [ undef, [[ENTRY:%.*]] ], [ [[J_1_LCSSA:%.*]], [[FOR_COND39_PREHEADER:%.*]] ]
|
||||
; CHECK-NEXT: [[P_0:%.*]] = phi i64 [ undef, [[ENTRY]] ], [ [[P_1_LCSSA:%.*]], [[FOR_COND39_PREHEADER]] ]
|
||||
; CHECK-NEXT: [[I_0:%.*]] = phi i32 [ undef, [[ENTRY]] ], [ [[I_1_LCSSA:%.*]], [[FOR_COND39_PREHEADER]] ]
|
||||
; CHECK-NEXT: [[CMP73:%.*]] = icmp slt i32 [[I_0]], 3
|
||||
; CHECK-NEXT: br i1 [[CMP73]], label [[FOR_BODY:%.*]], label [[FOR_COND39_PREHEADER]]
|
||||
; CHECK: for.cond1.loopexit:
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = icmp slt i32 [[CONV18]], 3
|
||||
; CHECK-NEXT: br i1 [[TMP3]], label [[FOR_BODY]], label [[FOR_COND39_PREHEADER]]
|
||||
; CHECK: for.cond39.preheader:
|
||||
; CHECK-NEXT: [[J_1_LCSSA]] = phi i32 [ [[J_0]], [[FOR_COND]] ], [ [[CONV18]], [[FOR_COND1_LOOPEXIT:%.*]] ]
|
||||
; CHECK-NEXT: [[P_1_LCSSA]] = phi i64 [ [[P_0]], [[FOR_COND]] ], [ 0, [[FOR_COND1_LOOPEXIT]] ]
|
||||
; CHECK-NEXT: [[I_1_LCSSA]] = phi i32 [ [[I_0]], [[FOR_COND]] ], [ [[CONV18]], [[FOR_COND1_LOOPEXIT]] ]
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i8 [[CONV43]], 0
|
||||
; CHECK-NEXT: br i1 [[TMP4]], label [[FOR_COND]], label [[FOR_INC42:%.*]]
|
||||
; CHECK: for.body:
|
||||
; CHECK-NEXT: [[L_176:%.*]] = phi i8 [ [[SUB:%.*]], [[FOR_COND1_LOOPEXIT]] ], [ 0, [[FOR_COND]] ]
|
||||
; CHECK-NEXT: [[P_175:%.*]] = phi i64 [ 0, [[FOR_COND1_LOOPEXIT]] ], [ [[P_0]], [[FOR_COND]] ]
|
||||
; CHECK-NEXT: [[J_174:%.*]] = phi i32 [ [[CONV18]], [[FOR_COND1_LOOPEXIT]] ], [ [[J_0]], [[FOR_COND]] ]
|
||||
; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[J_174]], 0
|
||||
; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[CLEANUP45:%.*]], label [[FOR_COND2_PREHEADER:%.*]]
|
||||
; CHECK: for.cond2.preheader:
|
||||
; CHECK-NEXT: [[DOTPR_PRE:%.*]] = load i64, i64* @e, align 8
|
||||
; CHECK-NEXT: switch i64 [[P_175]], label [[FOR_BODY4_PREHEADER6:%.*]] [
|
||||
; CHECK-NEXT: i64 -1, label [[FOR_END12:%.*]]
|
||||
; CHECK-NEXT: i64 -2, label [[FOR_END12]]
|
||||
; CHECK-NEXT: i64 -3, label [[FOR_END12]]
|
||||
; CHECK-NEXT: i64 -4, label [[FOR_END12]]
|
||||
; CHECK-NEXT: i64 -5, label [[FOR_END12]]
|
||||
; CHECK-NEXT: i64 -6, label [[FOR_END12]]
|
||||
; CHECK-NEXT: i64 -7, label [[FOR_END12]]
|
||||
; CHECK-NEXT: i64 0, label [[FOR_END12]]
|
||||
; CHECK-NEXT: ]
|
||||
; CHECK: for.body4.preheader6:
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = sub i64 0, [[P_175]]
|
||||
; CHECK-NEXT: [[XTRAITER:%.*]] = and i64 [[TMP5]], 7
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = add i64 [[P_175]], [[XTRAITER]]
|
||||
; CHECK-NEXT: br label [[FOR_BODY4:%.*]]
|
||||
; CHECK: for.body4:
|
||||
; CHECK-NEXT: [[P_270:%.*]] = phi i64 [ [[INC11_7:%.*]], [[FOR_BODY4]] ], [ [[TMP6]], [[FOR_BODY4_PREHEADER6]] ]
|
||||
; CHECK-NEXT: [[INC11_7]] = add i64 [[P_270]], 8
|
||||
; CHECK-NEXT: [[TOBOOL3_NOT_7:%.*]] = icmp eq i64 [[INC11_7]], 0
|
||||
; CHECK-NEXT: br i1 [[TOBOOL3_NOT_7]], label [[FOR_END12]], label [[FOR_BODY4]]
|
||||
; CHECK: for.end12:
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP0]] to i32*
|
||||
; CHECK-NEXT: [[TMP8:%.*]] = load i32, i32* [[TMP7]], align 4
|
||||
; CHECK-NEXT: [[CONV23:%.*]] = zext i32 [[TMP8]] to i64
|
||||
; CHECK-NEXT: [[TMP9:%.*]] = load i64, i64* @b, align 8
|
||||
; CHECK-NEXT: [[DIV24:%.*]] = udiv i64 [[TMP9]], [[CONV23]]
|
||||
; CHECK-NEXT: store i64 [[DIV24]], i64* @b, align 8
|
||||
; CHECK-NEXT: [[SUB]] = add i8 [[L_176]], -1
|
||||
; CHECK-NEXT: [[TOBOOL32_NOT72:%.*]] = icmp eq i64 [[DOTPR_PRE]], 0
|
||||
; CHECK-NEXT: br i1 [[TOBOOL32_NOT72]], label [[FOR_COND1_LOOPEXIT]], label [[FOR_INC34_PREHEADER:%.*]]
|
||||
; CHECK: for.inc34.preheader:
|
||||
; CHECK-NEXT: store i64 0, i64* @e, align 8
|
||||
; CHECK-NEXT: br label [[FOR_COND1_LOOPEXIT]]
|
||||
; CHECK: for.inc42:
|
||||
; CHECK-NEXT: br label [[FOR_INC42]]
|
||||
; CHECK: cleanup45:
|
||||
; CHECK-NEXT: [[CMP13:%.*]] = icmp ne i8 [[L_176]], 0
|
||||
; CHECK-NEXT: [[CONV16:%.*]] = zext i1 [[CMP13]] to i32
|
||||
; CHECK-NEXT: ret i32 [[CONV16]]
|
||||
;
|
||||
entry:
|
||||
%0 = load i64, i64* @f, align 8
|
||||
%1 = inttoptr i64 %0 to i32*
|
||||
%2 = load i64, i64* @c, align 8
|
||||
%conv18 = trunc i64 %2 to i32
|
||||
%cmp = icmp slt i32 %conv18, 3
|
||||
%3 = load i64, i64* @d, align 8
|
||||
%conv43 = trunc i64 %3 to i8
|
||||
%tobool40.not = icmp eq i8 %conv43, 0
|
||||
br label %for.cond
|
||||
|
||||
for.cond: ; preds = %for.cond39.preheader, %entry
|
||||
%j.0 = phi i32 [ undef, %entry ], [ %j.1.lcssa, %for.cond39.preheader ]
|
||||
%p.0 = phi i64 [ undef, %entry ], [ %p.1.lcssa, %for.cond39.preheader ]
|
||||
%i.0 = phi i32 [ undef, %entry ], [ %i.1.lcssa, %for.cond39.preheader ]
|
||||
%cmp73 = icmp slt i32 %i.0, 3
|
||||
br i1 %cmp73, label %for.body.preheader, label %for.cond39.preheader
|
||||
|
||||
for.body.preheader: ; preds = %for.cond
|
||||
br label %for.body
|
||||
|
||||
for.cond1.loopexit: ; preds = %for.inc34.preheader, %for.end12
|
||||
br i1 %cmp, label %for.body, label %for.cond39.preheader.loopexit
|
||||
|
||||
for.cond39.preheader.loopexit: ; preds = %for.cond1.loopexit
|
||||
br label %for.cond39.preheader
|
||||
|
||||
for.cond39.preheader: ; preds = %for.cond39.preheader.loopexit, %for.cond
|
||||
%j.1.lcssa = phi i32 [ %j.0, %for.cond ], [ %conv18, %for.cond39.preheader.loopexit ]
|
||||
%p.1.lcssa = phi i64 [ %p.0, %for.cond ], [ 0, %for.cond39.preheader.loopexit ]
|
||||
%i.1.lcssa = phi i32 [ %i.0, %for.cond ], [ %conv18, %for.cond39.preheader.loopexit ]
|
||||
br i1 %tobool40.not, label %for.cond, label %for.inc42.preheader
|
||||
|
||||
for.inc42.preheader: ; preds = %for.cond39.preheader
|
||||
br label %for.inc42
|
||||
|
||||
for.body: ; preds = %for.body.preheader, %for.cond1.loopexit
|
||||
%l.176 = phi i8 [ %sub, %for.cond1.loopexit ], [ 0, %for.body.preheader ]
|
||||
%p.175 = phi i64 [ 0, %for.cond1.loopexit ], [ %p.0, %for.body.preheader ]
|
||||
%j.174 = phi i32 [ %conv18, %for.cond1.loopexit ], [ %j.0, %for.body.preheader ]
|
||||
%tobool.not = icmp eq i32 %j.174, 0
|
||||
br i1 %tobool.not, label %cleanup45, label %for.cond2.preheader
|
||||
|
||||
for.cond2.preheader: ; preds = %for.body
|
||||
%tobool3.not69 = icmp eq i64 %p.175, 0
|
||||
%.pr.pre = load i64, i64* @e, align 8
|
||||
br i1 %tobool3.not69, label %for.end12, label %for.body4.preheader
|
||||
|
||||
for.body4.preheader: ; preds = %for.cond2.preheader
|
||||
%4 = sub i64 0, %p.175
|
||||
%xtraiter = and i64 %4, 7
|
||||
%lcmp.mod.not = icmp eq i64 %xtraiter, 0
|
||||
br i1 %lcmp.mod.not, label %for.body4.prol.loopexit, label %for.body4.prol.preheader
|
||||
|
||||
for.body4.prol.preheader: ; preds = %for.body4.preheader
|
||||
%5 = mul nsw i64 %xtraiter, -1
|
||||
br label %for.body4.prol
|
||||
|
||||
for.body4.prol: ; preds = %for.body4.prol.preheader, %for.body4.prol
|
||||
%lsr.iv = phi i64 [ 0, %for.body4.prol.preheader ], [ %lsr.iv.next, %for.body4.prol ]
|
||||
%lsr.iv.next = add nsw i64 %lsr.iv, -1
|
||||
%prol.iter.cmp.not = icmp eq i64 %5, %lsr.iv.next
|
||||
br i1 %prol.iter.cmp.not, label %for.body4.prol.loopexit.loopexit, label %for.body4.prol
|
||||
|
||||
for.body4.prol.loopexit.loopexit: ; preds = %for.body4.prol
|
||||
%6 = sub i64 %p.175, %lsr.iv.next
|
||||
br label %for.body4.prol.loopexit
|
||||
|
||||
for.body4.prol.loopexit: ; preds = %for.body4.prol.loopexit.loopexit, %for.body4.preheader
|
||||
%p.270.unr = phi i64 [ %p.175, %for.body4.preheader ], [ %6, %for.body4.prol.loopexit.loopexit ]
|
||||
%7 = icmp ugt i64 %p.175, -8
|
||||
br i1 %7, label %for.end12, label %for.body4.preheader89
|
||||
|
||||
for.body4.preheader89: ; preds = %for.body4.prol.loopexit
|
||||
br label %for.body4
|
||||
|
||||
for.body4: ; preds = %for.body4.preheader89, %for.body4
|
||||
%p.270 = phi i64 [ %inc11.7, %for.body4 ], [ %p.270.unr, %for.body4.preheader89 ]
|
||||
%inc11.7 = add i64 %p.270, 8
|
||||
%tobool3.not.7 = icmp eq i64 %inc11.7, 0
|
||||
br i1 %tobool3.not.7, label %for.end12.loopexit, label %for.body4
|
||||
|
||||
for.end12.loopexit: ; preds = %for.body4
|
||||
br label %for.end12
|
||||
|
||||
for.end12: ; preds = %for.end12.loopexit, %for.body4.prol.loopexit, %for.cond2.preheader
|
||||
%8 = load i32, i32* %1, align 4
|
||||
%conv23 = zext i32 %8 to i64
|
||||
%9 = load i64, i64* @b, align 8
|
||||
%div24 = udiv i64 %9, %conv23
|
||||
store i64 %div24, i64* @b, align 8
|
||||
%sub = add i8 %l.176, -1
|
||||
%tobool32.not72 = icmp eq i64 %.pr.pre, 0
|
||||
br i1 %tobool32.not72, label %for.cond1.loopexit, label %for.inc34.preheader
|
||||
|
||||
for.inc34.preheader: ; preds = %for.end12
|
||||
store i64 0, i64* @e, align 8
|
||||
br label %for.cond1.loopexit
|
||||
|
||||
for.inc42: ; preds = %for.inc42.preheader, %for.inc42
|
||||
br label %for.inc42
|
||||
|
||||
cleanup45: ; preds = %for.body
|
||||
%cmp13 = icmp ne i8 %l.176, 0
|
||||
%conv16 = zext i1 %cmp13 to i32
|
||||
ret i32 %conv16
|
||||
}
|
Loading…
Reference in New Issue