mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
[CodeGenPrepare] Make -addr-sink-using-gep work with address spaces.
When we construct addressing modes, we use isNoopAddrSpaceCast to ignore addrspacecast instructions. Make sure we insert the correct addrspacecast when we reconstruct the addressing mode. Differential Revision: https://reviews.llvm.org/D30114 llvm-svn: 296167
This commit is contained in:
parent
cb3ae36b91
commit
ab9ea9bab7
@ -4167,7 +4167,7 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
|
||||
DEBUG(dbgs() << "CGP: Reusing nonlocal addrmode: " << AddrMode << " for "
|
||||
<< *MemoryInst << "\n");
|
||||
if (SunkAddr->getType() != Addr->getType())
|
||||
SunkAddr = Builder.CreateBitCast(SunkAddr, Addr->getType());
|
||||
SunkAddr = Builder.CreatePointerCast(SunkAddr, Addr->getType());
|
||||
} else if (AddrSinkUsingGEPs ||
|
||||
(!AddrSinkUsingGEPs.getNumOccurrences() && TM &&
|
||||
SubtargetInfo->useAA())) {
|
||||
@ -4273,7 +4273,7 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
|
||||
// We need to add this separately from the scale above to help with
|
||||
// SDAG consecutive load/store merging.
|
||||
if (ResultPtr->getType() != I8PtrTy)
|
||||
ResultPtr = Builder.CreateBitCast(ResultPtr, I8PtrTy);
|
||||
ResultPtr = Builder.CreatePointerCast(ResultPtr, I8PtrTy);
|
||||
ResultPtr = Builder.CreateGEP(I8Ty, ResultPtr, ResultIndex, "sunkaddr");
|
||||
}
|
||||
|
||||
@ -4284,12 +4284,12 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
|
||||
SunkAddr = ResultPtr;
|
||||
} else {
|
||||
if (ResultPtr->getType() != I8PtrTy)
|
||||
ResultPtr = Builder.CreateBitCast(ResultPtr, I8PtrTy);
|
||||
ResultPtr = Builder.CreatePointerCast(ResultPtr, I8PtrTy);
|
||||
SunkAddr = Builder.CreateGEP(I8Ty, ResultPtr, ResultIndex, "sunkaddr");
|
||||
}
|
||||
|
||||
if (SunkAddr->getType() != Addr->getType())
|
||||
SunkAddr = Builder.CreateBitCast(SunkAddr, Addr->getType());
|
||||
SunkAddr = Builder.CreatePointerCast(SunkAddr, Addr->getType());
|
||||
}
|
||||
} else {
|
||||
DEBUG(dbgs() << "CGP: SINKING nonlocal addrmode: " << AddrMode << " for "
|
||||
|
@ -1,11 +1,14 @@
|
||||
; RUN: opt -S -codegenprepare < %s | FileCheck %s
|
||||
; RUN: opt -S -codegenprepare < %s | FileCheck %s -check-prefix=CHECK -check-prefix=INT
|
||||
; RUN: opt -S -codegenprepare -addr-sink-using-gep=true < %s | FileCheck %s -check-prefix=CHECK -check-prefix=GEP
|
||||
|
||||
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-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
; CHECK-LABEL: @load_cast_gep
|
||||
; CHECK: add i64 %sunkaddr, 40
|
||||
; INT: add i64 %sunkaddr, 40
|
||||
; GEP: [[CAST:%[0-9]+]] = addrspacecast i64* %base to i8 addrspace(1)*
|
||||
; GEP: getelementptr i8, i8 addrspace(1)* [[CAST]], i64 40
|
||||
define void @load_cast_gep(i1 %cond, i64* %base) {
|
||||
entry:
|
||||
%addr = getelementptr inbounds i64, i64* %base, i64 5
|
||||
@ -21,7 +24,9 @@ fallthrough:
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @store_gep_cast
|
||||
; CHECK: add i64 %sunkaddr, 20
|
||||
; INT: add i64 %sunkaddr, 20
|
||||
; GEP: [[CAST:%[0-9]+]] = addrspacecast i64* %base to i8 addrspace(1)*
|
||||
; GEP: getelementptr i8, i8 addrspace(1)* [[CAST]], i64 20
|
||||
define void @store_gep_cast(i1 %cond, i64* %base) {
|
||||
entry:
|
||||
%casted = addrspacecast i64* %base to i32 addrspace(1)*
|
||||
|
Loading…
Reference in New Issue
Block a user