From 5339c551b508d8231672b417d9df1629e42af89b Mon Sep 17 00:00:00 2001 From: Dale Johannesen Date: Mon, 20 Jul 2009 23:27:39 +0000 Subject: [PATCH] Move stripping of bitcasts in inline asm arguments to a place where it affects everything. Occurs only on calls AFAIK. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76502 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp | 5 +++++ lib/CodeGen/SelectionDAG/TargetLowering.cpp | 14 ++------------ 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp index 05622f2d6c7..3fa6047ad54 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuild.cpp @@ -5059,6 +5059,11 @@ void SelectionDAGLowering::visitInlineAsm(CallSite CS) { // 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(OpInfo.CallOperandVal)) && + CE->getOpcode()==Instruction::BitCast) + OpInfo.CallOperandVal = CE->getOperand(0); if (BasicBlock *BB = dyn_cast(OpInfo.CallOperandVal)) { OpInfo.CallOperand = DAG.getBasicBlock(FuncInfo.MBBMap[BB]); } else { diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp index dc25041da60..1ee181fb69d 100644 --- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -2406,20 +2406,10 @@ void TargetLowering::ComputeConstraintToUse(AsmOperandInfo &OpInfo, // '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(v)) && - CE->getOpcode()==Instruction::BitCast) - v = CE->getOperand(0); - if (!isa(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(v) || isa(v) || isa(v)) { OpInfo.CallOperandVal = v; return; -- 2.34.1