mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
Add a RequireStructuredCFG Field to TargetMachine.
llvm-svn: 196634
This commit is contained in:
parent
f1994b1e85
commit
8f22bc4540
@ -238,6 +238,12 @@ For some targets, you also need to support the following methods:
|
||||
* ``getTargetLowering()``
|
||||
* ``getJITInfo()``
|
||||
|
||||
Some architectures, such as GPUs, do not support jumping to an arbitrary
|
||||
program location and implement branching using masked execution and loop using
|
||||
special instructions around the loop body. In order to avoid CFG modifications
|
||||
that introduce irreducible control flow not handled by such hardware, a target
|
||||
must call `setRequiresStructuredCFG(true)` when being initialized.
|
||||
|
||||
In addition, the ``XXXTargetMachine`` constructor should specify a
|
||||
``TargetDescription`` string that determines the data layout for the target
|
||||
machine, including characteristics such as pointer size, alignment, and
|
||||
|
@ -88,6 +88,7 @@ protected: // Can only create subclasses.
|
||||
unsigned MCUseLoc : 1;
|
||||
unsigned MCUseCFI : 1;
|
||||
unsigned MCUseDwarfDirectory : 1;
|
||||
unsigned RequireStructuredCFG : 1;
|
||||
|
||||
public:
|
||||
virtual ~TargetMachine();
|
||||
@ -156,6 +157,9 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool requiresStructuredCFG() const { return RequireStructuredCFG; }
|
||||
void setRequiresStructuredCFG(bool Value) { RequireStructuredCFG = Value; }
|
||||
|
||||
/// hasMCRelaxAll - Check whether all machine code instructions should be
|
||||
/// relaxed.
|
||||
bool hasMCRelaxAll() const { return MCRelaxAll; }
|
||||
|
@ -83,7 +83,11 @@ INITIALIZE_PASS(BranchFolderPass, "branch-folder",
|
||||
|
||||
bool BranchFolderPass::runOnMachineFunction(MachineFunction &MF) {
|
||||
TargetPassConfig *PassConfig = &getAnalysis<TargetPassConfig>();
|
||||
BranchFolder Folder(PassConfig->getEnableTailMerge(), /*CommonHoist=*/true);
|
||||
// TailMerge can create jump into if branches that make CFG irreducible for
|
||||
// HW that requires structurized CFG.
|
||||
bool EnableTailMerge = !MF.getTarget().requiresStructuredCFG() &&
|
||||
PassConfig->getEnableTailMerge();
|
||||
BranchFolder Folder(EnableTailMerge, /*CommonHoist=*/true);
|
||||
return Folder.OptimizeFunction(MF,
|
||||
MF.getTarget().getInstrInfo(),
|
||||
MF.getTarget().getRegisterInfo(),
|
||||
|
@ -677,6 +677,11 @@ MachineBasicBlock::SplitCriticalEdge(MachineBasicBlock *Succ, Pass *P) {
|
||||
MachineFunction *MF = getParent();
|
||||
DebugLoc dl; // FIXME: this is nowhere
|
||||
|
||||
// Performance might be harmed on HW that implements branching using exec mask
|
||||
// where both sides of the branches are always executed.
|
||||
if (MF->getTarget().requiresStructuredCFG())
|
||||
return NULL;
|
||||
|
||||
// We may need to update this's terminator, but we can't do that if
|
||||
// AnalyzeBranch fails. If this uses a jump table, we won't touch it.
|
||||
const TargetInstrInfo *TII = MF->getTarget().getInstrInfo();
|
||||
|
@ -725,7 +725,10 @@ void TargetPassConfig::addMachineLateOptimization() {
|
||||
printAndVerify("After BranchFolding");
|
||||
|
||||
// Tail duplication.
|
||||
if (addPass(&TailDuplicateID))
|
||||
// Note that duplicating tail just increases code size and degrades
|
||||
// performance for targets that require Structured Control Flow.
|
||||
// In addition it can also make CFG irreducible. Thus we disable it.
|
||||
if (!TM->requiresStructuredCFG() && addPass(&TailDuplicateID))
|
||||
printAndVerify("After TailDuplicate");
|
||||
|
||||
// Copy propagation.
|
||||
|
@ -72,6 +72,7 @@ AMDGPUTargetMachine::AMDGPUTargetMachine(const Target &T, StringRef TT,
|
||||
InstrInfo.reset(new SIInstrInfo(*this));
|
||||
TLInfo.reset(new SITargetLowering(*this));
|
||||
}
|
||||
setRequiresStructuredCFG(true);
|
||||
initAsmInfo();
|
||||
}
|
||||
|
||||
|
@ -55,6 +55,7 @@ TargetMachine::TargetMachine(const Target &T,
|
||||
MCUseLoc(true),
|
||||
MCUseCFI(true),
|
||||
MCUseDwarfDirectory(false),
|
||||
RequireStructuredCFG(false),
|
||||
Options(Options) {
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
;RUN: llc < %s -march=r600 -mcpu=redwood | FileCheck %s
|
||||
|
||||
; CHECK: JUMP @3
|
||||
; CHECK: JUMP @6
|
||||
; CHECK: EXPORT
|
||||
; CHECK-NOT: EXPORT
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user