[llvm-commits] [llvm] r76502 - in /llvm/trunk/lib/CodeGen/SelectionDAG: SelectionDAGBuild.cpp TargetLowering.cpp

Chris Lattner clattner at apple.com
Mon Jul 20 16:32:08 PDT 2009


On Jul 20, 2009, at 4:27 PM, Dale Johannesen wrote:
> Author: johannes
> Date: Mon Jul 20 18:27:39 2009
> New Revision: 76502
>
> URL: http://llvm.org/viewvc/llvm-project?rev=76502&view=rev
> Log:
> Move stripping of bitcasts in inline asm arguments
> to a place where it affects everything.  Occurs
> only on calls AFAIK.

Hi Dale, please use Value::stripPointerCasts to do this.  This will  
strip things like 'getelementptr x, 0, 0, 0' which constantexpr  
bitcasts sometimes get canonicalized into.

-Chris

>
>
> Modified:
>    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
>    llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp?rev=76502&r1=76501&r2=76502&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp  
> (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp Mon  
> Jul 20 18:27:39 2009
> @@ -5059,6 +5059,11 @@
>     // If this is an input or an indirect output, process the call  
> argument.
>     // BasicBlocks are labels, currently appearing only in asm's.
>     if (OpInfo.CallOperandVal) {
> +      // Strip bitcasts, if any.  This mostly comes up for functions.
> +      ConstantExpr* CE = NULL;
> +      while ((CE = dyn_cast<ConstantExpr>(OpInfo.CallOperandVal)) &&
> +             CE->getOpcode()==Instruction::BitCast)
> +        OpInfo.CallOperandVal = CE->getOperand(0);
>       if (BasicBlock *BB =  
> dyn_cast<BasicBlock>(OpInfo.CallOperandVal)) {
>         OpInfo.CallOperand = DAG.getBasicBlock(FuncInfo.MBBMap[BB]);
>       } else {
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=76502&r1=76501&r2=76502&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Mon Jul  
> 20 18:27:39 2009
> @@ -2406,20 +2406,10 @@
>
>   // 'X' matches anything.
>   if (OpInfo.ConstraintCode == "X" && OpInfo.CallOperandVal) {
> -    // Look through bitcasts over functions.  In the context of an  
> asm
> -    // argument we don't care about bitcasting function types; the  
> parameters
> -    // to the function, if any, will have been handled elsewhere.
> -    Value *v = OpInfo.CallOperandVal;
> -    ConstantExpr *CE = NULL;
> -    while ((CE = dyn_cast<ConstantExpr>(v)) &&
> -           CE->getOpcode()==Instruction::BitCast)
> -      v = CE->getOperand(0);
> -    if (!isa<Function>(v))
> -      v = OpInfo.CallOperandVal;
>     // Labels and constants are handled elsewhere ('X' is the only  
> thing
>     // that matches labels).  For Functions, the type here is the  
> type of
> -    // the result, which is not what we want to look at; leave them  
> alone
> -    // (minus any bitcasts).
> +    // the result, which is not what we want to look at; leave them  
> alone.
> +    Value *v = OpInfo.CallOperandVal;
>     if (isa<BasicBlock>(v) || isa<ConstantInt>(v) ||  
> isa<Function>(v)) {
>       OpInfo.CallOperandVal = v;
>       return;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list