mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-06 06:33:24 +00:00
The PPCTargetLowering::SelectAddressRegImm routine needs to handle FrameIndex nodes in a special manner, by tranlating them into a TargetFrameIndex node. This was done in most cases, but seems to have been neglected in one path: when the input tree has an OR of the FrameIndex with an immediate. This can happen if the FrameIndex can be proven to be sufficiently aligned that an OR of that immediate is equivalent to an ADD. The missing handling of FrameIndex in that case caused the SelectionDAG instruction selection to miss opportunities to merge the OR back into the FrameIndex node, leading to superfluous addi/ori instructions in the final assembler output. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213482 91177308-0d34-0410-b5e6-96231b3b80d8
56 lines
2.2 KiB
LLVM
56 lines
2.2 KiB
LLVM
; RUN: llc -mcpu=ppc64 -O0 < %s | FileCheck %s
|
|
|
|
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
|
|
target triple = "powerpc64-unknown-linux-gnu"
|
|
|
|
define { ppc_fp128, ppc_fp128 } @foo() nounwind {
|
|
entry:
|
|
%retval = alloca { ppc_fp128, ppc_fp128 }, align 16
|
|
%x = alloca { ppc_fp128, ppc_fp128 }, align 16
|
|
%real = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %x, i32 0, i32 0
|
|
%imag = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %x, i32 0, i32 1
|
|
store ppc_fp128 0xM400C0000000000000000000000000000, ppc_fp128* %real
|
|
store ppc_fp128 0xMC00547AE147AE1483CA47AE147AE147A, ppc_fp128* %imag
|
|
%x.realp = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %x, i32 0, i32 0
|
|
%x.real = load ppc_fp128* %x.realp
|
|
%x.imagp = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %x, i32 0, i32 1
|
|
%x.imag = load ppc_fp128* %x.imagp
|
|
%real1 = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %retval, i32 0, i32 0
|
|
%imag2 = getelementptr inbounds { ppc_fp128, ppc_fp128 }* %retval, i32 0, i32 1
|
|
store ppc_fp128 %x.real, ppc_fp128* %real1
|
|
store ppc_fp128 %x.imag, ppc_fp128* %imag2
|
|
%0 = load { ppc_fp128, ppc_fp128 }* %retval
|
|
ret { ppc_fp128, ppc_fp128 } %0
|
|
}
|
|
|
|
; CHECK-LABEL: foo:
|
|
; CHECK: lfd 3
|
|
; CHECK: lfd 4
|
|
; CHECK: lfd 1
|
|
; CHECK: lfd 2
|
|
|
|
define { float, float } @oof() nounwind {
|
|
entry:
|
|
%retval = alloca { float, float }, align 4
|
|
%x = alloca { float, float }, align 4
|
|
%real = getelementptr inbounds { float, float }* %x, i32 0, i32 0
|
|
%imag = getelementptr inbounds { float, float }* %x, i32 0, i32 1
|
|
store float 3.500000e+00, float* %real
|
|
store float 0xC00547AE20000000, float* %imag
|
|
%x.realp = getelementptr inbounds { float, float }* %x, i32 0, i32 0
|
|
%x.real = load float* %x.realp
|
|
%x.imagp = getelementptr inbounds { float, float }* %x, i32 0, i32 1
|
|
%x.imag = load float* %x.imagp
|
|
%real1 = getelementptr inbounds { float, float }* %retval, i32 0, i32 0
|
|
%imag2 = getelementptr inbounds { float, float }* %retval, i32 0, i32 1
|
|
store float %x.real, float* %real1
|
|
store float %x.imag, float* %imag2
|
|
%0 = load { float, float }* %retval
|
|
ret { float, float } %0
|
|
}
|
|
|
|
; CHECK-LABEL: oof:
|
|
; CHECK: lfs 2
|
|
; CHECK: lfs 1
|
|
|