[llvm-commits] [llvm] r167040 - in /llvm/trunk: include/llvm/CodeGen/MachineInstr.h include/llvm/InlineAsm.h lib/CodeGen/MachineVerifier.cpp lib/CodeGen/ScheduleDAGInstrs.cpp lib/CodeGen/SelectionDAG/InstrEmitter.cpp lib/CodeGen/SelectionDAG/Sele
Chad Rosier
mcrosier at apple.com
Tue Oct 30 13:02:51 PDT 2012
On Oct 30, 2012, at 12:30 PM, Eric Christopher <echristo at gmail.com> wrote:
> LGTM, thanks for doing this!
Thanks for you're help.
>
> One comment request:
>
> + if (OpInfo.ConstraintType == TargetLowering::C_Memory ||
> + OpInfo.ConstraintType == TargetLowering::C_Other) {
>
> Can we get a comment on this?
Committed revision 167046.
Chad
> -eric
>
> On Tue, Oct 30, 2012 at 12:11 PM, Chad Rosier <mcrosier at apple.com> wrote:
>> Author: mcrosier
>> Date: Tue Oct 30 14:11:54 2012
>> New Revision: 167040
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=167040&view=rev
>> Log:
>> [inline asm] Implement mayLoad and mayStore for inline assembly. In general,
>> the MachineInstr MayLoad/MayLoad flags are based on the tablegen implementation.
>> For inline assembly, however, we need to compute these based on the constraints.
>>
>> Revert r166929 as this is no longer needed, but leave the test case in place.
>> rdar://12033048 and PR13504
>>
>> Modified:
>> llvm/trunk/include/llvm/CodeGen/MachineInstr.h
>> llvm/trunk/include/llvm/InlineAsm.h
>> llvm/trunk/lib/CodeGen/MachineVerifier.cpp
>> llvm/trunk/lib/CodeGen/ScheduleDAGInstrs.cpp
>> llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
>> llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>>
>> Modified: llvm/trunk/include/llvm/CodeGen/MachineInstr.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/MachineInstr.h?rev=167040&r1=167039&r2=167040&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/CodeGen/MachineInstr.h (original)
>> +++ llvm/trunk/include/llvm/CodeGen/MachineInstr.h Tue Oct 30 14:11:54 2012
>> @@ -58,8 +58,10 @@
>> NoFlags = 0,
>> FrameSetup = 1 << 0, // Instruction is used as a part of
>> // function frame setup code.
>> - InsideBundle = 1 << 1 // Instruction is inside a bundle (not
>> + InsideBundle = 1 << 1, // Instruction is inside a bundle (not
>> // the first MI in a bundle)
>> + MayLoad = 1 << 2, // Instruction could possibly read memory.
>> + MayStore = 1 << 3 // Instruction could possibly modify memory.
>> };
>> private:
>> const MCInstrDesc *MCID; // Instruction descriptor.
>> @@ -445,7 +447,7 @@
>> /// Instructions with this flag set are not necessarily simple load
>> /// instructions, they may load a value and modify it, for example.
>> bool mayLoad(QueryType Type = AnyInBundle) const {
>> - return hasProperty(MCID::MayLoad, Type);
>> + return hasProperty(MCID::MayLoad, Type) || (Flags & MayLoad);
>> }
>>
>>
>> @@ -454,7 +456,7 @@
>> /// instructions, they may store a modified value based on their operands, or
>> /// may not actually modify anything, for example.
>> bool mayStore(QueryType Type = AnyInBundle) const {
>> - return hasProperty(MCID::MayStore, Type);
>> + return hasProperty(MCID::MayStore, Type) || (Flags & MayStore);
>> }
>>
>> //===--------------------------------------------------------------------===//
>>
>> Modified: llvm/trunk/include/llvm/InlineAsm.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InlineAsm.h?rev=167040&r1=167039&r2=167040&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/InlineAsm.h (original)
>> +++ llvm/trunk/include/llvm/InlineAsm.h Tue Oct 30 14:11:54 2012
>> @@ -214,6 +214,8 @@
>> Extra_HasSideEffects = 1,
>> Extra_IsAlignStack = 2,
>> Extra_AsmDialect = 4,
>> + Extra_MayLoad = 8,
>> + Extra_MayStore = 16,
>>
>> // Inline asm operands map to multiple SDNode / MachineInstr operands.
>> // The first operand is an immediate describing the asm operand, the low
>>
>> Modified: llvm/trunk/lib/CodeGen/MachineVerifier.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineVerifier.cpp?rev=167040&r1=167039&r2=167040&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/MachineVerifier.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/MachineVerifier.cpp Tue Oct 30 14:11:54 2012
>> @@ -707,8 +707,9 @@
>> report("Asm string must be an external symbol", MI);
>> if (!MI->getOperand(1).isImm())
>> report("Asm flags must be an immediate", MI);
>> - // Allowed flags are Extra_HasSideEffects = 1, and Extra_IsAlignStack = 2.
>> - if (!isUInt<2>(MI->getOperand(1).getImm()))
>> + // Allowed flags are Extra_HasSideEffects = 1, Extra_IsAlignStack = 2,
>> + // Extra_AsmDialect = 4, Extra_MayLoad = 8, and Extra_MayStore = 16.
>> + if (!isUInt<5>(MI->getOperand(1).getImm()))
>> report("Unknown asm flags", &MI->getOperand(1), 1);
>>
>> assert(InlineAsm::MIOp_FirstOperand == 2 && "Asm format changed");
>>
>> Modified: llvm/trunk/lib/CodeGen/ScheduleDAGInstrs.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/ScheduleDAGInstrs.cpp?rev=167040&r1=167039&r2=167040&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/ScheduleDAGInstrs.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/ScheduleDAGInstrs.cpp Tue Oct 30 14:11:54 2012
>> @@ -420,11 +420,6 @@
>> /// Return true if MI is an instruction we are unable to reason about
>> /// (like a call or something with unmodeled side effects).
>> static inline bool isGlobalMemoryObject(AliasAnalysis *AA, MachineInstr *MI) {
>> - if (MI->isInlineAsm()) {
>> - // Until we can tell if an inline assembly instruction accesses
>> - // memory, we must assume all such instructions do so.
>> - return true;
>> - }
>> if (MI->isCall() || MI->hasUnmodeledSideEffects() ||
>> (MI->hasOrderedMemoryRef() &&
>> (!MI->mayLoad() || !MI->isInvariantLoad(AA))))
>>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp?rev=167040&r1=167039&r2=167040&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp Tue Oct 30 14:11:54 2012
>> @@ -903,6 +903,13 @@
>> getZExtValue();
>> MI->addOperand(MachineOperand::CreateImm(ExtraInfo));
>>
>> + // Set the MayLoad and MayStore flags.
>> + if (ExtraInfo & InlineAsm::Extra_MayLoad)
>> + MI->setFlag(MachineInstr::MayLoad);
>> +
>> + if (ExtraInfo & InlineAsm::Extra_MayStore)
>> + MI->setFlag(MachineInstr::MayStore);
>> +
>> // Remember to operand index of the group flags.
>> SmallVector<unsigned, 8> GroupIdx;
>>
>>
>> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=167040&r1=167039&r2=167040&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Tue Oct 30 14:11:54 2012
>> @@ -6128,7 +6128,8 @@
>> const MDNode *SrcLoc = CS.getInstruction()->getMetadata("srcloc");
>> AsmNodeOperands.push_back(DAG.getMDNode(SrcLoc));
>>
>> - // Remember the HasSideEffect, AlignStack and AsmDialect bits as operand 3.
>> + // Remember the HasSideEffect, AlignStack, AsmDialect, MayLoad and MayStore
>> + // bits as operand 3.
>> unsigned ExtraInfo = 0;
>> if (IA->hasSideEffects())
>> ExtraInfo |= InlineAsm::Extra_HasSideEffects;
>> @@ -6136,6 +6137,23 @@
>> ExtraInfo |= InlineAsm::Extra_IsAlignStack;
>> // Set the asm dialect.
>> ExtraInfo |= IA->getDialect() * InlineAsm::Extra_AsmDialect;
>> +
>> + // Determine if this InlineAsm MayLoad or MayStore based on the constraints.
>> + for (unsigned i = 0, e = TargetConstraints.size(); i != e; ++i) {
>> + TargetLowering::AsmOperandInfo &OpInfo = TargetConstraints[i];
>> +
>> + // Compute the constraint code and ConstraintType to use.
>> + TLI.ComputeConstraintToUse(OpInfo, SDValue());
>> +
>> + if (OpInfo.ConstraintType == TargetLowering::C_Memory ||
>> + OpInfo.ConstraintType == TargetLowering::C_Other) {
>> + if (OpInfo.Type == InlineAsm::isInput)
>> + ExtraInfo |= InlineAsm::Extra_MayLoad;
>> + else if (OpInfo.Type == InlineAsm::isOutput)
>> + ExtraInfo |= InlineAsm::Extra_MayStore;
>> + }
>> + }
>> +
>> AsmNodeOperands.push_back(DAG.getTargetConstant(ExtraInfo,
>> TLI.getPointerTy()));
>>
>>
>>
>> _______________________________________________
>> 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