1*d4216b5dSAlex Voicu // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2ed181efaSSameer Sahasrabuddhe // REQUIRES: amdgpu-registered-target
39466b491SNikita Popov // RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -x hip -emit-llvm -fcuda-is-device \
4*d4216b5dSAlex Voicu // RUN: -o - %s | FileCheck --check-prefix=AMDGCN --enable-var-scope %s
5*d4216b5dSAlex Voicu // RUN: %clang_cc1 -triple spirv64-amd-amdhsa -x hip -emit-llvm -fcuda-is-device \
6*d4216b5dSAlex Voicu // RUN: -o - %s | FileCheck --check-prefix=AMDGCNSPIRV --enable-var-scope %s
7ed181efaSSameer Sahasrabuddhe
8ed181efaSSameer Sahasrabuddhe #define __device__ __attribute__((device))
9ed181efaSSameer Sahasrabuddhe
10ed181efaSSameer Sahasrabuddhe extern "C" __device__ int printf(const char *format, ...);
11ed181efaSSameer Sahasrabuddhe
12*d4216b5dSAlex Voicu // AMDGCN-LABEL: define dso_local noundef i32 @_Z4foo1v(
13*d4216b5dSAlex Voicu // AMDGCN-SAME: ) #[[ATTR0:[0-9]+]] {
14*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[ENTRY:.*]]:
15*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[RETVAL:%.*]] = alloca i32, align 4, addrspace(5)
16*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[S:%.*]] = alloca ptr, align 8, addrspace(5)
17*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr
18*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[S_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[S]] to ptr
19*d4216b5dSAlex Voicu // AMDGCN-NEXT: store ptr addrspacecast (ptr addrspace(4) @.str to ptr), ptr [[S_ASCAST]], align 8
20*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ASCAST]], align 8
21*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP1:%.*]] = load ptr, ptr [[S_ASCAST]], align 8
22*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP2:%.*]] = call i64 @__ockl_printf_begin(i64 0)
23*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP3:%.*]] = icmp eq ptr addrspacecast (ptr addrspace(4) @.str.1 to ptr), null
24*d4216b5dSAlex Voicu // AMDGCN-NEXT: br i1 [[TMP3]], label %[[STRLEN_JOIN:.*]], label %[[STRLEN_WHILE:.*]]
25*d4216b5dSAlex Voicu // AMDGCN: [[STRLEN_WHILE]]:
26*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP4:%.*]] = phi ptr [ addrspacecast (ptr addrspace(4) @.str.1 to ptr), %[[ENTRY]] ], [ [[TMP5:%.*]], %[[STRLEN_WHILE]] ]
27*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP5]] = getelementptr i8, ptr [[TMP4]], i64 1
28*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP4]], align 1
29*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP7:%.*]] = icmp eq i8 [[TMP6]], 0
30*d4216b5dSAlex Voicu // AMDGCN-NEXT: br i1 [[TMP7]], label %[[STRLEN_WHILE_DONE:.*]], label %[[STRLEN_WHILE]]
31*d4216b5dSAlex Voicu // AMDGCN: [[STRLEN_WHILE_DONE]]:
32*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP4]] to i64
33*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP9:%.*]] = sub i64 [[TMP8]], ptrtoint (ptr addrspacecast (ptr addrspace(4) @.str.1 to ptr) to i64)
34*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP10:%.*]] = add i64 [[TMP9]], 1
35*d4216b5dSAlex Voicu // AMDGCN-NEXT: br label %[[STRLEN_JOIN]]
36*d4216b5dSAlex Voicu // AMDGCN: [[STRLEN_JOIN]]:
37*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP11:%.*]] = phi i64 [ [[TMP10]], %[[STRLEN_WHILE_DONE]] ], [ 0, %[[ENTRY]] ]
38*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP12:%.*]] = call i64 @__ockl_printf_append_string_n(i64 [[TMP2]], ptr addrspacecast (ptr addrspace(4) @.str.1 to ptr), i64 [[TMP11]], i32 0)
39*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP13:%.*]] = call i64 @__ockl_printf_append_args(i64 [[TMP12]], i32 1, i64 8, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i32 0)
40*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP14:%.*]] = call i64 @__ockl_printf_append_args(i64 [[TMP13]], i32 1, i64 4614256650576692846, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i32 0)
41*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP15:%.*]] = call i64 @__ockl_printf_append_args(i64 [[TMP14]], i32 1, i64 8, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i32 0)
42*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP16:%.*]] = call i64 @__ockl_printf_append_args(i64 [[TMP15]], i32 1, i64 4, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i32 0)
43*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP17:%.*]] = icmp eq ptr [[TMP0]], null
44*d4216b5dSAlex Voicu // AMDGCN-NEXT: br i1 [[TMP17]], label %[[STRLEN_JOIN1:.*]], label %[[STRLEN_WHILE2:.*]]
45*d4216b5dSAlex Voicu // AMDGCN: [[STRLEN_WHILE2]]:
46*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP18:%.*]] = phi ptr [ [[TMP0]], %[[STRLEN_JOIN]] ], [ [[TMP19:%.*]], %[[STRLEN_WHILE2]] ]
47*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP19]] = getelementptr i8, ptr [[TMP18]], i64 1
48*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP20:%.*]] = load i8, ptr [[TMP18]], align 1
49*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP21:%.*]] = icmp eq i8 [[TMP20]], 0
50*d4216b5dSAlex Voicu // AMDGCN-NEXT: br i1 [[TMP21]], label %[[STRLEN_WHILE_DONE3:.*]], label %[[STRLEN_WHILE2]]
51*d4216b5dSAlex Voicu // AMDGCN: [[STRLEN_WHILE_DONE3]]:
52*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP22:%.*]] = ptrtoint ptr [[TMP0]] to i64
53*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP23:%.*]] = ptrtoint ptr [[TMP18]] to i64
54*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP24:%.*]] = sub i64 [[TMP23]], [[TMP22]]
55*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP25:%.*]] = add i64 [[TMP24]], 1
56*d4216b5dSAlex Voicu // AMDGCN-NEXT: br label %[[STRLEN_JOIN1]]
57*d4216b5dSAlex Voicu // AMDGCN: [[STRLEN_JOIN1]]:
58*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP26:%.*]] = phi i64 [ [[TMP25]], %[[STRLEN_WHILE_DONE3]] ], [ 0, %[[STRLEN_JOIN]] ]
59*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP27:%.*]] = call i64 @__ockl_printf_append_string_n(i64 [[TMP16]], ptr [[TMP0]], i64 [[TMP26]], i32 0)
60*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP28:%.*]] = ptrtoint ptr [[TMP1]] to i64
61*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP29:%.*]] = call i64 @__ockl_printf_append_args(i64 [[TMP27]], i32 1, i64 [[TMP28]], i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i32 1)
62*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP30:%.*]] = trunc i64 [[TMP29]] to i32
63*d4216b5dSAlex Voicu // AMDGCN-NEXT: ret i32 [[TMP30]]
64*d4216b5dSAlex Voicu //
65*d4216b5dSAlex Voicu // AMDGCNSPIRV-LABEL: define spir_func noundef i32 @_Z4foo1v(
66*d4216b5dSAlex Voicu // AMDGCNSPIRV-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {
67*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[ENTRY:.*]]:
68*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
69*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[S:%.*]] = alloca ptr addrspace(4), align 8
70*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr [[RETVAL]] to ptr addrspace(4)
71*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[S_ASCAST:%.*]] = addrspacecast ptr [[S]] to ptr addrspace(4)
72*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: store ptr addrspace(4) addrspacecast (ptr addrspace(1) @.str to ptr addrspace(4)), ptr addrspace(4) [[S_ASCAST]], align 8
73*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP0:%.*]] = load ptr addrspace(4), ptr addrspace(4) [[S_ASCAST]], align 8
74*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP1:%.*]] = load ptr addrspace(4), ptr addrspace(4) [[S_ASCAST]], align 8
75*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP2:%.*]] = call addrspace(4) i64 @__ockl_printf_begin(i64 0)
76*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP3:%.*]] = icmp eq ptr addrspace(4) addrspacecast (ptr addrspace(1) @.str.1 to ptr addrspace(4)), null
77*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: br i1 [[TMP3]], label %[[STRLEN_JOIN:.*]], label %[[STRLEN_WHILE:.*]]
78*d4216b5dSAlex Voicu // AMDGCNSPIRV: [[STRLEN_WHILE]]:
79*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP4:%.*]] = phi ptr addrspace(4) [ addrspacecast (ptr addrspace(1) @.str.1 to ptr addrspace(4)), %[[ENTRY]] ], [ [[TMP5:%.*]], %[[STRLEN_WHILE]] ]
80*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP5]] = getelementptr i8, ptr addrspace(4) [[TMP4]], i64 1
81*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP6:%.*]] = load i8, ptr addrspace(4) [[TMP4]], align 1
82*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP7:%.*]] = icmp eq i8 [[TMP6]], 0
83*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: br i1 [[TMP7]], label %[[STRLEN_WHILE_DONE:.*]], label %[[STRLEN_WHILE]]
84*d4216b5dSAlex Voicu // AMDGCNSPIRV: [[STRLEN_WHILE_DONE]]:
85*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP8:%.*]] = ptrtoint ptr addrspace(4) [[TMP4]] to i64
86*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP9:%.*]] = sub i64 [[TMP8]], ptrtoint (ptr addrspace(4) addrspacecast (ptr addrspace(1) @.str.1 to ptr addrspace(4)) to i64)
87*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP10:%.*]] = add i64 [[TMP9]], 1
88*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: br label %[[STRLEN_JOIN]]
89*d4216b5dSAlex Voicu // AMDGCNSPIRV: [[STRLEN_JOIN]]:
90*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP11:%.*]] = phi i64 [ [[TMP10]], %[[STRLEN_WHILE_DONE]] ], [ 0, %[[ENTRY]] ]
91*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP12:%.*]] = call addrspace(4) i64 @__ockl_printf_append_string_n(i64 [[TMP2]], ptr addrspace(4) addrspacecast (ptr addrspace(1) @.str.1 to ptr addrspace(4)), i64 [[TMP11]], i32 0)
92*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP13:%.*]] = call addrspace(4) i64 @__ockl_printf_append_args(i64 [[TMP12]], i32 1, i64 8, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i32 0)
93*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP14:%.*]] = call addrspace(4) i64 @__ockl_printf_append_args(i64 [[TMP13]], i32 1, i64 4614256650576692846, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i32 0)
94*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP15:%.*]] = call addrspace(4) i64 @__ockl_printf_append_args(i64 [[TMP14]], i32 1, i64 8, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i32 0)
95*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP16:%.*]] = call addrspace(4) i64 @__ockl_printf_append_args(i64 [[TMP15]], i32 1, i64 4, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i32 0)
96*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP17:%.*]] = icmp eq ptr addrspace(4) [[TMP0]], null
97*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: br i1 [[TMP17]], label %[[STRLEN_JOIN1:.*]], label %[[STRLEN_WHILE2:.*]]
98*d4216b5dSAlex Voicu // AMDGCNSPIRV: [[STRLEN_WHILE2]]:
99*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP18:%.*]] = phi ptr addrspace(4) [ [[TMP0]], %[[STRLEN_JOIN]] ], [ [[TMP19:%.*]], %[[STRLEN_WHILE2]] ]
100*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP19]] = getelementptr i8, ptr addrspace(4) [[TMP18]], i64 1
101*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP20:%.*]] = load i8, ptr addrspace(4) [[TMP18]], align 1
102*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP21:%.*]] = icmp eq i8 [[TMP20]], 0
103*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: br i1 [[TMP21]], label %[[STRLEN_WHILE_DONE3:.*]], label %[[STRLEN_WHILE2]]
104*d4216b5dSAlex Voicu // AMDGCNSPIRV: [[STRLEN_WHILE_DONE3]]:
105*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP22:%.*]] = ptrtoint ptr addrspace(4) [[TMP0]] to i64
106*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP23:%.*]] = ptrtoint ptr addrspace(4) [[TMP18]] to i64
107*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP24:%.*]] = sub i64 [[TMP23]], [[TMP22]]
108*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP25:%.*]] = add i64 [[TMP24]], 1
109*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: br label %[[STRLEN_JOIN1]]
110*d4216b5dSAlex Voicu // AMDGCNSPIRV: [[STRLEN_JOIN1]]:
111*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP26:%.*]] = phi i64 [ [[TMP25]], %[[STRLEN_WHILE_DONE3]] ], [ 0, %[[STRLEN_JOIN]] ]
112*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP27:%.*]] = call addrspace(4) i64 @__ockl_printf_append_string_n(i64 [[TMP16]], ptr addrspace(4) [[TMP0]], i64 [[TMP26]], i32 0)
113*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP28:%.*]] = ptrtoint ptr addrspace(4) [[TMP1]] to i64
114*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP29:%.*]] = call addrspace(4) i64 @__ockl_printf_append_args(i64 [[TMP27]], i32 1, i64 [[TMP28]], i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i32 1)
115*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP30:%.*]] = trunc i64 [[TMP29]] to i32
116*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: ret i32 [[TMP30]]
117*d4216b5dSAlex Voicu //
foo1()118ed181efaSSameer Sahasrabuddhe __device__ int foo1() {
119ed181efaSSameer Sahasrabuddhe const char *s = "hello world";
120ed181efaSSameer Sahasrabuddhe return printf("%.*f %*.*s %p\n", 8, 3.14159, 8, 4, s, s);
121ed181efaSSameer Sahasrabuddhe }
122ed181efaSSameer Sahasrabuddhe
123ed181efaSSameer Sahasrabuddhe __device__ char *dstr;
124ed181efaSSameer Sahasrabuddhe
125*d4216b5dSAlex Voicu // AMDGCN-LABEL: define dso_local noundef i32 @_Z4foo2v(
126*d4216b5dSAlex Voicu // AMDGCN-SAME: ) #[[ATTR0:[0-9]+]] {
127*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[ENTRY:.*]]:
128*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[RETVAL:%.*]] = alloca i32, align 4, addrspace(5)
129*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr
130*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP0:%.*]] = load ptr, ptr addrspacecast (ptr addrspace(1) @dstr to ptr), align 8
131*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP1:%.*]] = load ptr, ptr addrspacecast (ptr addrspace(1) @dstr to ptr), align 8
132*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP2:%.*]] = call i64 @__ockl_printf_begin(i64 0)
133*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP3:%.*]] = icmp eq ptr addrspacecast (ptr addrspace(4) @.str.2 to ptr), null
134*d4216b5dSAlex Voicu // AMDGCN-NEXT: br i1 [[TMP3]], label %[[STRLEN_JOIN:.*]], label %[[STRLEN_WHILE:.*]]
135*d4216b5dSAlex Voicu // AMDGCN: [[STRLEN_WHILE]]:
136*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP4:%.*]] = phi ptr [ addrspacecast (ptr addrspace(4) @.str.2 to ptr), %[[ENTRY]] ], [ [[TMP5:%.*]], %[[STRLEN_WHILE]] ]
137*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP5]] = getelementptr i8, ptr [[TMP4]], i64 1
138*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP6:%.*]] = load i8, ptr [[TMP4]], align 1
139*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP7:%.*]] = icmp eq i8 [[TMP6]], 0
140*d4216b5dSAlex Voicu // AMDGCN-NEXT: br i1 [[TMP7]], label %[[STRLEN_WHILE_DONE:.*]], label %[[STRLEN_WHILE]]
141*d4216b5dSAlex Voicu // AMDGCN: [[STRLEN_WHILE_DONE]]:
142*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP4]] to i64
143*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP9:%.*]] = sub i64 [[TMP8]], ptrtoint (ptr addrspacecast (ptr addrspace(4) @.str.2 to ptr) to i64)
144*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP10:%.*]] = add i64 [[TMP9]], 1
145*d4216b5dSAlex Voicu // AMDGCN-NEXT: br label %[[STRLEN_JOIN]]
146*d4216b5dSAlex Voicu // AMDGCN: [[STRLEN_JOIN]]:
147*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP11:%.*]] = phi i64 [ [[TMP10]], %[[STRLEN_WHILE_DONE]] ], [ 0, %[[ENTRY]] ]
148*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP12:%.*]] = call i64 @__ockl_printf_append_string_n(i64 [[TMP2]], ptr addrspacecast (ptr addrspace(4) @.str.2 to ptr), i64 [[TMP11]], i32 0)
149*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP13:%.*]] = icmp eq ptr [[TMP0]], null
150*d4216b5dSAlex Voicu // AMDGCN-NEXT: br i1 [[TMP13]], label %[[STRLEN_JOIN1:.*]], label %[[STRLEN_WHILE2:.*]]
151*d4216b5dSAlex Voicu // AMDGCN: [[STRLEN_WHILE2]]:
152*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP14:%.*]] = phi ptr [ [[TMP0]], %[[STRLEN_JOIN]] ], [ [[TMP15:%.*]], %[[STRLEN_WHILE2]] ]
153*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP15]] = getelementptr i8, ptr [[TMP14]], i64 1
154*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP16:%.*]] = load i8, ptr [[TMP14]], align 1
155*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP17:%.*]] = icmp eq i8 [[TMP16]], 0
156*d4216b5dSAlex Voicu // AMDGCN-NEXT: br i1 [[TMP17]], label %[[STRLEN_WHILE_DONE3:.*]], label %[[STRLEN_WHILE2]]
157*d4216b5dSAlex Voicu // AMDGCN: [[STRLEN_WHILE_DONE3]]:
158*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP18:%.*]] = ptrtoint ptr [[TMP0]] to i64
159*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP19:%.*]] = ptrtoint ptr [[TMP14]] to i64
160*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP20:%.*]] = sub i64 [[TMP19]], [[TMP18]]
161*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP21:%.*]] = add i64 [[TMP20]], 1
162*d4216b5dSAlex Voicu // AMDGCN-NEXT: br label %[[STRLEN_JOIN1]]
163*d4216b5dSAlex Voicu // AMDGCN: [[STRLEN_JOIN1]]:
164*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP22:%.*]] = phi i64 [ [[TMP21]], %[[STRLEN_WHILE_DONE3]] ], [ 0, %[[STRLEN_JOIN]] ]
165*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP23:%.*]] = call i64 @__ockl_printf_append_string_n(i64 [[TMP12]], ptr [[TMP0]], i64 [[TMP22]], i32 0)
166*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP24:%.*]] = ptrtoint ptr [[TMP1]] to i64
167*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP25:%.*]] = call i64 @__ockl_printf_append_args(i64 [[TMP23]], i32 1, i64 [[TMP24]], i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i32 1)
168*d4216b5dSAlex Voicu // AMDGCN-NEXT: [[TMP26:%.*]] = trunc i64 [[TMP25]] to i32
169*d4216b5dSAlex Voicu // AMDGCN-NEXT: ret i32 [[TMP26]]
170*d4216b5dSAlex Voicu //
171*d4216b5dSAlex Voicu // AMDGCNSPIRV-LABEL: define spir_func noundef i32 @_Z4foo2v(
172*d4216b5dSAlex Voicu // AMDGCNSPIRV-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {
173*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[ENTRY:.*]]:
174*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
175*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr [[RETVAL]] to ptr addrspace(4)
176*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP0:%.*]] = load ptr addrspace(4), ptr addrspace(4) addrspacecast (ptr addrspace(1) @dstr to ptr addrspace(4)), align 8
177*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP1:%.*]] = load ptr addrspace(4), ptr addrspace(4) addrspacecast (ptr addrspace(1) @dstr to ptr addrspace(4)), align 8
178*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP2:%.*]] = call addrspace(4) i64 @__ockl_printf_begin(i64 0)
179*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP3:%.*]] = icmp eq ptr addrspace(4) addrspacecast (ptr addrspace(1) @.str.2 to ptr addrspace(4)), null
180*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: br i1 [[TMP3]], label %[[STRLEN_JOIN:.*]], label %[[STRLEN_WHILE:.*]]
181*d4216b5dSAlex Voicu // AMDGCNSPIRV: [[STRLEN_WHILE]]:
182*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP4:%.*]] = phi ptr addrspace(4) [ addrspacecast (ptr addrspace(1) @.str.2 to ptr addrspace(4)), %[[ENTRY]] ], [ [[TMP5:%.*]], %[[STRLEN_WHILE]] ]
183*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP5]] = getelementptr i8, ptr addrspace(4) [[TMP4]], i64 1
184*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP6:%.*]] = load i8, ptr addrspace(4) [[TMP4]], align 1
185*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP7:%.*]] = icmp eq i8 [[TMP6]], 0
186*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: br i1 [[TMP7]], label %[[STRLEN_WHILE_DONE:.*]], label %[[STRLEN_WHILE]]
187*d4216b5dSAlex Voicu // AMDGCNSPIRV: [[STRLEN_WHILE_DONE]]:
188*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP8:%.*]] = ptrtoint ptr addrspace(4) [[TMP4]] to i64
189*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP9:%.*]] = sub i64 [[TMP8]], ptrtoint (ptr addrspace(4) addrspacecast (ptr addrspace(1) @.str.2 to ptr addrspace(4)) to i64)
190*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP10:%.*]] = add i64 [[TMP9]], 1
191*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: br label %[[STRLEN_JOIN]]
192*d4216b5dSAlex Voicu // AMDGCNSPIRV: [[STRLEN_JOIN]]:
193*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP11:%.*]] = phi i64 [ [[TMP10]], %[[STRLEN_WHILE_DONE]] ], [ 0, %[[ENTRY]] ]
194*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP12:%.*]] = call addrspace(4) i64 @__ockl_printf_append_string_n(i64 [[TMP2]], ptr addrspace(4) addrspacecast (ptr addrspace(1) @.str.2 to ptr addrspace(4)), i64 [[TMP11]], i32 0)
195*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP13:%.*]] = icmp eq ptr addrspace(4) [[TMP0]], null
196*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: br i1 [[TMP13]], label %[[STRLEN_JOIN1:.*]], label %[[STRLEN_WHILE2:.*]]
197*d4216b5dSAlex Voicu // AMDGCNSPIRV: [[STRLEN_WHILE2]]:
198*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP14:%.*]] = phi ptr addrspace(4) [ [[TMP0]], %[[STRLEN_JOIN]] ], [ [[TMP15:%.*]], %[[STRLEN_WHILE2]] ]
199*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP15]] = getelementptr i8, ptr addrspace(4) [[TMP14]], i64 1
200*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP16:%.*]] = load i8, ptr addrspace(4) [[TMP14]], align 1
201*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP17:%.*]] = icmp eq i8 [[TMP16]], 0
202*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: br i1 [[TMP17]], label %[[STRLEN_WHILE_DONE3:.*]], label %[[STRLEN_WHILE2]]
203*d4216b5dSAlex Voicu // AMDGCNSPIRV: [[STRLEN_WHILE_DONE3]]:
204*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP18:%.*]] = ptrtoint ptr addrspace(4) [[TMP0]] to i64
205*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP19:%.*]] = ptrtoint ptr addrspace(4) [[TMP14]] to i64
206*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP20:%.*]] = sub i64 [[TMP19]], [[TMP18]]
207*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP21:%.*]] = add i64 [[TMP20]], 1
208*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: br label %[[STRLEN_JOIN1]]
209*d4216b5dSAlex Voicu // AMDGCNSPIRV: [[STRLEN_JOIN1]]:
210*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP22:%.*]] = phi i64 [ [[TMP21]], %[[STRLEN_WHILE_DONE3]] ], [ 0, %[[STRLEN_JOIN]] ]
211*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP23:%.*]] = call addrspace(4) i64 @__ockl_printf_append_string_n(i64 [[TMP12]], ptr addrspace(4) [[TMP0]], i64 [[TMP22]], i32 0)
212*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP24:%.*]] = ptrtoint ptr addrspace(4) [[TMP1]] to i64
213*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP25:%.*]] = call addrspace(4) i64 @__ockl_printf_append_args(i64 [[TMP23]], i32 1, i64 [[TMP24]], i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i32 1)
214*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: [[TMP26:%.*]] = trunc i64 [[TMP25]] to i32
215*d4216b5dSAlex Voicu // AMDGCNSPIRV-NEXT: ret i32 [[TMP26]]
216*d4216b5dSAlex Voicu //
foo2()217ed181efaSSameer Sahasrabuddhe __device__ int foo2() {
218ed181efaSSameer Sahasrabuddhe return printf("%s %p\n", dstr, dstr);
219ed181efaSSameer Sahasrabuddhe }
220