[llvm-commits] [llvm] r50174 - /llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp

Dale Johannesen dalej at apple.com
Wed Apr 23 11:34:37 PDT 2008


Author: johannes
Date: Wed Apr 23 13:34:37 2008
New Revision: 50174

URL: http://llvm.org/viewvc/llvm-project?rev=50174&view=rev
Log:
Rewrite previous patch to suit Chris's preference.


Modified:
    llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp

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

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Wed Apr 23 13:34:37 2008
@@ -8694,6 +8694,31 @@
   return visitCallSite(&II);
 }
 
+// If this cast does not affect the value passed through the varargs
+// area, we can eliminate the use of the cast.
+static bool isSafeToEliminateVarargsCast(const CallSite CS,
+                                         const CastInst * const CI,
+                                         const TargetData * const TD,
+                                         const int ix) {
+  if (!CI->isLosslessCast())
+    return false;
+
+  // The size of ByVal arguments is derived from the type, so we
+  // can't change to a type with a different size.  If the size were
+  // passed explicitly we could avoid this check.
+  if (!CS.paramHasAttr(ix, ParamAttr::ByVal))
+    return true;
+
+  const Type* SrcTy = 
+            cast<PointerType>(CI->getOperand(0)->getType())->getElementType();
+  const Type* DstTy = cast<PointerType>(CI->getType())->getElementType();
+  if (!SrcTy->isSized() || !DstTy->isSized())
+    return false;
+  if (TD->getABITypeSize(SrcTy) != TD->getABITypeSize(DstTy))
+    return false;
+  return true;
+}
+
 // visitCallSite - Improvements for call and invoke instructions.
 //
 Instruction *InstCombiner::visitCallSite(CallSite CS) {
@@ -8752,28 +8777,13 @@
     // See if we can optimize any arguments passed through the varargs area of
     // the call.
     for (CallSite::arg_iterator I = CS.arg_begin()+FTy->getNumParams(),
-           E = CS.arg_end(); I != E; ++I, ++ix)
-      if (CastInst *CI = dyn_cast<CastInst>(*I)) {
-        // If this cast does not affect the value passed through the varargs
-        // area, we can eliminate the use of the cast.
-        const PointerType* SrcPTy, *DstPTy;
-        if (CI->isLosslessCast()) {
-          // The size of ByVal arguments is derived from the type, so we
-          // can't change to a type with a different size.  If the size were
-          // passed explicitly we could avoid this check.
-          if (CS.paramHasAttr(ix, ParamAttr::ByVal) &&
-              (SrcPTy = cast<PointerType>(CI->getOperand(0)->getType())) &&
-              (DstPTy = cast<PointerType>(CI->getType()))) {
-            const Type* SrcTy = SrcPTy->getElementType();
-            const Type* DstTy = DstPTy->getElementType();
-            if (!SrcTy->isSized() || !DstTy->isSized() ||
-                TD->getABITypeSize(SrcTy) != TD->getABITypeSize(DstTy))
-              continue;
-          }
-          *I = CI->getOperand(0);
-          Changed = true;
-        }
+           E = CS.arg_end(); I != E; ++I, ++ix) {
+      CastInst *CI = dyn_cast<CastInst>(*I);
+      if (CI && isSafeToEliminateVarargsCast(CS, CI, TD, ix)) {
+        *I = CI->getOperand(0);
+        Changed = true;
       }
+    }
   }
 
   if (isa<InlineAsm>(Callee) && !CS.doesNotThrow()) {





More information about the llvm-commits mailing list