1*a15ed701SMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*a15ed701SMatt Arsenault; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -amdgpu-late-codegenprepare %s | FileCheck %s
3*a15ed701SMatt Arsenault
4*a15ed701SMatt Arsenault; Make sure we don't crash when trying to create a bitcast between
5*a15ed701SMatt Arsenault; address spaces
6*a15ed701SMatt Arsenaultdefine amdgpu_kernel void @constant_from_offset_cast_generic_null() {
7*a15ed701SMatt Arsenault; CHECK-LABEL: @constant_from_offset_cast_generic_null(
8*a15ed701SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32 addrspace(4)* bitcast (i8 addrspace(4)* getelementptr (i8, i8 addrspace(4)* addrspacecast (i8* null to i8 addrspace(4)*), i64 4) to i32 addrspace(4)*), align 4
9*a15ed701SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = lshr i32 [[TMP1]], 16
10*a15ed701SMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = trunc i32 [[TMP2]] to i8
11*a15ed701SMatt Arsenault; CHECK-NEXT:    store i8 [[TMP3]], i8 addrspace(1)* undef, align 1
12*a15ed701SMatt Arsenault; CHECK-NEXT:    ret void
13*a15ed701SMatt Arsenault;
14*a15ed701SMatt Arsenault  %load = load i8, i8 addrspace(4)* getelementptr inbounds (i8, i8 addrspace(4)* addrspacecast (i8* null to i8 addrspace(4)*), i64 6), align 1
15*a15ed701SMatt Arsenault  store i8 %load, i8 addrspace(1)* undef
16*a15ed701SMatt Arsenault  ret void
17*a15ed701SMatt Arsenault}
18*a15ed701SMatt Arsenault
19*a15ed701SMatt Arsenaultdefine amdgpu_kernel void @constant_from_offset_cast_global_null() {
20*a15ed701SMatt Arsenault; CHECK-LABEL: @constant_from_offset_cast_global_null(
21*a15ed701SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32 addrspace(4)* bitcast (i8 addrspace(4)* getelementptr (i8, i8 addrspace(4)* addrspacecast (i8 addrspace(1)* null to i8 addrspace(4)*), i64 4) to i32 addrspace(4)*), align 4
22*a15ed701SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = lshr i32 [[TMP1]], 16
23*a15ed701SMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = trunc i32 [[TMP2]] to i8
24*a15ed701SMatt Arsenault; CHECK-NEXT:    store i8 [[TMP3]], i8 addrspace(1)* undef, align 1
25*a15ed701SMatt Arsenault; CHECK-NEXT:    ret void
26*a15ed701SMatt Arsenault;
27*a15ed701SMatt Arsenault  %load = load i8, i8 addrspace(4)* getelementptr inbounds (i8, i8 addrspace(4)* addrspacecast (i8 addrspace(1)* null to i8 addrspace(4)*), i64 6), align 1
28*a15ed701SMatt Arsenault  store i8 %load, i8 addrspace(1)* undef
29*a15ed701SMatt Arsenault  ret void
30*a15ed701SMatt Arsenault}
31*a15ed701SMatt Arsenault
32*a15ed701SMatt Arsenault@gv = unnamed_addr addrspace(1) global [64 x i8] undef, align 4
33*a15ed701SMatt Arsenault
34*a15ed701SMatt Arsenaultdefine amdgpu_kernel void @constant_from_offset_cast_global_gv() {
35*a15ed701SMatt Arsenault; CHECK-LABEL: @constant_from_offset_cast_global_gv(
36*a15ed701SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32 addrspace(4)* bitcast (i8 addrspace(4)* getelementptr (i8, i8 addrspace(4)* addrspacecast (i8 addrspace(1)* getelementptr inbounds ([64 x i8], [64 x i8] addrspace(1)* @gv, i32 0, i32 0) to i8 addrspace(4)*), i64 4) to i32 addrspace(4)*), align 4
37*a15ed701SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = lshr i32 [[TMP1]], 16
38*a15ed701SMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = trunc i32 [[TMP2]] to i8
39*a15ed701SMatt Arsenault; CHECK-NEXT:    store i8 [[TMP3]], i8 addrspace(1)* undef, align 1
40*a15ed701SMatt Arsenault; CHECK-NEXT:    ret void
41*a15ed701SMatt Arsenault;
42*a15ed701SMatt Arsenault  %load = load i8, i8 addrspace(4)* getelementptr inbounds (i8, i8 addrspace(4)* addrspacecast ([64 x i8] addrspace(1)* @gv to i8 addrspace(4)*), i64 6), align 1
43*a15ed701SMatt Arsenault  store i8 %load, i8 addrspace(1)* undef
44*a15ed701SMatt Arsenault  ret void
45*a15ed701SMatt Arsenault}
46*a15ed701SMatt Arsenault
47*a15ed701SMatt Arsenaultdefine amdgpu_kernel void @constant_from_offset_cast_generic_inttoptr() {
48*a15ed701SMatt Arsenault; CHECK-LABEL: @constant_from_offset_cast_generic_inttoptr(
49*a15ed701SMatt Arsenault; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32 addrspace(4)* bitcast (i8 addrspace(4)* getelementptr (i8, i8 addrspace(4)* addrspacecast (i8* inttoptr (i64 128 to i8*) to i8 addrspace(4)*), i64 4) to i32 addrspace(4)*), align 4
50*a15ed701SMatt Arsenault; CHECK-NEXT:    [[TMP2:%.*]] = lshr i32 [[TMP1]], 16
51*a15ed701SMatt Arsenault; CHECK-NEXT:    [[TMP3:%.*]] = trunc i32 [[TMP2]] to i8
52*a15ed701SMatt Arsenault; CHECK-NEXT:    store i8 [[TMP3]], i8 addrspace(1)* undef, align 1
53*a15ed701SMatt Arsenault; CHECK-NEXT:    ret void
54*a15ed701SMatt Arsenault;
55*a15ed701SMatt Arsenault  %load = load i8, i8 addrspace(4)* getelementptr inbounds (i8, i8 addrspace(4)* addrspacecast (i8* inttoptr (i64 128 to i8*) to i8 addrspace(4)*), i64 6), align 1
56*a15ed701SMatt Arsenault  store i8 %load, i8 addrspace(1)* undef
57*a15ed701SMatt Arsenault  ret void
58*a15ed701SMatt Arsenault}
59*a15ed701SMatt Arsenault
60*a15ed701SMatt Arsenaultdefine amdgpu_kernel void @constant_from_inttoptr() {
61*a15ed701SMatt Arsenault; CHECK-LABEL: @constant_from_inttoptr(
62*a15ed701SMatt Arsenault; CHECK-NEXT:    [[LOAD:%.*]] = load i8, i8 addrspace(4)* inttoptr (i64 128 to i8 addrspace(4)*), align 4
63*a15ed701SMatt Arsenault; CHECK-NEXT:    store i8 [[LOAD]], i8 addrspace(1)* undef, align 1
64*a15ed701SMatt Arsenault; CHECK-NEXT:    ret void
65*a15ed701SMatt Arsenault;
66*a15ed701SMatt Arsenault  %load = load i8, i8 addrspace(4)* inttoptr (i64 128 to i8 addrspace(4)*), align 1
67*a15ed701SMatt Arsenault  store i8 %load, i8 addrspace(1)* undef
68*a15ed701SMatt Arsenault  ret void
69*a15ed701SMatt Arsenault}
70