forked from OSchip/llvm-project
[AArch64CondBrTuning] Ignore debug insts when scanning for NZCV clobbers [10/14]
Summary: This fixes several instances in which condbr optimization was missed due to a debug instruction appearing as a bogus NZCV clobber. Reviewers: aemerson, paquette Subscribers: kristof.beyls, hiraditya, jfb, danielkiss, aprantl, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D78264
This commit is contained in:
parent
4a51b61cb3
commit
78d69e97cc
|
@ -194,12 +194,8 @@ bool AArch64CondBrTuning::tryToTuneBranch(MachineInstr &MI,
|
|||
|
||||
// There must not be any instruction between DefMI and MI that clobbers or
|
||||
// reads NZCV.
|
||||
MachineBasicBlock::iterator I(DefMI), E(MI);
|
||||
for (I = std::next(I); I != E; ++I) {
|
||||
if (I->modifiesRegister(AArch64::NZCV, TRI) ||
|
||||
I->readsRegister(AArch64::NZCV, TRI))
|
||||
return false;
|
||||
}
|
||||
if (isNZCVTouchedInInstructionRange(DefMI, MI, TRI))
|
||||
return false;
|
||||
LLVM_DEBUG(dbgs() << " Replacing instructions:\n ");
|
||||
LLVM_DEBUG(DefMI.print(dbgs()));
|
||||
LLVM_DEBUG(dbgs() << " ");
|
||||
|
@ -253,12 +249,8 @@ bool AArch64CondBrTuning::tryToTuneBranch(MachineInstr &MI,
|
|||
return false;
|
||||
// There must not be any instruction between DefMI and MI that clobbers or
|
||||
// reads NZCV.
|
||||
MachineBasicBlock::iterator I(DefMI), E(MI);
|
||||
for (I = std::next(I); I != E; ++I) {
|
||||
if (I->modifiesRegister(AArch64::NZCV, TRI) ||
|
||||
I->readsRegister(AArch64::NZCV, TRI))
|
||||
return false;
|
||||
}
|
||||
if (isNZCVTouchedInInstructionRange(DefMI, MI, TRI))
|
||||
return false;
|
||||
LLVM_DEBUG(dbgs() << " Replacing instructions:\n ");
|
||||
LLVM_DEBUG(DefMI.print(dbgs()));
|
||||
LLVM_DEBUG(dbgs() << " ");
|
||||
|
|
|
@ -3173,6 +3173,17 @@ void AArch64InstrInfo::loadRegFromStackSlot(
|
|||
MI.addMemOperand(MMO);
|
||||
}
|
||||
|
||||
bool llvm::isNZCVTouchedInInstructionRange(const MachineInstr &DefMI,
|
||||
const MachineInstr &UseMI,
|
||||
const TargetRegisterInfo *TRI) {
|
||||
return any_of(instructionsWithoutDebug(std::next(DefMI.getIterator()),
|
||||
UseMI.getIterator()),
|
||||
[TRI](const MachineInstr &I) {
|
||||
return I.modifiesRegister(AArch64::NZCV, TRI) ||
|
||||
I.readsRegister(AArch64::NZCV, TRI);
|
||||
});
|
||||
}
|
||||
|
||||
// Helper function to emit a frame offset adjustment from a given
|
||||
// pointer (SrcReg), stored into DestReg. This function is explicit
|
||||
// in that it requires the opcode.
|
||||
|
|
|
@ -316,6 +316,12 @@ private:
|
|||
unsigned findRegisterToSaveLRTo(const outliner::Candidate &C) const;
|
||||
};
|
||||
|
||||
/// Return true if there is an instruction /after/ \p DefMI and before \p UseMI
|
||||
/// which either reads or clobbers NZCV.
|
||||
bool isNZCVTouchedInInstructionRange(const MachineInstr &DefMI,
|
||||
const MachineInstr &UseMI,
|
||||
const TargetRegisterInfo *TRI);
|
||||
|
||||
/// emitFrameOffset - Emit instructions as needed to set DestReg to SrcReg
|
||||
/// plus Offset. This is intended to be used from within the prolog/epilog
|
||||
/// insertion (PEI) pass, where a virtual scratch register may be allocated
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: llc < %s -stress-early-ifcvt -aarch64-enable-atomic-cfg-tidy=0 | FileCheck %s
|
||||
; RUN: llc -debugify-and-strip-all-safe < %s -stress-early-ifcvt -aarch64-enable-atomic-cfg-tidy=0 | FileCheck %s
|
||||
target triple = "arm64-apple-macosx"
|
||||
|
||||
; CHECK: mm2
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||||
; RUN: llc %s -o - -mtriple=arm64-apple-ios -enable-shrink-wrap=true -disable-post-ra -frame-pointer=non-leaf | FileCheck %s --check-prefix=ENABLE
|
||||
; RUN: llc %s -o - -enable-shrink-wrap=false -disable-post-ra -frame-pointer=non-leaf | FileCheck %s --check-prefix=DISABLE
|
||||
; RUN: llc -debugify-and-strip-all-safe %s -o - -mtriple=arm64-apple-ios -enable-shrink-wrap=true -disable-post-ra -frame-pointer=non-leaf | FileCheck %s --check-prefix=ENABLE
|
||||
; RUN: llc -debugify-and-strip-all-safe %s -o - -enable-shrink-wrap=false -disable-post-ra -frame-pointer=non-leaf | FileCheck %s --check-prefix=DISABLE
|
||||
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
|
||||
target triple = "arm64-apple-ios"
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: llc < %s -O3 -mtriple=aarch64-eabi -verify-machineinstrs | FileCheck %s
|
||||
; RUN: llc -debugify-and-strip-all-safe < %s -O3 -mtriple=aarch64-eabi -verify-machineinstrs | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
|
||||
target triple = "aarch64-linaro-linux-gnueabi"
|
||||
|
|
Loading…
Reference in New Issue