blob: 90cdab3c09084c74544416e10f0f545df5b381bd [file]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -S -mtriple=nvptx64-nvidia-cuda -passes=infer-address-spaces %s | FileCheck %s
define void @test_smem_fail(ptr addrspace(3) %sp) {
; CHECK-LABEL: define void @test_smem_fail(
; CHECK-SAME: ptr addrspace(3) [[SP:%.*]]) {
; CHECK-NEXT: [[GP:%.*]] = addrspacecast ptr addrspace(3) [[SP]] to ptr
; CHECK-NEXT: [[A:%.*]] = ptrtoint ptr [[GP]] to i64
; CHECK-NEXT: [[B:%.*]] = xor i64 4096, [[A]]
; CHECK-NEXT: [[GP2:%.*]] = inttoptr i64 [[B]] to ptr
; CHECK-NEXT: store i16 0, ptr [[GP2]], align 2
; CHECK-NEXT: ret void
;
%gp = addrspacecast ptr addrspace(3) %sp to ptr
%a = ptrtoint ptr %gp to i64
%b = xor i64 4096, %a
%gp2 = inttoptr i64 %b to ptr
store i16 0, ptr %gp2, align 2
ret void
}
define void @test_smem_fail2(ptr addrspace(3) %sp) {
; CHECK-LABEL: define void @test_smem_fail2(
; CHECK-SAME: ptr addrspace(3) [[SP:%.*]]) {
; CHECK-NEXT: [[GP1:%.*]] = addrspacecast ptr addrspace(3) [[SP]] to ptr
; CHECK-NEXT: [[GP:%.*]] = getelementptr i8, ptr [[GP1]], i32 8
; CHECK-NEXT: [[A:%.*]] = ptrtoint ptr [[GP]] to i64
; CHECK-NEXT: [[B:%.*]] = xor i64 4095, [[A]]
; CHECK-NEXT: [[GP2:%.*]] = inttoptr i64 [[B]] to ptr
; CHECK-NEXT: store i16 0, ptr [[GP2]], align 2
; CHECK-NEXT: ret void
;
%gp1 = addrspacecast ptr addrspace(3) %sp to ptr
%gp = getelementptr i8, ptr %gp1, i32 8
%a = ptrtoint ptr %gp to i64
%b = xor i64 4095, %a
%gp2 = inttoptr i64 %b to ptr
store i16 0, ptr %gp2, align 2
ret void
}
define void @test_xor_smem(ptr addrspace(3) %sp) {
; CHECK-LABEL: define void @test_xor_smem(
; CHECK-SAME: ptr addrspace(3) [[SP:%.*]]) {
; CHECK-NEXT: [[GP:%.*]] = addrspacecast ptr addrspace(3) [[SP]] to ptr
; CHECK-NEXT: [[A:%.*]] = ptrtoint ptr [[GP]] to i64
; CHECK-NEXT: [[B:%.*]] = xor i64 4095, [[A]]
; CHECK-NEXT: [[GP2:%.*]] = inttoptr i64 [[B]] to ptr
; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[GP2]] to ptr addrspace(3)
; CHECK-NEXT: store i16 0, ptr addrspace(3) [[TMP1]], align 2
; CHECK-NEXT: ret void
;
%gp = addrspacecast ptr addrspace(3) %sp to ptr
%a = ptrtoint ptr %gp to i64
%b = xor i64 4095, %a
%gp2 = inttoptr i64 %b to ptr
store i16 0, ptr %gp2, align 2
ret void
}
define void @test_xor_smem2(ptr addrspace(3) %sp) {
; CHECK-LABEL: define void @test_xor_smem2(
; CHECK-SAME: ptr addrspace(3) [[SP:%.*]]) {
; CHECK-NEXT: [[GP:%.*]] = addrspacecast ptr addrspace(3) [[SP]] to ptr
; CHECK-NEXT: [[A:%.*]] = ptrtoint ptr [[GP]] to i64
; CHECK-NEXT: [[B:%.*]] = xor i64 [[A]], 4095
; CHECK-NEXT: [[GP2:%.*]] = inttoptr i64 [[B]] to ptr
; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[GP2]] to ptr addrspace(3)
; CHECK-NEXT: store i16 0, ptr addrspace(3) [[TMP1]], align 2
; CHECK-NEXT: ret void
;
%gp = addrspacecast ptr addrspace(3) %sp to ptr
%a = ptrtoint ptr %gp to i64
%b = xor i64 %a, 4095
%gp2 = inttoptr i64 %b to ptr
store i16 0, ptr %gp2, align 2
ret void
}
define void @test_or_smem(ptr addrspace(3) %sp) {
; CHECK-LABEL: define void @test_or_smem(
; CHECK-SAME: ptr addrspace(3) [[SP:%.*]]) {
; CHECK-NEXT: [[GP:%.*]] = addrspacecast ptr addrspace(3) [[SP]] to ptr
; CHECK-NEXT: [[A:%.*]] = ptrtoint ptr [[GP]] to i64
; CHECK-NEXT: [[B:%.*]] = or i64 4095, [[A]]
; CHECK-NEXT: [[GP2:%.*]] = inttoptr i64 [[B]] to ptr
; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[GP2]] to ptr addrspace(3)
; CHECK-NEXT: store i16 0, ptr addrspace(3) [[TMP1]], align 2
; CHECK-NEXT: ret void
;
%gp = addrspacecast ptr addrspace(3) %sp to ptr
%a = ptrtoint ptr %gp to i64
%b = or i64 4095, %a
%gp2 = inttoptr i64 %b to ptr
store i16 0, ptr %gp2, align 2
ret void
}
define void @test_or_smem2(ptr addrspace(3) %sp) {
; CHECK-LABEL: define void @test_or_smem2(
; CHECK-SAME: ptr addrspace(3) [[SP:%.*]]) {
; CHECK-NEXT: [[GP:%.*]] = addrspacecast ptr addrspace(3) [[SP]] to ptr
; CHECK-NEXT: [[A:%.*]] = ptrtoint ptr [[GP]] to i64
; CHECK-NEXT: [[B:%.*]] = or i64 4096, [[A]]
; CHECK-NEXT: [[GP2:%.*]] = inttoptr i64 [[B]] to ptr
; CHECK-NEXT: store i16 0, ptr [[GP2]], align 2
; CHECK-NEXT: ret void
;
%gp = addrspacecast ptr addrspace(3) %sp to ptr
%a = ptrtoint ptr %gp to i64
%b = or i64 4096, %a
%gp2 = inttoptr i64 %b to ptr
store i16 0, ptr %gp2, align 2
ret void
}
define void @test_and_smem(ptr addrspace(3) %sp) {
; CHECK-LABEL: define void @test_and_smem(
; CHECK-SAME: ptr addrspace(3) [[SP:%.*]]) {
; CHECK-NEXT: [[GP:%.*]] = addrspacecast ptr addrspace(3) [[SP]] to ptr
; CHECK-NEXT: [[A:%.*]] = ptrtoint ptr [[GP]] to i64
; CHECK-NEXT: [[B:%.*]] = and i64 [[A]], -4096
; CHECK-NEXT: [[GP2:%.*]] = inttoptr i64 [[B]] to ptr
; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[GP2]] to ptr addrspace(3)
; CHECK-NEXT: store i16 0, ptr addrspace(3) [[TMP1]], align 2
; CHECK-NEXT: ret void
;
%gp = addrspacecast ptr addrspace(3) %sp to ptr
%a = ptrtoint ptr %gp to i64
%b = and i64 %a, -4096
%gp2 = inttoptr i64 %b to ptr
store i16 0, ptr %gp2, align 2
ret void
}
define void @test_and_smem_fail(ptr addrspace(3) %sp) {
; CHECK-LABEL: define void @test_and_smem_fail(
; CHECK-SAME: ptr addrspace(3) [[SP:%.*]]) {
; CHECK-NEXT: [[GP:%.*]] = addrspacecast ptr addrspace(3) [[SP]] to ptr
; CHECK-NEXT: [[A:%.*]] = ptrtoint ptr [[GP]] to i64
; CHECK-NEXT: [[B:%.*]] = and i64 [[A]], -4097
; CHECK-NEXT: [[GP2:%.*]] = inttoptr i64 [[B]] to ptr
; CHECK-NEXT: store i16 0, ptr [[GP2]], align 2
; CHECK-NEXT: ret void
;
%gp = addrspacecast ptr addrspace(3) %sp to ptr
%a = ptrtoint ptr %gp to i64
%b = and i64 %a, -4097
%gp2 = inttoptr i64 %b to ptr
store i16 0, ptr %gp2, align 2
ret void
}
define void @test_gmem(ptr addrspace(1) %sp) {
; CHECK-LABEL: define void @test_gmem(
; CHECK-SAME: ptr addrspace(1) [[SP:%.*]]) {
; CHECK-NEXT: [[GP:%.*]] = addrspacecast ptr addrspace(1) [[SP]] to ptr
; CHECK-NEXT: [[A:%.*]] = ptrtoint ptr [[GP]] to i64
; CHECK-NEXT: [[B:%.*]] = xor i64 7, [[A]]
; CHECK-NEXT: [[GP2:%.*]] = inttoptr i64 [[B]] to ptr
; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[GP2]] to ptr addrspace(1)
; CHECK-NEXT: store i16 0, ptr addrspace(1) [[TMP1]], align 2
; CHECK-NEXT: ret void
;
%gp = addrspacecast ptr addrspace(1) %sp to ptr
%a = ptrtoint ptr %gp to i64
%b = xor i64 7, %a
%gp2 = inttoptr i64 %b to ptr
store i16 0, ptr %gp2, align 2
ret void
}
define void @test_lmem(ptr addrspace(5) %sp) {
; CHECK-LABEL: define void @test_lmem(
; CHECK-SAME: ptr addrspace(5) [[SP:%.*]]) {
; CHECK-NEXT: [[GP:%.*]] = addrspacecast ptr addrspace(5) [[SP]] to ptr
; CHECK-NEXT: [[A:%.*]] = ptrtoint ptr [[GP]] to i64
; CHECK-NEXT: [[B:%.*]] = xor i64 7, [[A]]
; CHECK-NEXT: [[GP2:%.*]] = inttoptr i64 [[B]] to ptr
; CHECK-NEXT: store i16 0, ptr [[GP2]], align 2
; CHECK-NEXT: ret void
;
%gp = addrspacecast ptr addrspace(5) %sp to ptr
%a = ptrtoint ptr %gp to i64
%b = xor i64 7, %a
%gp2 = inttoptr i64 %b to ptr
store i16 0, ptr %gp2, align 2
ret void
}
define void @test3(ptr addrspace(3) %sp) {
; CHECK-LABEL: define void @test3(
; CHECK-SAME: ptr addrspace(3) [[SP:%.*]]) {
; CHECK-NEXT: [[GP:%.*]] = addrspacecast ptr addrspace(3) [[SP]] to ptr
; CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[GP]] to i64
; CHECK-NEXT: [[AND:%.*]] = lshr i64 [[T1]], 8
; CHECK-NEXT: [[SHR:%.*]] = and i64 [[AND]], 8
; CHECK-NEXT: [[AND1:%.*]] = lshr i64 [[T1]], 10
; CHECK-NEXT: [[SHR2:%.*]] = and i64 [[AND1]], 4
; CHECK-NEXT: [[OR:%.*]] = or i64 [[SHR]], [[SHR2]]
; CHECK-NEXT: [[AND3:%.*]] = lshr i64 [[T1]], 4
; CHECK-NEXT: [[SHR4:%.*]] = and i64 [[AND3]], 112
; CHECK-NEXT: [[OR5:%.*]] = or i64 [[OR]], [[SHR4]]
; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[OR5]], [[T1]]
; CHECK-NEXT: [[GP2:%.*]] = inttoptr i64 [[XOR]] to ptr
; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr [[GP2]] to ptr addrspace(3)
; CHECK-NEXT: store i16 0, ptr addrspace(3) [[TMP1]], align 2
; CHECK-NEXT: ret void
;
%gp = addrspacecast ptr addrspace(3) %sp to ptr
%t1 = ptrtoint ptr %gp to i64
%and = lshr i64 %t1, 8
%shr = and i64 %and, 8
%and1 = lshr i64 %t1, 10
%shr2 = and i64 %and1, 4
%or = or i64 %shr, %shr2
%and3 = lshr i64 %t1, 4
%shr4 = and i64 %and3, 112
%or5 = or i64 %or, %shr4
%xor = xor i64 %or5, %t1
%gp2 = inttoptr i64 %xor to ptr
store i16 0, ptr %gp2, align 2
ret void
}
@g = addrspace(1) global i32 0, align 4
define void @test_ce() {
; CHECK-LABEL: define void @test_ce() {
; CHECK-NEXT: store i32 0, ptr inttoptr (i64 xor (i64 ptrtoint (ptr addrspacecast (ptr addrspace(1) @g to ptr) to i64), i64 7) to ptr), align 4
; CHECK-NEXT: ret void
;
store i32 0, ptr inttoptr (i64
xor (i64
ptrtoint (ptr
addrspacecast (ptr addrspace(1) @g to ptr)
to i64),
i64 7)
to ptr)
ret void
}