[llvm-commits] [llvm] r149457 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineCalls.cpp test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll test/Transforms/InstCombine/call.ll

Jim Grosbach grosbach at apple.com
Tue Jan 31 16:08:17 PST 2012


Author: grosbach
Date: Tue Jan 31 18:08:17 2012
New Revision: 149457

URL: http://llvm.org/viewvc/llvm-project?rev=149457&view=rev
Log:
Disable InstCombine unsafe folding bitcasts of calls w/ varargs.

Changing arguments from being passed as fixed to varargs is unsafe, as
the ABI may require they be handled differently (stack vs. register, for
example).

Remove two tests which rely on the bitcast being folded into the direct
call, which is exactly the transformation that's unsafe.

Removed:
    llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll
Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
    llvm/trunk/test/Transforms/InstCombine/call.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp?rev=149457&r1=149456&r2=149457&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp Tue Jan 31 18:08:17 2012
@@ -1105,21 +1105,12 @@
     if (FT->isVarArg()!=cast<FunctionType>(APTy->getElementType())->isVarArg())
       return false;
   }
-      
-  if (FT->getNumParams() < NumActualArgs && FT->isVarArg() &&
-      !CallerPAL.isEmpty())
-    // In this case we have more arguments than the new function type, but we
-    // 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.getNumSlots(); i; --i) {
-      if (CallerPAL.getSlot(i - 1).Index <= FT->getNumParams())
-        break;
-      Attributes PAttrs = CallerPAL.getSlot(i - 1).Attrs;
-      if (PAttrs & Attribute::VarArgsIncompatible)
-        return false;
-    }
 
-  
+  // If we're casting varargs to non-varargs, that may not be allowable
+  // under the ABI, so conservatively don't do anything.
+  if (FT->getNumParams() < NumActualArgs && FT->isVarArg())
+    return false;
+
   // Okay, we decided that this is a safe thing to do: go ahead and start
   // inserting cast instructions as necessary.
   std::vector<Value*> Args;

Removed: 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=149456&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll (removed)
@@ -1,23 +0,0 @@
-; Ignore stderr, we expect warnings there
-; RUN: opt < %s -instcombine 2> /dev/null -S | not grep bitcast
-
-define void @a() {
-	ret void
-}
-
-define signext i32 @b(i32* inreg  %x)   {
-	ret i32 0
-}
-
-define void @c(...) {
-	ret void
-}
-
-define void @g(i32* %y) {
-	call void bitcast (void ()* @a to void (i32*)*)( i32* noalias  %y )
-	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 void bitcast (void (...)* @c to void (i32)*)( i32 zeroext  0 )
-	ret void
-}

Modified: llvm/trunk/test/Transforms/InstCombine/call.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/call.ll?rev=149457&r1=149456&r2=149457&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/call.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/call.ll Tue Jan 31 18:08:17 2012
@@ -30,20 +30,6 @@
 }
 
 
-; Resolving this should insert a cast from sbyte to int, following the C 
-; promotion rules.
-define void @test3a(i8, ...) {unreachable }
-
-define void @test3(i8 %A, i8 %B) {
-        call void bitcast (void (i8, ...)* @test3a to void (i8, i8)*)( i8 %A, i8 %B 
-)
-        ret void
-; CHECK: %1 = zext i8 %B to i32
-; CHECK: call void (i8, ...)* @test3a(i8 %A, i32 %1)
-; CHECK: ret void
-}
-
-
 ; test conversion of return value...
 define i8 @test4a() {
         ret i8 0





More information about the llvm-commits mailing list