1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

SLSR: Pass address space to isLegalAddressingMode

This only updates one of the uses. The other is used in cases
that may never touch memory, so I'm not sure why this is even
calling it. Perhaps there should be a new, similar hook for such
cases or pass -1 for unknown address space.

llvm-svn: 239540
This commit is contained in:
Matt Arsenault 2015-06-11 16:13:39 +00:00
parent a574c653c9
commit f40c082c04
3 changed files with 112 additions and 1 deletions

View File

@ -265,8 +265,10 @@ static bool isGEPFoldable(GetElementPtrInst *GEP,
BaseOffset += DL->getStructLayout(STy)->getElementOffset(Field);
}
}
unsigned AddrSpace = GEP->getPointerAddressSpace();
return TTI->isLegalAddressingMode(GEP->getType()->getElementType(), BaseGV,
BaseOffset, HasBaseReg, Scale);
BaseOffset, HasBaseReg, Scale, AddrSpace);
}
// Returns whether (Base + Index * Stride) can be folded to an addressing mode.

View File

@ -0,0 +1,2 @@
if not 'R600' in config.root.targets:
config.unsupported = True

View File

@ -0,0 +1,107 @@
; RUN: opt -S -mtriple=amdgcn-- -separate-const-offset-from-gep -slsr -gvn < %s | FileCheck %s
target datalayout = "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64"
; CHECK-LABEL: @slsr_after_reassociate_global_geps_mubuf_max_offset(
; CHECK: [[b1:%[0-9]+]] = getelementptr float, float addrspace(1)* %arr, i64 [[bump:%[0-9]+]]
; CHECK: [[b2:%[0-9]+]] = getelementptr float, float addrspace(1)* [[b1]], i64 [[bump]]
define void @slsr_after_reassociate_global_geps_mubuf_max_offset(float addrspace(1)* %out, float addrspace(1)* noalias %arr, i32 %i) {
bb:
%i2 = shl nsw i32 %i, 1
%j1 = add nsw i32 %i, 1023
%tmp = sext i32 %j1 to i64
%p1 = getelementptr inbounds float, float addrspace(1)* %arr, i64 %tmp
%tmp3 = bitcast float addrspace(1)* %p1 to i32 addrspace(1)*
%v11 = load i32, i32 addrspace(1)* %tmp3, align 4
%tmp4 = bitcast float addrspace(1)* %out to i32 addrspace(1)*
store i32 %v11, i32 addrspace(1)* %tmp4, align 4
%j2 = add nsw i32 %i2, 1023
%tmp5 = sext i32 %j2 to i64
%p2 = getelementptr inbounds float, float addrspace(1)* %arr, i64 %tmp5
%tmp6 = bitcast float addrspace(1)* %p2 to i32 addrspace(1)*
%v22 = load i32, i32 addrspace(1)* %tmp6, align 4
%tmp7 = bitcast float addrspace(1)* %out to i32 addrspace(1)*
store i32 %v22, i32 addrspace(1)* %tmp7, align 4
ret void
}
; CHECK-LABEL: @slsr_after_reassociate_global_geps_over_mubuf_max_offset(
; CHECK: %j1 = add nsw i32 %i, 1024
; CHECK: %tmp = sext i32 %j1 to i64
; CHECK: getelementptr inbounds float, float addrspace(1)* %arr, i64 %tmp
; CHECK: getelementptr inbounds float, float addrspace(1)* %arr, i64 %tmp5
define void @slsr_after_reassociate_global_geps_over_mubuf_max_offset(float addrspace(1)* %out, float addrspace(1)* noalias %arr, i32 %i) {
bb:
%i2 = shl nsw i32 %i, 1
%j1 = add nsw i32 %i, 1024
%tmp = sext i32 %j1 to i64
%p1 = getelementptr inbounds float, float addrspace(1)* %arr, i64 %tmp
%tmp3 = bitcast float addrspace(1)* %p1 to i32 addrspace(1)*
%v11 = load i32, i32 addrspace(1)* %tmp3, align 4
%tmp4 = bitcast float addrspace(1)* %out to i32 addrspace(1)*
store i32 %v11, i32 addrspace(1)* %tmp4, align 4
%j2 = add nsw i32 %i2, 1024
%tmp5 = sext i32 %j2 to i64
%p2 = getelementptr inbounds float, float addrspace(1)* %arr, i64 %tmp5
%tmp6 = bitcast float addrspace(1)* %p2 to i32 addrspace(1)*
%v22 = load i32, i32 addrspace(1)* %tmp6, align 4
%tmp7 = bitcast float addrspace(1)* %out to i32 addrspace(1)*
store i32 %v22, i32 addrspace(1)* %tmp7, align 4
ret void
}
; CHECK-LABEL: @slsr_after_reassociate_lds_geps_ds_max_offset(
; CHECK: [[B1:%[0-9]+]] = getelementptr float, float addrspace(3)* %arr, i32 %i
; CHECK: getelementptr float, float addrspace(3)* [[B1]], i32 16383
; CHECK: [[B2:%[0-9]+]] = getelementptr float, float addrspace(3)* [[B1]], i32 %i
; CHECK: getelementptr float, float addrspace(3)* [[B2]], i32 16383
define void @slsr_after_reassociate_lds_geps_ds_max_offset(float addrspace(1)* %out, float addrspace(3)* noalias %arr, i32 %i) {
bb:
%i2 = shl nsw i32 %i, 1
%j1 = add nsw i32 %i, 16383
%p1 = getelementptr inbounds float, float addrspace(3)* %arr, i32 %j1
%tmp3 = bitcast float addrspace(3)* %p1 to i32 addrspace(3)*
%v11 = load i32, i32 addrspace(3)* %tmp3, align 4
%tmp4 = bitcast float addrspace(1)* %out to i32 addrspace(1)*
store i32 %v11, i32 addrspace(1)* %tmp4, align 4
%j2 = add nsw i32 %i2, 16383
%p2 = getelementptr inbounds float, float addrspace(3)* %arr, i32 %j2
%tmp6 = bitcast float addrspace(3)* %p2 to i32 addrspace(3)*
%v22 = load i32, i32 addrspace(3)* %tmp6, align 4
%tmp7 = bitcast float addrspace(1)* %out to i32 addrspace(1)*
store i32 %v22, i32 addrspace(1)* %tmp7, align 4
ret void
}
; CHECK-LABEL: @slsr_after_reassociate_lds_geps_over_ds_max_offset(
; CHECK: %j1 = add nsw i32 %i, 16384
; CHECK: getelementptr inbounds float, float addrspace(3)* %arr, i32 %j1
; CHECK: %j2 = add i32 %j1, %i
; CHECK: getelementptr inbounds float, float addrspace(3)* %arr, i32 %j2
define void @slsr_after_reassociate_lds_geps_over_ds_max_offset(float addrspace(1)* %out, float addrspace(3)* noalias %arr, i32 %i) {
bb:
%i2 = shl nsw i32 %i, 1
%j1 = add nsw i32 %i, 16384
%p1 = getelementptr inbounds float, float addrspace(3)* %arr, i32 %j1
%tmp3 = bitcast float addrspace(3)* %p1 to i32 addrspace(3)*
%v11 = load i32, i32 addrspace(3)* %tmp3, align 4
%tmp4 = bitcast float addrspace(1)* %out to i32 addrspace(1)*
store i32 %v11, i32 addrspace(1)* %tmp4, align 4
%j2 = add nsw i32 %i2, 16384
%p2 = getelementptr inbounds float, float addrspace(3)* %arr, i32 %j2
%tmp6 = bitcast float addrspace(3)* %p2 to i32 addrspace(3)*
%v22 = load i32, i32 addrspace(3)* %tmp6, align 4
%tmp7 = bitcast float addrspace(1)* %out to i32 addrspace(1)*
store i32 %v22, i32 addrspace(1)* %tmp7, align 4
ret void
}