[llvm-commits] [llvm] r47904 - in /llvm/trunk: lib/Transforms/Utils/InlineFunction.cpp test/Transforms/Inline/2008-03-04-StructRet.ll

Devang Patel dpatel at apple.com
Tue Mar 4 13:15:16 PST 2008


Author: dpatel
Date: Tue Mar  4 15:15:15 2008
New Revision: 47904

URL: http://llvm.org/viewvc/llvm-project?rev=47904&view=rev
Log:
Handle multiple return values.

Added:
    llvm/trunk/test/Transforms/Inline/2008-03-04-StructRet.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=47904&r1=47903&r2=47904&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp Tue Mar  4 15:15:15 2008
@@ -442,9 +442,21 @@
 
     // If the return instruction returned a value, replace uses of the call with
     // uses of the returned value.
-    if (!TheCall->use_empty())
-      TheCall->replaceAllUsesWith(Returns[0]->getReturnValue());
-
+    if (!TheCall->use_empty()) {
+      ReturnInst *R = Returns[0];
+      if (R->getNumOperands() > 1) {
+        // Multiple return values.
+        for (Value::use_iterator RUI = TheCall->use_begin(),
+               RUE = TheCall->use_end(); RUI != RUE; ) {
+          GetResultInst *GR = dyn_cast<GetResultInst>(RUI++);
+          assert (GR && "Invalid Call instruction use!");
+          Value *RV = R->getOperand(GR->getIndex());
+          GR->replaceAllUsesWith(RV);
+          GR->eraseFromParent();
+        }
+      } else
+        TheCall->replaceAllUsesWith(R->getReturnValue());
+    }
     // Since we are now done with the Call/Invoke, we can delete it.
     TheCall->getParent()->getInstList().erase(TheCall);
 

Added: llvm/trunk/test/Transforms/Inline/2008-03-04-StructRet.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/2008-03-04-StructRet.ll?rev=47904&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/Inline/2008-03-04-StructRet.ll (added)
+++ llvm/trunk/test/Transforms/Inline/2008-03-04-StructRet.ll Tue Mar  4 15:15:15 2008
@@ -0,0 +1,26 @@
+; RUN: llvm-as < %s | opt -inline -sretpromotion -disable-output
+	%struct.Benchmark = type { i32 (...)** }
+	%struct.Complex = type { double, double }
+	%struct.ComplexBenchmark = type { %struct.Benchmark }
+
+define void @_Zml7ComplexS_(%struct.Complex* sret  %agg.result, double %a.0, double %a.1, double %b.0, double %b.1) nounwind  {
+entry:
+	ret void
+}
+
+define void @_ZNK16ComplexBenchmark9oop_styleEv(%struct.ComplexBenchmark* %this) nounwind  {
+entry:
+	%tmp = alloca %struct.Complex		; <%struct.Complex*> [#uses=2]
+	br label %bb31
+
+bb:		; preds = %bb31
+	call void @_Zml7ComplexS_( %struct.Complex* sret  %tmp, double 0.000000e+00, double 0.000000e+00, double 0.000000e+00, double 0.000000e+00 ) nounwind 
+	%tmp21 = getelementptr %struct.Complex* %tmp, i32 0, i32 1		; <double*> [#uses=0]
+	br label %bb31
+
+bb31:		; preds = %bb, %entry
+	br i1 false, label %bb, label %return
+
+return:		; preds = %bb31
+	ret void
+}





More information about the llvm-commits mailing list