forked from OSchip/llvm-project
[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>. llvm-svn: 214545
This commit is contained in:
parent
f164bee0e0
commit
5dcb33bdbb
|
@ -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.
|
||||
|
|
|
@ -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