mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-20 10:24:12 +00:00
[AAarch64] Optimize CSINC-branch sequence
Peephole optimization that generates a single conditional branch for csinc-branch sequences like in the examples below. This is possible when the csinc sets or clears a register based on a condition code and the branch checks that register. Also the condition code may not be modified between the csinc and the original branch. Examples: 1. Convert csinc w9, wzr, wzr, <CC>;tbnz w9, #0, 0x44 to b.<invCC> 2. Convert csinc w9, wzr, wzr, <CC>; tbz w9, #0, 0x44 to b.<CC> rdar://problem/18506500 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219742 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -135,6 +135,7 @@ namespace {
|
||||
bool optimizeExtInstr(MachineInstr *MI, MachineBasicBlock *MBB,
|
||||
SmallPtrSetImpl<MachineInstr*> &LocalMIs);
|
||||
bool optimizeSelect(MachineInstr *MI);
|
||||
bool optimizeCondBranch(MachineInstr *MI);
|
||||
bool optimizeCopyOrBitcast(MachineInstr *MI);
|
||||
bool optimizeCoalescableCopy(MachineInstr *MI);
|
||||
bool optimizeUncoalescableCopy(MachineInstr *MI,
|
||||
@ -498,6 +499,12 @@ bool PeepholeOptimizer::optimizeSelect(MachineInstr *MI) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// \brief Check if a simpler conditional branch can be
|
||||
// generated
|
||||
bool PeepholeOptimizer::optimizeCondBranch(MachineInstr *MI) {
|
||||
return TII->optimizeCondBranch(MI);
|
||||
}
|
||||
|
||||
/// \brief Check if the registers defined by the pair (RegisterClass, SubReg)
|
||||
/// share the same register file.
|
||||
static bool shareSameRegisterFile(const TargetRegisterInfo &TRI,
|
||||
@ -1104,6 +1111,11 @@ bool PeepholeOptimizer::runOnMachineFunction(MachineFunction &mf) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (MI->isConditionalBranch() && optimizeCondBranch(MI)) {
|
||||
Changed = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isCoalescableCopy(*MI) && optimizeCoalescableCopy(MI)) {
|
||||
// MI is just rewritten.
|
||||
Changed = true;
|
||||
|
Reference in New Issue
Block a user