[llvm-commits] [llvm] r71199 - in /llvm/trunk: lib/Transforms/Utils/InlineFunction.cpp test/Transforms/Inline/2009-05-07-CallUsingSelfCrash.ll

Eli Friedman eli.friedman at gmail.com
Thu May 7 17:22:05 PDT 2009


Author: efriedma
Date: Thu May  7 19:22:04 2009
New Revision: 71199

URL: http://llvm.org/viewvc/llvm-project?rev=71199&view=rev
Log:
PR4123: don't crash when inlining a call which uses its own result.


Added:
    llvm/trunk/test/Transforms/Inline/2009-05-07-CallUsingSelfCrash.ll
Modified:
    llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp

Modified: llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=71199&r1=71198&r2=71199&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp Thu May  7 19:22:04 2009
@@ -516,7 +516,10 @@
     // uses of the returned value.
     if (!TheCall->use_empty()) {
       ReturnInst *R = Returns[0];
-      TheCall->replaceAllUsesWith(R->getReturnValue());
+      if (TheCall == R->getReturnValue())
+        TheCall->replaceAllUsesWith(UndefValue::get(TheCall->getType()));
+      else
+        TheCall->replaceAllUsesWith(R->getReturnValue());
     }
     // Since we are now done with the Call/Invoke, we can delete it.
     TheCall->eraseFromParent();
@@ -605,8 +608,12 @@
   } else if (!Returns.empty()) {
     // Otherwise, if there is exactly one return value, just replace anything
     // using the return value of the call with the computed value.
-    if (!TheCall->use_empty())
-      TheCall->replaceAllUsesWith(Returns[0]->getReturnValue());
+    if (!TheCall->use_empty()) {
+      if (TheCall == Returns[0]->getReturnValue())
+        TheCall->replaceAllUsesWith(UndefValue::get(TheCall->getType()));
+      else
+        TheCall->replaceAllUsesWith(Returns[0]->getReturnValue());
+    }
 
     // Splice the code from the return block into the block that it will return
     // to, which contains the code that was after the call.

Added: llvm/trunk/test/Transforms/Inline/2009-05-07-CallUsingSelfCrash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/2009-05-07-CallUsingSelfCrash.ll?rev=71199&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/Inline/2009-05-07-CallUsingSelfCrash.ll (added)
+++ llvm/trunk/test/Transforms/Inline/2009-05-07-CallUsingSelfCrash.ll Thu May  7 19:22:04 2009
@@ -0,0 +1,20 @@
+; RUN: llvm-as < %s | opt -inline -disable-output
+; PR4123
+	%struct.S0 = type <{ i32 }>
+	%struct.S1 = type <{ i8, i8, i8, i8, %struct.S0 }>
+	%struct.S2 = type <{ %struct.S1, i32 }>
+
+define void @func_113(%struct.S1* noalias nocapture sret %agg.result, i8 signext %p_114) noreturn nounwind {
+entry:
+	unreachable
+
+for.inc:		; preds = %for.inc
+	%call48 = call fastcc signext i8 @safe_sub_func_uint8_t_u_u(i8 signext %call48)		; <i8> [#uses=1]
+	br label %for.inc
+}
+
+define fastcc signext i8 @safe_sub_func_uint8_t_u_u(i8 signext %_ui1) nounwind readnone {
+entry:
+	ret i8 %_ui1
+}
+





More information about the llvm-commits mailing list