Skip to content

Commit

Permalink
[mir] Print/Parse both MOLoad and MOStore when they occur together.
Browse files Browse the repository at this point in the history
Summary:
They're not always mutually exclusive. read-modify-write atomics are both
at the same time. One example of this is the SWP instructions on AArch64.
Another example is GlobalISel's G_ATOMICRMW_* generic instructions which
will be added in a later patch.

Reviewers: arphaman, aemerson

Reviewed By: aemerson

Subscribers: aemerson, javed.absar, kristof.beyls, llvm-commits

Differential Revision: https://reviews.llvm.org/D40157

llvm-svn: 319202
  • Loading branch information
dsandersllvm committed Nov 28, 2017
1 parent 50e6e54 commit 17d277b
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 6 deletions.
12 changes: 11 additions & 1 deletion llvm/lib/CodeGen/MIRParser/MIParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2280,6 +2280,12 @@ bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {
Flags |= MachineMemOperand::MOStore;
lex();

// Optional 'store' for operands that both load and store.
if (Token.is(MIToken::Identifier) && Token.stringValue() == "store") {
Flags |= MachineMemOperand::MOStore;
lex();
}

// Optional synchronization scope.
SyncScope::ID SSID;
if (parseOptionalScope(MF.getFunction()->getContext(), SSID))
Expand All @@ -2302,7 +2308,11 @@ bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {

MachinePointerInfo Ptr = MachinePointerInfo();
if (Token.is(MIToken::Identifier)) {
const char *Word = Flags & MachineMemOperand::MOLoad ? "from" : "into";
const char *Word =
((Flags & MachineMemOperand::MOLoad) &&
(Flags & MachineMemOperand::MOStore))
? "on"
: Flags & MachineMemOperand::MOLoad ? "from" : "into";
if (Token.stringValue() != Word)
return error(Twine("expected '") + Word + "'");
lex();
Expand Down
12 changes: 7 additions & 5 deletions llvm/lib/CodeGen/MIRPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1110,12 +1110,12 @@ void MIPrinter::print(const LLVMContext &Context, const TargetInstrInfo &TII,
if (Op.getFlags() & MachineMemOperand::MOTargetFlag3)
OS << '"' << getTargetMMOFlagName(TII, MachineMemOperand::MOTargetFlag3)
<< "\" ";

assert((Op.isLoad() || Op.isStore()) && "machine memory operand must be a load or store (or both)");
if (Op.isLoad())
OS << "load ";
else {
assert(Op.isStore() && "Non load machine operand must be a store");
if (Op.isStore())
OS << "store ";
}

printSyncScope(Context, Op.getSyncScopeID());

Expand All @@ -1126,10 +1126,12 @@ void MIPrinter::print(const LLVMContext &Context, const TargetInstrInfo &TII,

OS << Op.getSize();
if (const Value *Val = Op.getValue()) {
OS << (Op.isLoad() ? " from " : " into ");
OS << ((Op.isLoad() && Op.isStore()) ? " on "
: Op.isLoad() ? " from " : " into ");
printIRValueReference(*Val);
} else if (const PseudoSourceValue *PVal = Op.getPseudoValue()) {
OS << (Op.isLoad() ? " from " : " into ");
OS << ((Op.isLoad() && Op.isStore()) ? " on "
: Op.isLoad() ? " from " : " into ");
assert(PVal && "Expected a pseudo source value");
switch (PVal->kind()) {
case PseudoSourceValue::Stack:
Expand Down
33 changes: 33 additions & 0 deletions llvm/test/CodeGen/MIR/AArch64/swp.mir
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# RUN: llc -mtriple=aarch64-none-linux-gnu -run-pass none -o - %s | FileCheck %s

--- |
define i32 @swp(i32* %addr) #0 {
entry:
%0 = atomicrmw xchg i32* %addr, i32 1 monotonic
ret i32 %0
}

attributes #0 = { "target-features"="+lse" }
...
---
name: swp
alignment: 2
tracksRegLiveness: true
registers:
- { id: 0, class: gpr64common }
- { id: 1, class: gpr32 }
- { id: 2, class: gpr32 }
liveins:
- { reg: '%x0', virtual-reg: '%0' }
body: |
bb.0.entry:
liveins: %x0
; CHECK-LABEL: swp
; CHECK: {{[0-9]+}}:gpr32 = SWPW killed %1, %0 :: (volatile load store monotonic 4 on %ir.addr)
%0:gpr64common = COPY %x0
%1:gpr32 = MOVi32imm 1
%2:gpr32 = SWPW killed %1, %0 :: (volatile load store monotonic 4 on %ir.addr)
%w0 = COPY %2
RET_ReallyLR implicit %w0
...

0 comments on commit 17d277b

Please sign in to comment.