[llvm-commits] [llvm] r130205 - in /llvm/trunk: lib/CodeGen/SelectionDAG/FastISel.cpp test/CodeGen/X86/fast-isel.ll
Nick Lewycky
nlewycky at google.com
Fri Sep 30 19:19:36 PDT 2011
On 26 April 2011 10:18, Dan Gohman <gohman at apple.com> wrote:
> Author: djg
> Date: Tue Apr 26 12:18:34 2011
> New Revision: 130205
>
> URL: http://llvm.org/viewvc/llvm-project?rev=130205&view=rev
> Log:
> Fast-isel support for simple inline asms.
>
> Modified:
> llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
> llvm/trunk/test/CodeGen/X86/fast-isel.ll
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp?rev=130205&r1=130204&r2=130205&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp Tue Apr 26 12:18:34
> 2011
> @@ -482,14 +482,35 @@
> }
>
> bool FastISel::SelectCall(const User *I) {
> - const Function *F = cast<CallInst>(I)->getCalledFunction();
> + const CallInst *Call = cast<CallInst>(I);
> +
> + // Handle simple inline asms.
> + if (const InlineAsm *IA = dyn_cast<InlineAsm>(Call->getArgOperand(0))) {
>
Are you sure this is what you mean? This is checking that the first argument
to a call is the result of an inline asm run earlier. Did you mean "if
(const InlineAsm *IA = dyn_cast<InlineAsm>(Call->getCalledValue())) {" ?
If so, make sure to hoist the "const Function *F =
Call->getCalledFunction();" stuff below above this and reuse it.
Nick
> + // Don't attempt to handle constraints.
> + if (!IA->getConstraintString().empty())
> + return false;
> +
> + unsigned ExtraInfo = 0;
> + if (IA->hasSideEffects())
> + ExtraInfo |= InlineAsm::Extra_HasSideEffects;
> + if (IA->isAlignStack())
> + ExtraInfo |= InlineAsm::Extra_IsAlignStack;
> +
> + BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
> + TII.get(TargetOpcode::INLINEASM))
> + .addExternalSymbol(IA->getAsmString().c_str())
> + .addImm(ExtraInfo);
> + return true;
> + }
> +
> + const Function *F = Call->getCalledFunction();
> if (!F) return false;
>
> // Handle selected intrinsic function calls.
> switch (F->getIntrinsicID()) {
> default: break;
> case Intrinsic::dbg_declare: {
> - const DbgDeclareInst *DI = cast<DbgDeclareInst>(I);
> + const DbgDeclareInst *DI = cast<DbgDeclareInst>(Call);
> if (!DIVariable(DI->getVariable()).Verify() ||
> !FuncInfo.MF->getMMI().hasDebugInfo())
> return true;
> @@ -521,7 +542,7 @@
> }
> case Intrinsic::dbg_value: {
> // This form of DBG_VALUE is target-independent.
> - const DbgValueInst *DI = cast<DbgValueInst>(I);
> + const DbgValueInst *DI = cast<DbgValueInst>(Call);
> const TargetInstrDesc &II = TII.get(TargetOpcode::DBG_VALUE);
> const Value *V = DI->getValue();
> if (!V) {
> @@ -550,7 +571,7 @@
> return true;
> }
> case Intrinsic::eh_exception: {
> - EVT VT = TLI.getValueType(I->getType());
> + EVT VT = TLI.getValueType(Call->getType());
> if (TLI.getOperationAction(ISD::EXCEPTIONADDR,
> VT)!=TargetLowering::Expand)
> break;
>
> @@ -561,18 +582,18 @@
> unsigned ResultReg = createResultReg(RC);
> BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
> TII.get(TargetOpcode::COPY),
> ResultReg).addReg(Reg);
> - UpdateValueMap(I, ResultReg);
> + UpdateValueMap(Call, ResultReg);
> return true;
> }
> case Intrinsic::eh_selector: {
> - EVT VT = TLI.getValueType(I->getType());
> + EVT VT = TLI.getValueType(Call->getType());
> if (TLI.getOperationAction(ISD::EHSELECTION, VT) !=
> TargetLowering::Expand)
> break;
> if (FuncInfo.MBB->isLandingPad())
> - AddCatchInfo(*cast<CallInst>(I), &FuncInfo.MF->getMMI(),
> FuncInfo.MBB);
> + AddCatchInfo(*Call, &FuncInfo.MF->getMMI(), FuncInfo.MBB);
> else {
> #ifndef NDEBUG
> - FuncInfo.CatchInfoLost.insert(cast<CallInst>(I));
> + FuncInfo.CatchInfoLost.insert(Call);
> #endif
> // FIXME: Mark exception selector register as live in. Hack for
> PR1508.
> unsigned Reg = TLI.getExceptionSelectorRegister();
> @@ -586,7 +607,7 @@
> BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
> TII.get(TargetOpcode::COPY),
> ResultReg).addReg(Reg);
>
> - bool ResultRegIsKill = hasTrivialKill(I);
> + bool ResultRegIsKill = hasTrivialKill(Call);
>
> // Cast the register to the type of the selector.
> if (SrcVT.bitsGT(MVT::i32))
> @@ -599,7 +620,7 @@
> // Unhandled operand. Halt "fast" selection and bail.
> return false;
>
> - UpdateValueMap(I, ResultReg);
> + UpdateValueMap(Call, ResultReg);
>
> return true;
> }
>
> Modified: llvm/trunk/test/CodeGen/X86/fast-isel.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/fast-isel.ll?rev=130205&r1=130204&r2=130205&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/fast-isel.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/fast-isel.ll Tue Apr 26 12:18:34 2011
> @@ -20,6 +20,7 @@
> %t6 = add i32 %t5, 2
> %t7 = getelementptr i32* %y, i32 1
> %t8 = getelementptr i32* %t7, i32 %t6
> + call void asm sideeffect "hello world", ""()
> br label %exit
>
> exit:
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20110930/3a565b9d/attachment.html>
More information about the llvm-commits
mailing list