[llvm] 7d38a91 - Restore fixed version of "[CodeGenPrepare] Fix isIVIncrement (PR49466)"

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Sat Mar 13 15:30:21 PST 2021


Author: Philip Reames
Date: 2021-03-13T15:25:02-08:00
New Revision: 7d38a91a7f3d3bc749636d6e698a5860f38ec20a

URL: https://github.com/llvm/llvm-project/commit/7d38a91a7f3d3bc749636d6e698a5860f38ec20a
DIFF: https://github.com/llvm/llvm-project/commit/7d38a91a7f3d3bc749636d6e698a5860f38ec20a.diff

LOG: 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.

Added: 
    llvm/test/CodeGen/X86/pr49466.ll

Modified: 
    llvm/lib/CodeGen/CodeGenPrepare.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index 0182cdf2ca8c..8e24c86dfcf2 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -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;

diff  --git a/llvm/test/CodeGen/X86/pr49466.ll b/llvm/test/CodeGen/X86/pr49466.ll
new file mode 100644
index 000000000000..dc8a3bba271c
--- /dev/null
+++ b/llvm/test/CodeGen/X86/pr49466.ll
@@ -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"
+
+ at b = dso_local local_unnamed_addr global i64 0, align 8
+ at c = dso_local local_unnamed_addr global i64 0, align 8
+ at d = dso_local local_unnamed_addr global i64 0, align 8
+ at e = dso_local local_unnamed_addr global i64 0, align 8
+ at f = dso_local local_unnamed_addr global i64 0, align 8
+ at 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
+}


        


More information about the llvm-commits mailing list