1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 20:23:11 +01:00

Restore fixed version of "[CodeGenPrepare] Fix isIVIncrement (PR49466)"

Change was reverted in commit 8d20f2c2c66eb486ff23cc3d55a53bd840b36971 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:
Philip Reames 2021-03-13 15:02:48 -08:00
parent 44498cb737
commit 3ea5a04801
2 changed files with 194 additions and 1 deletions

View File

@ -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;

192
test/CodeGen/X86/pr49466.ll Normal file
View File

@ -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
}