mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 07:11:49 +00:00
[FastISel][AArch64] Fold offset into the memory operation.
Fold simple offsets into the memory operation: add x0, x0, #8 ldr x0, [x0] --> ldr x0, [x0, #8] Fixes <rdar://problem/17887945>. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214545 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
748566982e
commit
8d3bf10dd3
@ -419,6 +419,13 @@ bool AArch64FastISel::ComputeAddress(const Value *Obj, Address &Addr) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Instruction::Add:
|
||||
// Adds of constants are common and easy enough.
|
||||
if (const ConstantInt *CI = dyn_cast<ConstantInt>(U->getOperand(1))) {
|
||||
Addr.setOffset(Addr.getOffset() + (uint64_t)CI->getSExtValue());
|
||||
return ComputeAddress(U->getOperand(0), Addr);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// Try to get this in a register if nothing else has worked.
|
||||
|
23
test/CodeGen/AArch64/fast-isel-compute-address.ll
Normal file
23
test/CodeGen/AArch64/fast-isel-compute-address.ll
Normal file
@ -0,0 +1,23 @@
|
||||
; RUN: llc -fast-isel -fast-isel-abort -mtriple=arm64-apple-darwin < %s | FileCheck %s
|
||||
|
||||
; Test simple constant offset.
|
||||
define i64 @test_load1(i64 %a) {
|
||||
; CHECK-LABEL: test_load1
|
||||
; CHECK: ldr x0, [x0, #16]
|
||||
%1 = add i64 %a, 16
|
||||
%2 = inttoptr i64 %1 to i64*
|
||||
%3 = load i64* %2
|
||||
ret i64 %3
|
||||
}
|
||||
|
||||
; Test large constant offset.
|
||||
define i64 @test_load2(i64 %a) {
|
||||
; CHECK-LABEL: test_load2
|
||||
; CHECK: add [[REG:x[0-9]+]], x0, {{x[0-9]+}}
|
||||
; CHECK: ldr x0, {{\[}}[[REG]]{{\]}}
|
||||
%1 = add i64 %a, 16777216
|
||||
%2 = inttoptr i64 %1 to i64*
|
||||
%3 = load i64* %2
|
||||
ret i64 %3
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user