[PATCH] D112980: [LoopInfo] Fix a bug in the function getInductionVariable

duanbo via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 4 04:57:30 PDT 2021


duan.db updated this revision to Diff 384707.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112980/new/

https://reviews.llvm.org/D112980

Files:
  llvm/lib/Analysis/LoopInfo.cpp
  llvm/unittests/Analysis/LoopInfoTest.cpp


Index: llvm/unittests/Analysis/LoopInfoTest.cpp
===================================================================
--- llvm/unittests/Analysis/LoopInfoTest.cpp
+++ llvm/unittests/Analysis/LoopInfoTest.cpp
@@ -1547,3 +1547,49 @@
     EXPECT_EQ(L->getLoopGuardBranch(), nullptr);
   });
 }
+
+TEST(LoopInfoTest, LoopInductionVariable) {
+  const char *ModuleStr =
+      "; Function Attrs: nofree norecurse nosync nounwind readonly\n"
+      "define dso_local signext i32 @foo(i8* nocapture readonly %hdrptr) local_unnamed_addr #0 {\n"
+      "entry:\n"
+      "  %0 = bitcast i8* %hdrptr to i16*\n"
+      "  br label %for.body\n"
+      "for.body:                                         ; preds = %entry, %for.body\n"
+      "  %addr.010 = phi i16* [ %0, %entry ], [ %incdec.ptr, %for.body ]\n"
+      "  %sum.09 = phi i64 [ 0, %entry ], [ %add, %for.body ]\n"
+      "  %count.08 = phi i32 [ 6000, %entry ], [ %dec, %for.body ]\n"
+      "  %1 = load i16, i16* %addr.010, align 2, !tbaa !4\n"
+      "  %conv = zext i16 %1 to i64\n"
+      "  %add = add i64 %sum.09, %conv\n"
+      "  %dec = add nsw i32 %count.08, -1\n"
+      "  %incdec.ptr = getelementptr inbounds i16, i16* %addr.010, i64 1\n"
+      "  %cmp = icmp ugt i32 %count.08, 1\n"
+      "  br i1 %cmp, label %for.body, label %for.end, !llvm.loop !8\n"
+      "for.end:                                          ; preds = %for.body\n"
+      "  %conv27 = and i64 %add, 65535\n"
+      "  %cmp3 = icmp eq i64 %conv27, 65535\n"
+      "  %conv4 = zext i1 %cmp3 to i32\n"
+      "  ret i32 %conv4\n"
+      "}\n"
+      "!4 = !{!5, !5, i64 0}\n"
+      "!5 = !{!\"short\", !6, i64 0}\n"
+      "!6 = !{!\"omnipotent char\", !7, i64 0}\n"
+      "!7 = !{!\"Simple C/C++ TBAA\"}\n"
+      "!8 = distinct !{!8, !9}\n"
+      "!9 = !{!\"llvm.loop.unroll.disable\"}\n";
+
+  // Parse the module.
+  LLVMContext Context;
+  std::unique_ptr<Module> M = makeLLVMModule(Context, ModuleStr);
+
+  runWithLoopInfoPlus(
+      *M, "foo", [&](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
+        Function::iterator FI = F.begin();
+        // First basic block is entry - skip it.
+        BasicBlock *Header = &*(++FI);
+        Loop *L = LI.getLoopFor(Header);
+        EXPECT_NE(L, nullptr);
+        EXPECT_EQ(L->getInductionVariable(SE)->getName(), "count.08");
+      });
+}
Index: llvm/lib/Analysis/LoopInfo.cpp
===================================================================
--- llvm/lib/Analysis/LoopInfo.cpp
+++ llvm/lib/Analysis/LoopInfo.cpp
@@ -301,15 +301,16 @@
   if (!CmpInst)
     return nullptr;
 
-  Instruction *LatchCmpOp0 = dyn_cast<Instruction>(CmpInst->getOperand(0));
-  Instruction *LatchCmpOp1 = dyn_cast<Instruction>(CmpInst->getOperand(1));
+  Value *LatchCmpOp0 = CmpInst->getOperand(0);
+  Value *LatchCmpOp1 = CmpInst->getOperand(1);
 
   for (PHINode &IndVar : Header->phis()) {
     InductionDescriptor IndDesc;
     if (!InductionDescriptor::isInductionPHI(&IndVar, this, &SE, IndDesc))
       continue;
 
-    Instruction *StepInst = IndDesc.getInductionBinOp();
+    BasicBlock *Latch = this->getLoopLatch();
+    Value *StepInst = IndVar.getIncomingValueForBlock(Latch);
 
     // case 1:
     // IndVar = phi[{InitialValue, preheader}, {StepInst, latch}]


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112980.384707.patch
Type: text/x-patch
Size: 3253 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211104/f5726a07/attachment.bin>


More information about the llvm-commits mailing list