[llvm-commits] [llvm] r72266 - in /llvm/trunk: lib/Transforms/Scalar/IndVarSimplify.cpp test/Transforms/IndVarSimplify/interesting-invoke-use.ll

Dan Gohman gohman at apple.com
Fri May 22 09:47:11 PDT 2009


Author: djg
Date: Fri May 22 11:47:11 2009
New Revision: 72266

URL: http://llvm.org/viewvc/llvm-project?rev=72266&view=rev
Log:
Teach IndVarSimplify's FixUsesBeforeDefs to handle InvokeInsts by
assuming that the use of the value is in a block dominated by the
"normal" destination. LangRef.html and other documentation sources
don't explicitly guarantee this, but it seems to be assumed in
other places in LLVM at least.

This fixes an assertion failure on the included testcase, which
is derived from the Ada testsuite.

FixUsesBeforeDefs is a temporary measure which I'm looking to
replace with a more capable solution.

Added:
    llvm/trunk/test/Transforms/IndVarSimplify/interesting-invoke-use.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp?rev=72266&r1=72265&r2=72266&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp Fri May 22 11:47:11 2009
@@ -662,7 +662,11 @@
         if (Z != NumPredsLeft.end() && Z->second != 0 && --Z->second == 0) {
           SmallVector<Instruction *, 4> UseWorkList;
           UseWorkList.push_back(Inst);
-          BasicBlock::iterator InsertPt = next(I);
+          BasicBlock::iterator InsertPt = I;
+          if (InvokeInst *II = dyn_cast<InvokeInst>(InsertPt))
+            InsertPt = II->getNormalDest()->begin();
+          else
+            ++InsertPt;
           while (isa<PHINode>(InsertPt)) ++InsertPt;
           do {
             Instruction *Use = UseWorkList.pop_back_val();

Added: llvm/trunk/test/Transforms/IndVarSimplify/interesting-invoke-use.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IndVarSimplify/interesting-invoke-use.ll?rev=72266&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/IndVarSimplify/interesting-invoke-use.ll (added)
+++ llvm/trunk/test/Transforms/IndVarSimplify/interesting-invoke-use.ll Fri May 22 11:47:11 2009
@@ -0,0 +1,57 @@
+; RUN: llvm-as < %s | opt -indvars
+
+; An invoke has a result value which is used in an "Interesting"
+; expression inside the loop. IndVars should be able to rewrite
+; the expression in the correct place.
+
+target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32"
+target triple = "i386-pc-linux-gnu"
+  %struct.string___XUB = type { i32, i32 }
+  %struct.string___XUP = type { [0 x i8]*, %struct.string___XUB* }
+ at .str7 = external constant [24 x i8]            ; <[24 x i8]*> [#uses=1]
+ at C.17.316 = external constant %struct.string___XUB              ; <%struct.string___XUB*> [#uses=1]
+
+define void @_ada_c35503g() {
+entry:
+  br label %bb
+
+bb:             ; preds = %bb, %entry
+  br i1 false, label %bb65.loopexit, label %bb
+
+bb65.loopexit:          ; preds = %bb
+  br label %bb123
+
+bb123:          ; preds = %bb178, %bb65.loopexit
+  %i.0 = phi i32 [ %3, %bb178 ], [ 0, %bb65.loopexit ]          ; <i32> [#uses=3]
+  %0 = invoke i32 @report__ident_int(i32 1)
+      to label %invcont127 unwind label %lpad266                ; <i32> [#uses=1]
+
+invcont127:             ; preds = %bb123
+  %1 = sub i32 %i.0, %0         ; <i32> [#uses=1]
+  %2 = icmp eq i32 0, %1                ; <i1> [#uses=1]
+  br i1 %2, label %bb178, label %bb128
+
+bb128:          ; preds = %invcont127
+  invoke void @system__img_int__image_integer(%struct.string___XUP* noalias sret null, i32 %i.0)
+      to label %invcont129 unwind label %lpad266
+
+invcont129:             ; preds = %bb128
+  invoke void @system__string_ops__str_concat(%struct.string___XUP* noalias sret null, [0 x i8]* bitcast ([24 x i8]* @.str7 to [0 x i8]*), %struct.string___XUB* @C.17.316, [0 x i8]* null, %struct.string___XUB* null)
+      to label %invcont138 unwind label %lpad266
+
+invcont138:             ; preds = %invcont129
+  unreachable
+
+bb178:          ; preds = %invcont127
+  %3 = add i32 %i.0, 1          ; <i32> [#uses=1]
+  br label %bb123
+
+lpad266:                ; preds = %invcont129, %bb128, %bb123
+  unreachable
+}
+
+declare void @system__img_int__image_integer(%struct.string___XUP* noalias sret, i32)
+
+declare void @system__string_ops__str_concat(%struct.string___XUP* noalias sret, [0 x i8]*, %struct.string___XUB*, [0 x i8]*, %struct.string___XUB*)
+
+declare i32 @report__ident_int(i32)





More information about the llvm-commits mailing list