[llvm-commits] [llvm] r45931 - in /llvm/trunk: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll test/Transforms/InstCombine/2008-01-13-NoBitCastAttributes.ll

Duncan Sands baldrick at free.fr
Sun Jan 13 00:02:47 PST 2008


Author: baldrick
Date: Sun Jan 13 02:02:44 2008
New Revision: 45931

URL: http://llvm.org/viewvc/llvm-project?rev=45931&view=rev
Log:
When turning a call to a bitcast function into a direct call,
if this becomes a varargs call then deal correctly with any
parameter attributes on the newly vararg call arguments.

Added:
    llvm/trunk/test/Transforms/InstCombine/2008-01-13-NoBitCastAttributes.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
    llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll

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

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Sun Jan 13 02:02:44 2008
@@ -8142,9 +8142,9 @@
       return false;   // Cannot transform this return value.
 
     if (!Caller->use_empty() &&
-        !CastInst::isCastable(FT->getReturnType(), OldRetTy) &&
         // void -> non-void is handled specially
-        FT->getReturnType() != Type::VoidTy)
+        FT->getReturnType() != Type::VoidTy &&
+        !CastInst::isCastable(FT->getReturnType(), OldRetTy))
       return false;   // Cannot transform this return value.
 
     if (CallerPAL && !Caller->use_empty()) {
@@ -8200,14 +8200,17 @@
       Callee->isDeclaration())
     return false;   // Do not delete arguments unless we have a function body...
 
-  if (FT->getNumParams() < NumActualArgs && FT->isVarArg())
+  if (FT->getNumParams() < NumActualArgs && FT->isVarArg() && CallerPAL)
     // In this case we have more arguments than the new function type, but we
-    // won't be dropping them.  Some of them may have attributes.  If so, we
-    // cannot perform the transform because attributes are not allowed after
-    // the end of the function type.
-    if (CallerPAL && CallerPAL->size() &&
-        CallerPAL->getParamIndex(CallerPAL->size()-1) > FT->getNumParams())
-      return false;
+    // won't be dropping them.  Check that these extra arguments have attributes
+    // that are compatible with being a vararg call argument.
+    for (unsigned i = CallerPAL->size(); i; --i) {
+      if (CallerPAL->getParamIndex(i - 1) <= FT->getNumParams())
+        break;
+      uint16_t PAttrs = CallerPAL->getParamAttrsAtIndex(i - 1);
+      if (PAttrs & ParamAttr::VarArgsIncompatible)
+        return false;
+    }
 
   // Okay, we decided that this is a safe thing to do: go ahead and start
   // inserting cast instructions as necessary...
@@ -8269,10 +8272,12 @@
         } else {
           Args.push_back(*AI);
         }
-      }
 
-      // No need to add parameter attributes - we already checked that there
-      // aren't any.
+        // Add any parameter attributes.
+        uint16_t PAttrs = CallerPAL ? CallerPAL->getParamAttrs(i + 1) : 0;
+        if (PAttrs)
+          attrVec.push_back(ParamAttrsWithIndex::get(i + 1, PAttrs));
+      }
     }
 
   if (FT->getReturnType() == Type::VoidTy)

Modified: llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll?rev=45931&r1=45930&r2=45931&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll Sun Jan 13 02:02:44 2008
@@ -1,4 +1,4 @@
-; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep bitcast | count 2
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep bitcast
 
 define void @a() {
 	ret void
@@ -17,7 +17,6 @@
 	call <2 x i32> bitcast (i32 (i32*)* @b to <2 x i32> (i32*)*)( i32* inreg  null )		; <<2 x i32>>:1 [#uses=0]
 	%x = call i64 bitcast (i32 (i32*)* @b to i64 (i32)*)( i32 0 )		; <i64> [#uses=0]
 	call void bitcast (void (...)* @c to void (i32)*)( i32 0 )
-	call i32 bitcast (i32 (i32*)* @b to i32 (i32)*)( i32 zeroext  0 )		; <i32>:2 [#uses=0]
 	call void bitcast (void (...)* @c to void (i32)*)( i32 zeroext  0 )
 	ret void
 }

Added: llvm/trunk/test/Transforms/InstCombine/2008-01-13-NoBitCastAttributes.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2008-01-13-NoBitCastAttributes.ll?rev=45931&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/2008-01-13-NoBitCastAttributes.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/2008-01-13-NoBitCastAttributes.ll Sun Jan 13 02:02:44 2008
@@ -0,0 +1,15 @@
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep bitcast | count 2
+
+define i32 @b(i32* inreg  %x) signext  {
+	ret i32 0
+}
+
+define void @c(...) {
+	ret void
+}
+
+define void @g(i32* %y) {
+	call i32 bitcast (i32 (i32*)* @b to i32 (i32)*)( i32 zeroext  0 )		; <i32>:2 [#uses=0]
+	call void bitcast (void (...)* @c to void (i32*)*)( i32* sret  null )
+	ret void
+}





More information about the llvm-commits mailing list