mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-31 08:54:31 +00:00
AArch64: lower "fence singlethread" to a pure compiler barrier.
Single-threaded fences aren't required to provide any synchronization with other processing elements so there's no need for a DMB. They should still be a barrier for compiler optimizations though. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300905 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ff268972fc
commit
efa8c0e73a
@ -942,6 +942,7 @@ bool AArch64ExpandPseudo::expandMI(MachineBasicBlock &MBB,
|
||||
AArch64::XZR, NextMBBI);
|
||||
case AArch64::CMP_SWAP_128:
|
||||
return expandCMP_SWAP_128(MBB, MBBI, NextMBBI);
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -14,6 +14,9 @@
|
||||
//===----------------------------------
|
||||
// Atomic fences
|
||||
//===----------------------------------
|
||||
let AddedComplexity = 15, Size = 0 in
|
||||
def CompilerBarrier : Pseudo<(outs), (ins i32imm:$ordering),
|
||||
[(atomic_fence imm:$ordering, 0)]>, Sched<[]>;
|
||||
def : Pat<(atomic_fence (i64 4), (imm)), (DMB (i32 0x9))>;
|
||||
def : Pat<(atomic_fence (imm), (imm)), (DMB (i32 0xb))>;
|
||||
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
@ -275,6 +276,12 @@ void AArch64InstPrinter::printInst(const MCInst *MI, raw_ostream &O,
|
||||
}
|
||||
}
|
||||
|
||||
if (Opcode == AArch64::CompilerBarrier) {
|
||||
O << '\t' << MAI.getCommentString() << " COMPILER BARRIER";
|
||||
printAnnotation(O, Annot);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!printAliasInstr(MI, STI, O))
|
||||
printInstruction(MI, STI, O);
|
||||
|
||||
|
@ -565,6 +565,9 @@ void AArch64MCCodeEmitter::encodeInstruction(const MCInst &MI, raw_ostream &OS,
|
||||
MCFixupKind Fixup = MCFixupKind(AArch64::fixup_aarch64_tlsdesc_call);
|
||||
Fixups.push_back(MCFixup::create(0, MI.getOperand(0).getExpr(), Fixup));
|
||||
return;
|
||||
} else if (MI.getOpcode() == AArch64::CompilerBarrier) {
|
||||
// This just prevents the compiler from reordering accesses, no actual code.
|
||||
return;
|
||||
}
|
||||
|
||||
uint64_t Binary = getBinaryCodeForInstr(MI, Fixups, STI);
|
||||
|
Loading…
Reference in New Issue
Block a user