Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions llvm/lib/CodeGen/ShrinkWrap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -618,8 +618,6 @@ bool ShrinkWrapImpl::postShrinkWrapping(bool HasCandidate, MachineFunction &MF,

DenseSet<const MachineBasicBlock *> DirtyBBs;
for (MachineBasicBlock &MBB : MF) {
if (!MDT->isReachableFromEntry(&MBB))
continue;
if (MBB.isEHPad()) {
DirtyBBs.insert(&MBB);
continue;
Expand Down
47 changes: 0 additions & 47 deletions llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -708,53 +708,6 @@ unsigned AArch64InstrInfo::insertBranch(
return 2;
}

bool llvm::optimizeTerminators(MachineBasicBlock *MBB,
const TargetInstrInfo &TII) {
for (MachineInstr &MI : MBB->terminators()) {
unsigned Opc = MI.getOpcode();
switch (Opc) {
case AArch64::CBZW:
case AArch64::CBZX:
case AArch64::TBZW:
case AArch64::TBZX:
// CBZ/TBZ with WZR/XZR -> unconditional B
if (MI.getOperand(0).getReg() == AArch64::WZR ||
MI.getOperand(0).getReg() == AArch64::XZR) {
DEBUG_WITH_TYPE("optimizeTerminators",
dbgs() << "Removing always taken branch: " << MI);
MachineBasicBlock *Target = TII.getBranchDestBlock(MI);
SmallVector<MachineBasicBlock *> Succs(MBB->successors());
for (auto *S : Succs)
if (S != Target)
MBB->removeSuccessor(S);
DebugLoc DL = MI.getDebugLoc();
while (MBB->rbegin() != &MI)
MBB->rbegin()->eraseFromParent();
MI.eraseFromParent();
BuildMI(MBB, DL, TII.get(AArch64::B)).addMBB(Target);
return true;
}
break;
case AArch64::CBNZW:
case AArch64::CBNZX:
case AArch64::TBNZW:
case AArch64::TBNZX:
// CBNZ/TBNZ with WZR/XZR -> never taken, remove branch and successor
if (MI.getOperand(0).getReg() == AArch64::WZR ||
MI.getOperand(0).getReg() == AArch64::XZR) {
DEBUG_WITH_TYPE("optimizeTerminators",
dbgs() << "Removing never taken branch: " << MI);
MachineBasicBlock *Target = TII.getBranchDestBlock(MI);
MI.getParent()->removeSuccessor(Target);
MI.eraseFromParent();
return true;
}
break;
}
}
return false;
}

// Find the original register that VReg is copied from.
static unsigned removeCopies(const MachineRegisterInfo &MRI, unsigned VReg) {
while (Register::isVirtualRegister(VReg)) {
Expand Down
2 changes: 0 additions & 2 deletions llvm/lib/Target/AArch64/AArch64InstrInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -705,8 +705,6 @@ int isAArch64FrameOffsetLegal(const MachineInstr &MI, StackOffset &Offset,
unsigned *OutUnscaledOp = nullptr,
int64_t *EmittableOffset = nullptr);

bool optimizeTerminators(MachineBasicBlock *MBB, const TargetInstrInfo &TII);

static inline bool isUncondBranchOpcode(int Opc) { return Opc == AArch64::B; }

static inline bool isCondBranchOpcode(int Opc) {
Expand Down
46 changes: 45 additions & 1 deletion llvm/lib/Target/AArch64/AArch64RedundantCondBranchPass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
//===----------------------------------------------------------------------===//

#include "AArch64.h"
#include "AArch64InstrInfo.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
Expand Down Expand Up @@ -46,6 +45,51 @@ INITIALIZE_PASS(AArch64RedundantCondBranch, "aarch64-redundantcondbranch",
"AArch64 Redundant Conditional Branch Elimination pass", false,
false)

static bool optimizeTerminators(MachineBasicBlock *MBB,
const TargetInstrInfo &TII) {
for (MachineInstr &MI : make_early_inc_range(MBB->terminators())) {
unsigned Opc = MI.getOpcode();
switch (Opc) {
case AArch64::CBZW:
case AArch64::CBZX:
case AArch64::TBZW:
case AArch64::TBZX:
// CBZ/TBZ with WZR/XZR -> unconditional B
if (MI.getOperand(0).getReg() == AArch64::WZR ||
MI.getOperand(0).getReg() == AArch64::XZR) {
LLVM_DEBUG(dbgs() << "Removing redundant branch: " << MI);
MachineBasicBlock *Target = TII.getBranchDestBlock(MI);
SmallVector<MachineBasicBlock *> Succs(MBB->successors());
for (auto *S : Succs)
if (S != Target)
MBB->removeSuccessor(S);
DebugLoc DL = MI.getDebugLoc();
while (MBB->rbegin() != &MI)
MBB->rbegin()->eraseFromParent();
MI.eraseFromParent();
BuildMI(MBB, DL, TII.get(AArch64::B)).addMBB(Target);
return true;
}
break;
case AArch64::CBNZW:
case AArch64::CBNZX:
case AArch64::TBNZW:
case AArch64::TBNZX:
// CBNZ/TBNZ with WZR/XZR -> never taken, remove branch and successor
if (MI.getOperand(0).getReg() == AArch64::WZR ||
MI.getOperand(0).getReg() == AArch64::XZR) {
LLVM_DEBUG(dbgs() << "Removing redundant branch: " << MI);
MachineBasicBlock *Target = TII.getBranchDestBlock(MI);
MI.getParent()->removeSuccessor(Target);
MI.eraseFromParent();
return true;
}
break;
}
}
return false;
}

bool AArch64RedundantCondBranch::runOnMachineFunction(MachineFunction &MF) {
if (skipFunction(MF.getFunction()))
return false;
Expand Down
6 changes: 1 addition & 5 deletions llvm/lib/Target/AArch64/AArch64RedundantCopyElimination.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@
// to use WZR/XZR directly in some cases.
//===----------------------------------------------------------------------===//
#include "AArch64.h"
#include "AArch64InstrInfo.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/iterator_range.h"
Expand Down Expand Up @@ -476,7 +475,6 @@ bool AArch64RedundantCopyElimination::runOnMachineFunction(
return false;
TRI = MF.getSubtarget().getRegisterInfo();
MRI = &MF.getRegInfo();
const TargetInstrInfo &TII = *MF.getSubtarget().getInstrInfo();

// Resize the clobbered and used register unit trackers. We do this once per
// function.
Expand All @@ -486,10 +484,8 @@ bool AArch64RedundantCopyElimination::runOnMachineFunction(
OptBBUsedRegs.init(*TRI);

bool Changed = false;
for (MachineBasicBlock &MBB : MF) {
Changed |= optimizeTerminators(&MBB, TII);
for (MachineBasicBlock &MBB : MF)
Changed |= optimizeBlock(&MBB);
}
return Changed;
}

Expand Down
74 changes: 52 additions & 22 deletions llvm/test/CodeGen/AArch64/arm64-shrink-wrapping.ll
Original file line number Diff line number Diff line change
Expand Up @@ -735,15 +735,21 @@ define void @infiniteloop() {
; ENABLE-NEXT: .cfi_offset w29, -16
; ENABLE-NEXT: .cfi_offset w19, -24
; ENABLE-NEXT: .cfi_offset w20, -32
; ENABLE-NEXT: ; %bb.1: ; %if.then
; ENABLE-NEXT: sub x19, sp, #16
; ENABLE-NEXT: mov sp, x19
; ENABLE-NEXT: mov w20, wzr
; ENABLE-NEXT: LBB10_1: ; %for.body
; ENABLE-NEXT: LBB10_2: ; %for.body
; ENABLE-NEXT: ; =>This Inner Loop Header: Depth=1
; ENABLE-NEXT: bl _something
; ENABLE-NEXT: add w20, w0, w20
; ENABLE-NEXT: str w20, [x19]
; ENABLE-NEXT: b LBB10_1
; ENABLE-NEXT: b LBB10_2
; ENABLE-NEXT: ; %bb.3: ; %if.end
; ENABLE-NEXT: sub sp, x29, #16
; ENABLE-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
; ENABLE-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
; ENABLE-NEXT: ret
;
; DISABLE-LABEL: infiniteloop:
; DISABLE: ; %bb.0: ; %entry
Expand All @@ -755,15 +761,21 @@ define void @infiniteloop() {
; DISABLE-NEXT: .cfi_offset w29, -16
; DISABLE-NEXT: .cfi_offset w19, -24
; DISABLE-NEXT: .cfi_offset w20, -32
; DISABLE-NEXT: ; %bb.1: ; %if.then
; DISABLE-NEXT: sub x19, sp, #16
; DISABLE-NEXT: mov sp, x19
; DISABLE-NEXT: mov w20, wzr
; DISABLE-NEXT: LBB10_1: ; %for.body
; DISABLE-NEXT: LBB10_2: ; %for.body
; DISABLE-NEXT: ; =>This Inner Loop Header: Depth=1
; DISABLE-NEXT: bl _something
; DISABLE-NEXT: add w20, w0, w20
; DISABLE-NEXT: str w20, [x19]
; DISABLE-NEXT: b LBB10_1
; DISABLE-NEXT: b LBB10_2
; DISABLE-NEXT: ; %bb.3: ; %if.end
; DISABLE-NEXT: sub sp, x29, #16
; DISABLE-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
; DISABLE-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
; DISABLE-NEXT: ret
entry:
br i1 undef, label %if.then, label %if.end

Expand Down Expand Up @@ -794,10 +806,11 @@ define void @infiniteloop2() {
; ENABLE-NEXT: .cfi_offset w29, -16
; ENABLE-NEXT: .cfi_offset w19, -24
; ENABLE-NEXT: .cfi_offset w20, -32
; ENABLE-NEXT: ; %bb.1: ; %if.then
; ENABLE-NEXT: sub x8, sp, #16
; ENABLE-NEXT: mov sp, x8
; ENABLE-NEXT: mov w9, wzr
; ENABLE-NEXT: LBB11_1: ; %for.body
; ENABLE-NEXT: LBB11_2: ; %for.body
; ENABLE-NEXT: ; =>This Inner Loop Header: Depth=1
; ENABLE-NEXT: ; InlineAsm Start
; ENABLE-NEXT: mov x10, #0 ; =0x0
Expand All @@ -808,7 +821,12 @@ define void @infiniteloop2() {
; ENABLE-NEXT: ; InlineAsm Start
; ENABLE-NEXT: nop
; ENABLE-NEXT: ; InlineAsm End
; ENABLE-NEXT: b LBB11_1
; ENABLE-NEXT: b LBB11_2
; ENABLE-NEXT: ; %bb.3: ; %if.end
; ENABLE-NEXT: sub sp, x29, #16
; ENABLE-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
; ENABLE-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
; ENABLE-NEXT: ret
;
; DISABLE-LABEL: infiniteloop2:
; DISABLE: ; %bb.0: ; %entry
Expand All @@ -820,10 +838,11 @@ define void @infiniteloop2() {
; DISABLE-NEXT: .cfi_offset w29, -16
; DISABLE-NEXT: .cfi_offset w19, -24
; DISABLE-NEXT: .cfi_offset w20, -32
; DISABLE-NEXT: ; %bb.1: ; %if.then
; DISABLE-NEXT: sub x8, sp, #16
; DISABLE-NEXT: mov sp, x8
; DISABLE-NEXT: mov w9, wzr
; DISABLE-NEXT: LBB11_1: ; %for.body
; DISABLE-NEXT: LBB11_2: ; %for.body
; DISABLE-NEXT: ; =>This Inner Loop Header: Depth=1
; DISABLE-NEXT: ; InlineAsm Start
; DISABLE-NEXT: mov x10, #0 ; =0x0
Expand All @@ -834,7 +853,12 @@ define void @infiniteloop2() {
; DISABLE-NEXT: ; InlineAsm Start
; DISABLE-NEXT: nop
; DISABLE-NEXT: ; InlineAsm End
; DISABLE-NEXT: b LBB11_1
; DISABLE-NEXT: b LBB11_2
; DISABLE-NEXT: ; %bb.3: ; %if.end
; DISABLE-NEXT: sub sp, x29, #16
; DISABLE-NEXT: ldp x29, x30, [sp, #16] ; 16-byte Folded Reload
; DISABLE-NEXT: ldp x20, x19, [sp], #32 ; 16-byte Folded Reload
; DISABLE-NEXT: ret
entry:
br i1 undef, label %if.then, label %if.end

Expand Down Expand Up @@ -865,43 +889,49 @@ if.end:
define void @infiniteloop3() {
; ENABLE-LABEL: infiniteloop3:
; ENABLE: ; %bb.0: ; %entry
; ENABLE-NEXT: ; %bb.1: ; %loop2a.preheader
; ENABLE-NEXT: mov x8, xzr
; ENABLE-NEXT: mov x9, xzr
; ENABLE-NEXT: mov x11, xzr
; ENABLE-NEXT: b LBB12_2
; ENABLE-NEXT: LBB12_1: ; %loop2b
; ENABLE-NEXT: ; in Loop: Header=BB12_2 Depth=1
; ENABLE-NEXT: b LBB12_3
; ENABLE-NEXT: LBB12_2: ; %loop2b
; ENABLE-NEXT: ; in Loop: Header=BB12_3 Depth=1
; ENABLE-NEXT: str x10, [x11]
; ENABLE-NEXT: mov x11, x10
; ENABLE-NEXT: LBB12_2: ; %loop1
; ENABLE-NEXT: LBB12_3: ; %loop1
; ENABLE-NEXT: ; =>This Inner Loop Header: Depth=1
; ENABLE-NEXT: mov x10, x9
; ENABLE-NEXT: ldr x9, [x8]
; ENABLE-NEXT: cbnz x8, LBB12_1
; ENABLE-NEXT: ; %bb.3: ; in Loop: Header=BB12_2 Depth=1
; ENABLE-NEXT: cbnz x8, LBB12_2
; ENABLE-NEXT: ; %bb.4: ; in Loop: Header=BB12_3 Depth=1
; ENABLE-NEXT: mov x8, x10
; ENABLE-NEXT: mov x11, x10
; ENABLE-NEXT: b LBB12_2
; ENABLE-NEXT: b LBB12_3
; ENABLE-NEXT: ; %bb.5: ; %end
; ENABLE-NEXT: ret
;
; DISABLE-LABEL: infiniteloop3:
; DISABLE: ; %bb.0: ; %entry
; DISABLE-NEXT: ; %bb.1: ; %loop2a.preheader
; DISABLE-NEXT: mov x8, xzr
; DISABLE-NEXT: mov x9, xzr
; DISABLE-NEXT: mov x11, xzr
; DISABLE-NEXT: b LBB12_2
; DISABLE-NEXT: LBB12_1: ; %loop2b
; DISABLE-NEXT: ; in Loop: Header=BB12_2 Depth=1
; DISABLE-NEXT: b LBB12_3
; DISABLE-NEXT: LBB12_2: ; %loop2b
; DISABLE-NEXT: ; in Loop: Header=BB12_3 Depth=1
; DISABLE-NEXT: str x10, [x11]
; DISABLE-NEXT: mov x11, x10
; DISABLE-NEXT: LBB12_2: ; %loop1
; DISABLE-NEXT: LBB12_3: ; %loop1
; DISABLE-NEXT: ; =>This Inner Loop Header: Depth=1
; DISABLE-NEXT: mov x10, x9
; DISABLE-NEXT: ldr x9, [x8]
; DISABLE-NEXT: cbnz x8, LBB12_1
; DISABLE-NEXT: ; %bb.3: ; in Loop: Header=BB12_2 Depth=1
; DISABLE-NEXT: cbnz x8, LBB12_2
; DISABLE-NEXT: ; %bb.4: ; in Loop: Header=BB12_3 Depth=1
; DISABLE-NEXT: mov x8, x10
; DISABLE-NEXT: mov x11, x10
; DISABLE-NEXT: b LBB12_2
; DISABLE-NEXT: b LBB12_3
; DISABLE-NEXT: ; %bb.5: ; %end
; DISABLE-NEXT: ret
entry:
br i1 undef, label %loop2a, label %body

Expand Down
32 changes: 22 additions & 10 deletions llvm/test/CodeGen/AArch64/block-placement-optimize-branches.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,20 @@
define i8 @foo_optsize(i32 %v4) optsize {
; CHECK-LABEL: foo_optsize:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cbnz w0, .LBB0_2
; CHECK-NEXT: // %bb.1: // %b2
; CHECK-NEXT: mov w0, #1 // =0x1
; CHECK-NEXT: b .LBB0_2
; CHECK-NEXT: .LBB0_1:
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB0_2: // %b1
; CHECK-NEXT: cmp w0, #1
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: cbnz w0, .LBB0_4
; CHECK-NEXT: // %bb.3: // %b2
; CHECK-NEXT: mov w0, #1 // =0x1
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB0_4: // %b1
; CHECK-NEXT: cmp w0, #1
; CHECK-NEXT: b.ne .LBB0_1
; CHECK-NEXT: // %bb.5: // %b3
; CHECK-NEXT: b .LBB0_1
entry:
%v2 = icmp eq i32 0, 0
br i1 %v2, label %b1, label %b4
Expand All @@ -41,14 +47,20 @@ b4:
define i8 @foo_optspeed(i32 %v4) {
; CHECK-LABEL: foo_optspeed:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: cbnz w0, .LBB1_2
; CHECK-NEXT: // %bb.1: // %b2
; CHECK-NEXT: mov w0, #1 // =0x1
; CHECK-NEXT: b .LBB1_2
; CHECK-NEXT: .LBB1_1:
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB1_2: // %b1
; CHECK-NEXT: cmp w0, #1
; CHECK-NEXT: mov w0, wzr
; CHECK-NEXT: cbnz w0, .LBB1_4
; CHECK-NEXT: // %bb.3: // %b2
; CHECK-NEXT: mov w0, #1 // =0x1
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB1_4: // %b1
; CHECK-NEXT: cmp w0, #1
; CHECK-NEXT: b.ne .LBB1_1
; CHECK-NEXT: // %bb.5: // %b3
; CHECK-NEXT: b .LBB1_1
entry:
%v2 = icmp eq i32 0, 0
br i1 %v2, label %b1, label %b4
Expand Down
2 changes: 2 additions & 0 deletions llvm/test/CodeGen/AArch64/lr-reserved-for-ra-live-in.ll
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,10 @@ define i32 @check_lr_liveness(ptr %arg) #1 {
; CHECK-NEXT: B %bb.3
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.1.bb:
; CHECK-NEXT: successors: %bb.3(0x2aaaaaab), %bb.2(0x55555555)
; CHECK-NEXT: liveins: $w0, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: CBNZW $wzr, %bb.3
; CHECK-NEXT: B %bb.2
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.2.bb1:
Expand Down
Loading
Loading