mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 04:36:07 +00:00
[X86] Respect blockaddress offsets when performing X86 LEA fixups (#71641)
The X86FixupLEAs pass drops blockaddress offsets, when splitting up slow 3-ops LEAs, as can be seen in this example: https://godbolt.org/z/bEsc3Poje Before running the pass, the first instruction in bb.0 is a LEA with ebp, ebx and a blockaddress. After the transformation, the blockaddress is missing. The reason this happens is because the 3-ops LEA is being splitup into a 2-ops LEA + an add instruction. However, as hasLEAOffset does not take blockaddresses into consideration, the add is not emitted and thus leading to the offset being dropped. Taking blockaddresses into consideration fixes this issue and results in the add instruction being emitted. This fixes #71667
This commit is contained in:
parent
a5a0248835
commit
8cbfc0b29d
@ -341,7 +341,8 @@ static inline bool hasInefficientLEABaseReg(const MachineOperand &Base,
|
||||
}
|
||||
|
||||
static inline bool hasLEAOffset(const MachineOperand &Offset) {
|
||||
return (Offset.isImm() && Offset.getImm() != 0) || Offset.isGlobal();
|
||||
return (Offset.isImm() && Offset.getImm() != 0) || Offset.isGlobal() ||
|
||||
Offset.isBlockAddress();
|
||||
}
|
||||
|
||||
static inline unsigned getADDrrFromLEA(unsigned LEAOpcode) {
|
||||
|
30
llvm/test/CodeGen/X86/lea-fixup-blockaddress.mir
Normal file
30
llvm/test/CodeGen/X86/lea-fixup-blockaddress.mir
Normal file
@ -0,0 +1,30 @@
|
||||
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 3
|
||||
# RUN: llc -mtriple=i386-unknown-linux-gnu -mattr=slow-3ops-lea -run-pass x86-fixup-LEAs -o - %s | FileCheck %s
|
||||
|
||||
--- |
|
||||
define i32 @square(i32 %0) local_unnamed_addr {
|
||||
%blub = getelementptr i8, ptr blockaddress(@square, %2), i32 %0
|
||||
indirectbr ptr %blub, [label %2]
|
||||
|
||||
2:
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
---
|
||||
name: square
|
||||
body: |
|
||||
; CHECK-LABEL: name: square
|
||||
; CHECK: bb.0:
|
||||
; CHECK-NEXT: renamable $eax = LEA32r renamable $ebx, 1, renamable $ebp, 0, $noreg
|
||||
; CHECK-NEXT: $eax = ADD32ri $eax, target-flags(x86-gotoff) blockaddress(@square, %ir-block.1), implicit-def $eflags
|
||||
; CHECK-NEXT: JMP32r killed renamable $eax
|
||||
; CHECK-NEXT: {{ $}}
|
||||
; CHECK-NEXT: bb.1 (%ir-block.1, ir-block-address-taken %ir-block.1):
|
||||
; CHECK-NEXT: RET 0
|
||||
bb.0:
|
||||
renamable $eax = LEA32r renamable $ebp, 1, renamable $ebx, target-flags(x86-gotoff) blockaddress(@square, %ir-block.1), $noreg
|
||||
JMP32r killed renamable $eax
|
||||
|
||||
bb.1 (%ir-block.1, ir-block-address-taken %ir-block.1):
|
||||
RET 0
|
||||
...
|
Loading…
x
Reference in New Issue
Block a user