Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.

Commit 3863c39

Browse files
committed
AArch64: avoid clobbering SP for dead MOVimm pseudos.
We were producing ORR, which actually defines a GPR32sp rather than a GPR32. Should fix PR23209. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@265198 91177308-0d34-0410-b5e6-96231b3b80d8 Conflicts: lib/Target/AArch64/AArch64TargetMachine.cpp
1 parent ed20c2f commit 3863c39

File tree

4 files changed

+59
-1
lines changed

4 files changed

+59
-1
lines changed

lib/Target/AArch64/AArch64.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ FunctionPass *createAArch64A53Fix835769();
4444
FunctionPass *createAArch64CleanupLocalDynamicTLSPass();
4545

4646
FunctionPass *createAArch64CollectLOHPass();
47+
48+
void initializeAArch64ExpandPseudoPass(PassRegistry&);
4749
} // end namespace llvm
4850

4951
#endif

lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,9 +413,17 @@ bool AArch64ExpandPseudo::expandMOVImm(MachineBasicBlock &MBB,
413413
MachineBasicBlock::iterator MBBI,
414414
unsigned BitSize) {
415415
MachineInstr &MI = *MBBI;
416+
unsigned DstReg = MI.getOperand(0).getReg();
416417
uint64_t Imm = MI.getOperand(1).getImm();
417418
const unsigned Mask = 0xFFFF;
418419

420+
if (DstReg == AArch64::XZR || DstReg == AArch64::WZR) {
421+
// Useless def, and we don't want to risk creating an invalid ORR (which
422+
// would really write to sp).
423+
MI.eraseFromParent();
424+
return true;
425+
}
426+
419427
// Try a MOVI instruction (aka ORR-immediate with the zero register).
420428
uint64_t UImm = Imm << (64 - BitSize) >> (64 - BitSize);
421429
uint64_t Encoding;
@@ -541,7 +549,6 @@ bool AArch64ExpandPseudo::expandMOVImm(MachineBasicBlock &MBB,
541549
LastShift = (TZ / 16) * 16;
542550
}
543551
unsigned Imm16 = (Imm >> Shift) & Mask;
544-
unsigned DstReg = MI.getOperand(0).getReg();
545552
bool DstIsDead = MI.getOperand(0).isDead();
546553
MachineInstrBuilder MIB1 =
547554
BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(FirstOpc))

lib/Target/AArch64/AArch64TargetMachine.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ extern "C" void LLVMInitializeAArch64Target() {
102102
RegisterTargetMachine<AArch64leTargetMachine> X(TheAArch64leTarget);
103103
RegisterTargetMachine<AArch64beTargetMachine> Y(TheAArch64beTarget);
104104
RegisterTargetMachine<AArch64leTargetMachine> Z(TheARM64Target);
105+
106+
auto PR = PassRegistry::getPassRegistry();
107+
initializeAArch64ExpandPseudoPass(*PR);
105108
}
106109

107110
//===----------------------------------------------------------------------===//

test/CodeGen/AArch64/movimm-wzr.mir

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# RUN: llc -run-pass=aarch64-expand-pseudo %s | FileCheck %s
2+
3+
--- |
4+
; ModuleID = 'simple.ll'
5+
source_filename = "simple.ll"
6+
target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
7+
target triple = "aarch64--linux-gnu"
8+
9+
define i32 @test_mov_0() {
10+
ret i32 42
11+
}
12+
13+
...
14+
---
15+
name: test_mov_0
16+
alignment: 2
17+
exposesReturnsTwice: false
18+
hasInlineAsm: false
19+
allVRegsAllocated: true
20+
isSSA: false
21+
tracksRegLiveness: false
22+
tracksSubRegLiveness: false
23+
frameInfo:
24+
isFrameAddressTaken: false
25+
isReturnAddressTaken: false
26+
hasStackMap: false
27+
hasPatchPoint: false
28+
stackSize: 0
29+
offsetAdjustment: 0
30+
maxAlignment: 0
31+
adjustsStack: false
32+
hasCalls: false
33+
maxCallFrameSize: 0
34+
hasOpaqueSPAdjustment: false
35+
hasVAStart: false
36+
hasMustTailInVarArgFunc: false
37+
body: |
38+
bb.0 (%ir-block.0):
39+
%wzr = MOVi32imm 42
40+
%xzr = MOVi64imm 42
41+
RET_ReallyLR implicit killed %w0
42+
43+
...
44+
45+
# CHECK: bb.0
46+
# CHECK-NEXT: RET %lr

0 commit comments

Comments
 (0)