1631c9654SVikram // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 2 2631c9654SVikram // REQUIRES: amdgpu-registered-target 3631c9654SVikram // RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -x hip -emit-llvm -mprintf-kind=buffered -fcuda-is-device \ 4631c9654SVikram // RUN: -o - %s | FileCheck --enable-var-scope %s 5631c9654SVikram // RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -x hip -emit-llvm -ffp-exception-behavior=strict -mprintf-kind=buffered -fcuda-is-device \ 6631c9654SVikram // RUN: -o - %s | FileCheck --enable-var-scope --check-prefix=CHECK_CONSTRAINED %s 7631c9654SVikram 8631c9654SVikram #define __device__ __attribute__((device)) 9631c9654SVikram #define __shared__ __attribute__((shared)) 10631c9654SVikram #define __constant__ __attribute__((constant)) 11631c9654SVikram 12631c9654SVikram extern "C" __device__ int printf(const char *format, ...); 13631c9654SVikram 14631c9654SVikram // CHECK-LABEL: define dso_local noundef i32 @_Z4foo1v 15631c9654SVikram // CHECK-NEXT: entry: 16631c9654SVikram // CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4, addrspace(5) 17631c9654SVikram // CHECK-NEXT: [[S:%.*]] = alloca ptr, align 8, addrspace(5) 18631c9654SVikram // CHECK-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr 19631c9654SVikram // CHECK-NEXT: [[S_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[S]] to ptr 20631c9654SVikram // CHECK-NEXT: store ptr addrspacecast (ptr addrspace(4) @.str to ptr), ptr [[S_ASCAST]], align 8 21631c9654SVikram // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ASCAST]], align 8 22631c9654SVikram // CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[S_ASCAST]], align 8 23631c9654SVikram // CHECK-NEXT: [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null 24631c9654SVikram // CHECK-NEXT: br i1 [[TMP2]], label [[STRLEN_JOIN:%.*]], label [[STRLEN_WHILE:%.*]] 25631c9654SVikram // CHECK: strlen.while: 26631c9654SVikram // CHECK-NEXT: [[TMP3:%.*]] = phi ptr [ [[TMP0]], [[ENTRY:%.*]] ], [ [[TMP4:%.*]], [[STRLEN_WHILE]] ] 27631c9654SVikram // CHECK-NEXT: [[TMP4]] = getelementptr i8, ptr [[TMP3]], i64 1 28631c9654SVikram // CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP3]], align 1 29631c9654SVikram // CHECK-NEXT: [[TMP6:%.*]] = icmp eq i8 [[TMP5]], 0 30631c9654SVikram // CHECK-NEXT: br i1 [[TMP6]], label [[STRLEN_WHILE_DONE:%.*]], label [[STRLEN_WHILE]] 31631c9654SVikram // CHECK: strlen.while.done: 32631c9654SVikram // CHECK-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP0]] to i64 33631c9654SVikram // CHECK-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP3]] to i64 34631c9654SVikram // CHECK-NEXT: [[TMP9:%.*]] = sub i64 [[TMP8]], [[TMP7]] 35631c9654SVikram // CHECK-NEXT: [[TMP10:%.*]] = add i64 [[TMP9]], 1 36631c9654SVikram // CHECK-NEXT: br label [[STRLEN_JOIN]] 37631c9654SVikram // CHECK: strlen.join: 38631c9654SVikram // CHECK-NEXT: [[TMP11:%.*]] = phi i64 [ [[TMP10]], [[STRLEN_WHILE_DONE]] ], [ 0, [[ENTRY]] ] 39631c9654SVikram // CHECK-NEXT: [[TMP12:%.*]] = add i64 [[TMP11]], 7 40631c9654SVikram // CHECK-NEXT: [[TMP13:%.*]] = and i64 [[TMP12]], 4294967288 41631c9654SVikram // CHECK-NEXT: [[TMP14:%.*]] = add i64 [[TMP13]], 52 42631c9654SVikram // CHECK-NEXT: [[TMP15:%.*]] = trunc i64 [[TMP14]] to i32 43631c9654SVikram // CHECK-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 [[TMP15]]) 44631c9654SVikram // CHECK-NEXT: [[TMP16:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null 45631c9654SVikram // CHECK-NEXT: br i1 [[TMP16]], label [[ARGPUSH_BLOCK:%.*]], label [[END_BLOCK:%.*]] 46631c9654SVikram // CHECK: end.block: 47631c9654SVikram // CHECK-NEXT: [[TMP17:%.*]] = xor i1 [[TMP16]], true 48631c9654SVikram // CHECK-NEXT: [[PRINTF_RESULT:%.*]] = sext i1 [[TMP17]] to i32 49631c9654SVikram // CHECK-NEXT: ret i32 [[PRINTF_RESULT]] 50631c9654SVikram // CHECK: argpush.block: 51631c9654SVikram // CHECK-NEXT: [[TMP18:%.*]] = shl i32 [[TMP15]], 2 52631c9654SVikram // CHECK-NEXT: [[TMP19:%.*]] = or i32 [[TMP18]], 2 53631c9654SVikram // CHECK-NEXT: store i32 [[TMP19]], ptr addrspace(1) [[PRINTF_ALLOC_FN]], align 4 54631c9654SVikram // CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4 55631c9654SVikram // CHECK-NEXT: store i64 1107004088646384690, ptr addrspace(1) [[TMP20]], align 8 56631c9654SVikram // CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP20]], i32 8 57631c9654SVikram // CHECK-NEXT: store i64 8, ptr addrspace(1) [[TMP21]], align 8 58631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP21]], i32 8 59631c9654SVikram // CHECK-NEXT: store double 3.141590e+00, ptr addrspace(1) [[PRINTBUFFNEXTPTR]], align 8 60631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR1:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR]], i32 8 61631c9654SVikram // CHECK-NEXT: store i64 8, ptr addrspace(1) [[PRINTBUFFNEXTPTR1]], align 8 62631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR2:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR1]], i32 8 63631c9654SVikram // CHECK-NEXT: store i64 4, ptr addrspace(1) [[PRINTBUFFNEXTPTR2]], align 8 64631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR3:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR2]], i32 8 65631c9654SVikram // CHECK-NEXT: call void @llvm.memcpy.p1.p0.i64(ptr addrspace(1) align 1 [[PRINTBUFFNEXTPTR3]], ptr align 1 [[TMP0]], i64 [[TMP11]], i1 false) 66631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR4:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR3]], i64 [[TMP13]] 67631c9654SVikram // CHECK-NEXT: store ptr [[TMP1]], ptr addrspace(1) [[PRINTBUFFNEXTPTR4]], align 8 68631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR5:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR4]], i32 8 69631c9654SVikram // CHECK-NEXT: br label [[END_BLOCK]] 70631c9654SVikram // 71631c9654SVikram // CHECK_CONSTRAINED-LABEL: define dso_local noundef i32 @_Z4foo1v 72631c9654SVikram // CHECK_CONSTRAINED-NEXT: entry: 73631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[RETVAL:%.*]] = alloca i32, align 4, addrspace(5) 74631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[S:%.*]] = alloca ptr, align 8, addrspace(5) 75631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr 76631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[S_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[S]] to ptr 77631c9654SVikram // CHECK_CONSTRAINED-NEXT: store ptr addrspacecast (ptr addrspace(4) @.str to ptr), ptr [[S_ASCAST]], align 8 78631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ASCAST]], align 8 79631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP1:%.*]] = load ptr, ptr [[S_ASCAST]], align 8 80631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null 81631c9654SVikram // CHECK_CONSTRAINED-NEXT: br i1 [[TMP2]], label [[STRLEN_JOIN:%.*]], label [[STRLEN_WHILE:%.*]] 82631c9654SVikram // CHECK_CONSTRAINED: strlen.while: 83631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP3:%.*]] = phi ptr [ [[TMP0]], [[ENTRY:%.*]] ], [ [[TMP4:%.*]], [[STRLEN_WHILE]] ] 84631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP4]] = getelementptr i8, ptr [[TMP3]], i64 1 85631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP3]], align 1 86631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP6:%.*]] = icmp eq i8 [[TMP5]], 0 87631c9654SVikram // CHECK_CONSTRAINED-NEXT: br i1 [[TMP6]], label [[STRLEN_WHILE_DONE:%.*]], label [[STRLEN_WHILE]] 88631c9654SVikram // CHECK_CONSTRAINED: strlen.while.done: 89631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP0]] to i64 90631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP3]] to i64 91631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP9:%.*]] = sub i64 [[TMP8]], [[TMP7]] 92631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP10:%.*]] = add i64 [[TMP9]], 1 93631c9654SVikram // CHECK_CONSTRAINED-NEXT: br label [[STRLEN_JOIN]] 94631c9654SVikram // CHECK_CONSTRAINED: strlen.join: 95631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP11:%.*]] = phi i64 [ [[TMP10]], [[STRLEN_WHILE_DONE]] ], [ 0, [[ENTRY]] ] 96631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP12:%.*]] = add i64 [[TMP11]], 7 97631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP13:%.*]] = and i64 [[TMP12]], 4294967288 98631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP14:%.*]] = add i64 [[TMP13]], 52 99631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP15:%.*]] = trunc i64 [[TMP14]] to i32 100631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 [[TMP15]]) 101631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP16:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null 102631c9654SVikram // CHECK_CONSTRAINED-NEXT: br i1 [[TMP16]], label [[ARGPUSH_BLOCK:%.*]], label [[END_BLOCK:%.*]] 103631c9654SVikram // CHECK_CONSTRAINED: end.block: 104631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP17:%.*]] = xor i1 [[TMP16]], true 105631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTF_RESULT:%.*]] = sext i1 [[TMP17]] to i32 106631c9654SVikram // CHECK_CONSTRAINED-NEXT: ret i32 [[PRINTF_RESULT]] 107631c9654SVikram // CHECK_CONSTRAINED: argpush.block: 108631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP18:%.*]] = shl i32 [[TMP15]], 2 109631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP19:%.*]] = or i32 [[TMP18]], 2 110631c9654SVikram // CHECK_CONSTRAINED-NEXT: store i32 [[TMP19]], ptr addrspace(1) [[PRINTF_ALLOC_FN]], align 4 111631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4 112631c9654SVikram // CHECK_CONSTRAINED-NEXT: store i64 1107004088646384690, ptr addrspace(1) [[TMP20]], align 8 113631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP20]], i32 8 114631c9654SVikram // CHECK_CONSTRAINED-NEXT: store i64 8, ptr addrspace(1) [[TMP21]], align 8 115631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP21]], i32 8 116631c9654SVikram // CHECK_CONSTRAINED-NEXT: store double 3.141590e+00, ptr addrspace(1) [[PRINTBUFFNEXTPTR]], align 8 117631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR1:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR]], i32 8 118631c9654SVikram // CHECK_CONSTRAINED-NEXT: store i64 8, ptr addrspace(1) [[PRINTBUFFNEXTPTR1]], align 8 119631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR2:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR1]], i32 8 120631c9654SVikram // CHECK_CONSTRAINED-NEXT: store i64 4, ptr addrspace(1) [[PRINTBUFFNEXTPTR2]], align 8 121631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR3:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR2]], i32 8 122631c9654SVikram // CHECK_CONSTRAINED-NEXT: call void @llvm.memcpy.p1.p0.i64(ptr addrspace(1) align 1 [[PRINTBUFFNEXTPTR3]], ptr align 1 [[TMP0]], i64 [[TMP11]], i1 false) 123631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR4:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR3]], i64 [[TMP13]] 124631c9654SVikram // CHECK_CONSTRAINED-NEXT: store ptr [[TMP1]], ptr addrspace(1) [[PRINTBUFFNEXTPTR4]], align 8 125631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR5:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR4]], i32 8 126631c9654SVikram // CHECK_CONSTRAINED-NEXT: br label [[END_BLOCK]] 127631c9654SVikram // 128631c9654SVikram __device__ int foo1() { 129631c9654SVikram const char *s = "hello world"; 130631c9654SVikram return printf("%.*f %*.*s %p\n", 8, 3.14159, 8, 4, s, s); 131631c9654SVikram } 132631c9654SVikram 133631c9654SVikram __device__ char *dstr; 134631c9654SVikram __device__ const 135631c9654SVikram // CHECK-LABEL: define dso_local noundef i32 @_Z4foo2v 136631c9654SVikram // CHECK-NEXT: entry: 137631c9654SVikram // CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4, addrspace(5) 138631c9654SVikram // CHECK-NEXT: [[LCVAL:%.*]] = alloca i32, align 4, addrspace(5) 139631c9654SVikram // CHECK-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr 140631c9654SVikram // CHECK-NEXT: [[LCVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[LCVAL]] to ptr 141631c9654SVikram // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr addrspacecast (ptr addrspace(1) @dstr to ptr), align 8 142631c9654SVikram // CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr addrspacecast (ptr addrspace(1) @dstr to ptr), align 8 143631c9654SVikram // CHECK-NEXT: [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null 144631c9654SVikram // CHECK-NEXT: br i1 [[TMP2]], label [[STRLEN_JOIN:%.*]], label [[STRLEN_WHILE:%.*]] 145631c9654SVikram // CHECK: strlen.while: 146631c9654SVikram // CHECK-NEXT: [[TMP3:%.*]] = phi ptr [ [[TMP0]], [[ENTRY:%.*]] ], [ [[TMP4:%.*]], [[STRLEN_WHILE]] ] 147631c9654SVikram // CHECK-NEXT: [[TMP4]] = getelementptr i8, ptr [[TMP3]], i64 1 148631c9654SVikram // CHECK-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP3]], align 1 149631c9654SVikram // CHECK-NEXT: [[TMP6:%.*]] = icmp eq i8 [[TMP5]], 0 150631c9654SVikram // CHECK-NEXT: br i1 [[TMP6]], label [[STRLEN_WHILE_DONE:%.*]], label [[STRLEN_WHILE]] 151631c9654SVikram // CHECK: strlen.while.done: 152631c9654SVikram // CHECK-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP0]] to i64 153631c9654SVikram // CHECK-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP3]] to i64 154631c9654SVikram // CHECK-NEXT: [[TMP9:%.*]] = sub i64 [[TMP8]], [[TMP7]] 155631c9654SVikram // CHECK-NEXT: [[TMP10:%.*]] = add i64 [[TMP9]], 1 156631c9654SVikram // CHECK-NEXT: br label [[STRLEN_JOIN]] 157631c9654SVikram // CHECK: strlen.join: 158631c9654SVikram // CHECK-NEXT: [[TMP11:%.*]] = phi i64 [ [[TMP10]], [[STRLEN_WHILE_DONE]] ], [ 0, [[ENTRY]] ] 159631c9654SVikram // CHECK-NEXT: [[TMP12:%.*]] = add i64 [[TMP11]], 7 160631c9654SVikram // CHECK-NEXT: [[TMP13:%.*]] = and i64 [[TMP12]], 4294967288 161631c9654SVikram // CHECK-NEXT: [[TMP14:%.*]] = add i64 [[TMP13]], 36 162631c9654SVikram // CHECK-NEXT: [[TMP15:%.*]] = trunc i64 [[TMP14]] to i32 163631c9654SVikram // CHECK-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 [[TMP15]]) 164631c9654SVikram // CHECK-NEXT: [[TMP16:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null 165631c9654SVikram // CHECK-NEXT: br i1 [[TMP16]], label [[ARGPUSH_BLOCK:%.*]], label [[END_BLOCK:%.*]] 166631c9654SVikram // CHECK: end.block: 167631c9654SVikram // CHECK-NEXT: [[TMP17:%.*]] = xor i1 [[TMP16]], true 168631c9654SVikram // CHECK-NEXT: [[PRINTF_RESULT:%.*]] = sext i1 [[TMP17]] to i32 169631c9654SVikram // CHECK-NEXT: ret i32 [[PRINTF_RESULT]] 170631c9654SVikram // CHECK: argpush.block: 171631c9654SVikram // CHECK-NEXT: [[TMP18:%.*]] = shl i32 [[TMP15]], 2 172631c9654SVikram // CHECK-NEXT: [[TMP19:%.*]] = or i32 [[TMP18]], 2 173631c9654SVikram // CHECK-NEXT: store i32 [[TMP19]], ptr addrspace(1) [[PRINTF_ALLOC_FN]], align 4 174631c9654SVikram // CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4 175631c9654SVikram // CHECK-NEXT: store i64 7257695813269076350, ptr addrspace(1) [[TMP20]], align 8 176631c9654SVikram // CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP20]], i32 8 177631c9654SVikram // CHECK-NEXT: call void @llvm.memcpy.p1.p0.i64(ptr addrspace(1) align 1 [[TMP21]], ptr align 1 [[TMP0]], i64 [[TMP11]], i1 false) 178631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP21]], i64 [[TMP13]] 179631c9654SVikram // CHECK-NEXT: store ptr [[TMP1]], ptr addrspace(1) [[PRINTBUFFNEXTPTR]], align 8 180631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR1:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR]], i32 8 181631c9654SVikram // CHECK-NEXT: store ptr addrspacecast (ptr addrspace(3) @_ZZ4foo2vE5shval to ptr), ptr addrspace(1) [[PRINTBUFFNEXTPTR1]], align 8 182631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR2:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR1]], i32 8 183631c9654SVikram // CHECK-NEXT: store ptr [[LCVAL_ASCAST]], ptr addrspace(1) [[PRINTBUFFNEXTPTR2]], align 8 184631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR3:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR2]], i32 8 185631c9654SVikram // CHECK-NEXT: br label [[END_BLOCK]] 186631c9654SVikram // 187631c9654SVikram // CHECK_CONSTRAINED-LABEL: define dso_local noundef i32 @_Z4foo2v 188631c9654SVikram // CHECK_CONSTRAINED-NEXT: entry: 189631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[RETVAL:%.*]] = alloca i32, align 4, addrspace(5) 190631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[LCVAL:%.*]] = alloca i32, align 4, addrspace(5) 191631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr 192631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[LCVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[LCVAL]] to ptr 193631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP0:%.*]] = load ptr, ptr addrspacecast (ptr addrspace(1) @dstr to ptr), align 8 194631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP1:%.*]] = load ptr, ptr addrspacecast (ptr addrspace(1) @dstr to ptr), align 8 195631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null 196631c9654SVikram // CHECK_CONSTRAINED-NEXT: br i1 [[TMP2]], label [[STRLEN_JOIN:%.*]], label [[STRLEN_WHILE:%.*]] 197631c9654SVikram // CHECK_CONSTRAINED: strlen.while: 198631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP3:%.*]] = phi ptr [ [[TMP0]], [[ENTRY:%.*]] ], [ [[TMP4:%.*]], [[STRLEN_WHILE]] ] 199631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP4]] = getelementptr i8, ptr [[TMP3]], i64 1 200631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP5:%.*]] = load i8, ptr [[TMP3]], align 1 201631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP6:%.*]] = icmp eq i8 [[TMP5]], 0 202631c9654SVikram // CHECK_CONSTRAINED-NEXT: br i1 [[TMP6]], label [[STRLEN_WHILE_DONE:%.*]], label [[STRLEN_WHILE]] 203631c9654SVikram // CHECK_CONSTRAINED: strlen.while.done: 204631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP0]] to i64 205631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP3]] to i64 206631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP9:%.*]] = sub i64 [[TMP8]], [[TMP7]] 207631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP10:%.*]] = add i64 [[TMP9]], 1 208631c9654SVikram // CHECK_CONSTRAINED-NEXT: br label [[STRLEN_JOIN]] 209631c9654SVikram // CHECK_CONSTRAINED: strlen.join: 210631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP11:%.*]] = phi i64 [ [[TMP10]], [[STRLEN_WHILE_DONE]] ], [ 0, [[ENTRY]] ] 211631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP12:%.*]] = add i64 [[TMP11]], 7 212631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP13:%.*]] = and i64 [[TMP12]], 4294967288 213631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP14:%.*]] = add i64 [[TMP13]], 36 214631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP15:%.*]] = trunc i64 [[TMP14]] to i32 215631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 [[TMP15]]) 216631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP16:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null 217631c9654SVikram // CHECK_CONSTRAINED-NEXT: br i1 [[TMP16]], label [[ARGPUSH_BLOCK:%.*]], label [[END_BLOCK:%.*]] 218631c9654SVikram // CHECK_CONSTRAINED: end.block: 219631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP17:%.*]] = xor i1 [[TMP16]], true 220631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTF_RESULT:%.*]] = sext i1 [[TMP17]] to i32 221631c9654SVikram // CHECK_CONSTRAINED-NEXT: ret i32 [[PRINTF_RESULT]] 222631c9654SVikram // CHECK_CONSTRAINED: argpush.block: 223631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP18:%.*]] = shl i32 [[TMP15]], 2 224631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP19:%.*]] = or i32 [[TMP18]], 2 225631c9654SVikram // CHECK_CONSTRAINED-NEXT: store i32 [[TMP19]], ptr addrspace(1) [[PRINTF_ALLOC_FN]], align 4 226631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4 227631c9654SVikram // CHECK_CONSTRAINED-NEXT: store i64 7257695813269076350, ptr addrspace(1) [[TMP20]], align 8 228631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP20]], i32 8 229631c9654SVikram // CHECK_CONSTRAINED-NEXT: call void @llvm.memcpy.p1.p0.i64(ptr addrspace(1) align 1 [[TMP21]], ptr align 1 [[TMP0]], i64 [[TMP11]], i1 false) 230631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP21]], i64 [[TMP13]] 231631c9654SVikram // CHECK_CONSTRAINED-NEXT: store ptr [[TMP1]], ptr addrspace(1) [[PRINTBUFFNEXTPTR]], align 8 232631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR1:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR]], i32 8 233631c9654SVikram // CHECK_CONSTRAINED-NEXT: store ptr addrspacecast (ptr addrspace(3) @_ZZ4foo2vE5shval to ptr), ptr addrspace(1) [[PRINTBUFFNEXTPTR1]], align 8 234631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR2:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR1]], i32 8 235631c9654SVikram // CHECK_CONSTRAINED-NEXT: store ptr [[LCVAL_ASCAST]], ptr addrspace(1) [[PRINTBUFFNEXTPTR2]], align 8 236631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR3:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR2]], i32 8 237631c9654SVikram // CHECK_CONSTRAINED-NEXT: br label [[END_BLOCK]] 238631c9654SVikram // 239631c9654SVikram __device__ int foo2() { 240631c9654SVikram __shared__ int shval; 241631c9654SVikram int lcval; 242631c9654SVikram return printf("%s %p %p %p\n", dstr, dstr, &shval, &lcval); 243631c9654SVikram } 244631c9654SVikram 245631c9654SVikram __device__ unsigned short g = 30; 246631c9654SVikram __device__ unsigned long n = 30; 247631c9654SVikram 248631c9654SVikram __device__ float f1 = 3.14f; 249631c9654SVikram __device__ double f2 = 2.71828; 250631c9654SVikram __device__ _Float16 f3 = 2.71; 251631c9654SVikram __device__ __bf16 f4 = 3.142; 252631c9654SVikram __device__ _BitInt(55) Int55 = 31; 253631c9654SVikram __device__ _BitInt(44) Int44 = 312; 254631c9654SVikram __device__ _BitInt(128) Int128 = 45637; 255631c9654SVikram 256631c9654SVikram // CHECK-LABEL: define dso_local noundef i32 @_Z4foo3v 257631c9654SVikram // CHECK-NEXT: entry: 258631c9654SVikram // CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4, addrspace(5) 259631c9654SVikram // CHECK-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr 260631c9654SVikram // CHECK-NEXT: store i32 25, ptr addrspacecast (ptr addrspace(3) @_ZZ4foo3vE1s to ptr), align 4 261631c9654SVikram // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr addrspacecast (ptr addrspace(3) @_ZZ4foo3vE1s to ptr), align 4 262631c9654SVikram // CHECK-NEXT: [[TMP1:%.*]] = load i16, ptr addrspacecast (ptr addrspace(1) @g to ptr), align 2 263631c9654SVikram // CHECK-NEXT: [[CONV:%.*]] = zext i16 [[TMP1]] to i32 264631c9654SVikram // CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr addrspacecast (ptr addrspace(1) @n to ptr), align 8 265631c9654SVikram // CHECK-NEXT: [[TMP3:%.*]] = load float, ptr addrspacecast (ptr addrspace(1) @f1 to ptr), align 4 266*ecbe4d1eSJohn Brawn // CHECK-NEXT: [[CONV1:%.*]] = fpext contract float [[TMP3]] to double 267631c9654SVikram // CHECK-NEXT: [[TMP4:%.*]] = load double, ptr addrspacecast (ptr addrspace(1) @f2 to ptr), align 8 268631c9654SVikram // CHECK-NEXT: [[TMP5:%.*]] = load half, ptr addrspacecast (ptr addrspace(1) @f3 to ptr), align 2 269631c9654SVikram // CHECK-NEXT: [[TMP6:%.*]] = load bfloat, ptr addrspacecast (ptr addrspace(1) @f4 to ptr), align 2 2709ad72df5SMariya Podchishchaeva // CHECK-NEXT: [[TMP7:%.*]] = load i64, ptr addrspacecast (ptr addrspace(1) @Int55 to ptr), align 8 2719ad72df5SMariya Podchishchaeva // CHECK-NEXT: [[LOADEDV:%.*]] = trunc i64 [[TMP7]] to i55 2729ad72df5SMariya Podchishchaeva // CHECK-NEXT: [[TMP8:%.*]] = load i64, ptr addrspacecast (ptr addrspace(1) @Int44 to ptr), align 8 2739ad72df5SMariya Podchishchaeva // CHECK-NEXT: [[LOADEDV2:%.*]] = trunc i64 [[TMP8]] to i44 274631c9654SVikram // CHECK-NEXT: [[TMP9:%.*]] = load i128, ptr addrspacecast (ptr addrspace(1) @Int128 to ptr), align 8 275631c9654SVikram // CHECK-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 108) 276631c9654SVikram // CHECK-NEXT: [[TMP10:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null 277631c9654SVikram // CHECK-NEXT: br i1 [[TMP10]], label [[ARGPUSH_BLOCK:%.*]], label [[END_BLOCK:%.*]] 278631c9654SVikram // CHECK: end.block: 279631c9654SVikram // CHECK-NEXT: [[TMP11:%.*]] = xor i1 [[TMP10]], true 280631c9654SVikram // CHECK-NEXT: [[PRINTF_RESULT:%.*]] = sext i1 [[TMP11]] to i32 281631c9654SVikram // CHECK-NEXT: ret i32 [[PRINTF_RESULT]] 282631c9654SVikram // CHECK: argpush.block: 283631c9654SVikram // CHECK-NEXT: store i32 434, ptr addrspace(1) [[PRINTF_ALLOC_FN]], align 4 284631c9654SVikram // CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4 285631c9654SVikram // CHECK-NEXT: store i64 7271852820361268873, ptr addrspace(1) [[TMP12]], align 8 286631c9654SVikram // CHECK-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP12]], i32 8 287631c9654SVikram // CHECK-NEXT: [[TMP14:%.*]] = zext i32 [[TMP0]] to i64 288631c9654SVikram // CHECK-NEXT: store i64 [[TMP14]], ptr addrspace(1) [[TMP13]], align 8 289631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP13]], i32 8 290631c9654SVikram // CHECK-NEXT: store ptr addrspacecast (ptr addrspace(3) @_ZZ4foo3vE1s to ptr), ptr addrspace(1) [[PRINTBUFFNEXTPTR]], align 8 2919ad72df5SMariya Podchishchaeva // CHECK-NEXT: [[PRINTBUFFNEXTPTR3:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR]], i32 8 292631c9654SVikram // CHECK-NEXT: [[TMP15:%.*]] = zext i32 [[CONV]] to i64 2939ad72df5SMariya Podchishchaeva // CHECK-NEXT: store i64 [[TMP15]], ptr addrspace(1) [[PRINTBUFFNEXTPTR3]], align 8 294631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR4:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR3]], i32 8 2959ad72df5SMariya Podchishchaeva // CHECK-NEXT: store i64 [[TMP2]], ptr addrspace(1) [[PRINTBUFFNEXTPTR4]], align 8 296631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR5:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR4]], i32 8 2979ad72df5SMariya Podchishchaeva // CHECK-NEXT: store double [[CONV1]], ptr addrspace(1) [[PRINTBUFFNEXTPTR5]], align 8 298631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR6:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR5]], i32 8 2999ad72df5SMariya Podchishchaeva // CHECK-NEXT: store double [[TMP4]], ptr addrspace(1) [[PRINTBUFFNEXTPTR6]], align 8 300631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR7:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR6]], i32 8 3019ad72df5SMariya Podchishchaeva // CHECK-NEXT: [[TMP16:%.*]] = fpext half [[TMP5]] to double 3029ad72df5SMariya Podchishchaeva // CHECK-NEXT: store double [[TMP16]], ptr addrspace(1) [[PRINTBUFFNEXTPTR7]], align 8 303631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR8:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR7]], i32 8 3049ad72df5SMariya Podchishchaeva // CHECK-NEXT: [[TMP17:%.*]] = fpext bfloat [[TMP6]] to double 3059ad72df5SMariya Podchishchaeva // CHECK-NEXT: store double [[TMP17]], ptr addrspace(1) [[PRINTBUFFNEXTPTR8]], align 8 306631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR9:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR8]], i32 8 3079ad72df5SMariya Podchishchaeva // CHECK-NEXT: [[TMP18:%.*]] = zext i55 [[LOADEDV]] to i64 3089ad72df5SMariya Podchishchaeva // CHECK-NEXT: store i64 [[TMP18]], ptr addrspace(1) [[PRINTBUFFNEXTPTR9]], align 8 309631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR10:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR9]], i32 8 3109ad72df5SMariya Podchishchaeva // CHECK-NEXT: [[TMP19:%.*]] = zext i44 [[LOADEDV2]] to i64 3119ad72df5SMariya Podchishchaeva // CHECK-NEXT: store i64 [[TMP19]], ptr addrspace(1) [[PRINTBUFFNEXTPTR10]], align 8 3129ad72df5SMariya Podchishchaeva // CHECK-NEXT: [[PRINTBUFFNEXTPTR11:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR10]], i32 8 3139ad72df5SMariya Podchishchaeva // CHECK-NEXT: store i128 [[TMP9]], ptr addrspace(1) [[PRINTBUFFNEXTPTR11]], align 8 3149ad72df5SMariya Podchishchaeva // CHECK-NEXT: [[PRINTBUFFNEXTPTR12:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR11]], i32 16 315631c9654SVikram // CHECK-NEXT: br label [[END_BLOCK]] 316631c9654SVikram // 317631c9654SVikram // CHECK_CONSTRAINED-LABEL: define dso_local noundef i32 @_Z4foo3v 318631c9654SVikram // CHECK_CONSTRAINED-NEXT: entry: 319631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[RETVAL:%.*]] = alloca i32, align 4, addrspace(5) 320631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr 321631c9654SVikram // CHECK_CONSTRAINED-NEXT: store i32 25, ptr addrspacecast (ptr addrspace(3) @_ZZ4foo3vE1s to ptr), align 4 322631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP0:%.*]] = load i32, ptr addrspacecast (ptr addrspace(3) @_ZZ4foo3vE1s to ptr), align 4 323631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP1:%.*]] = load i16, ptr addrspacecast (ptr addrspace(1) @g to ptr), align 2 324631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[CONV:%.*]] = zext i16 [[TMP1]] to i32 325631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP2:%.*]] = load i64, ptr addrspacecast (ptr addrspace(1) @n to ptr), align 8 326631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP3:%.*]] = load float, ptr addrspacecast (ptr addrspace(1) @f1 to ptr), align 4 327*ecbe4d1eSJohn Brawn // CHECK_CONSTRAINED-NEXT: [[CONV1:%.*]] = fpext contract float [[TMP3]] to double 328631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP4:%.*]] = load double, ptr addrspacecast (ptr addrspace(1) @f2 to ptr), align 8 329631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP5:%.*]] = load half, ptr addrspacecast (ptr addrspace(1) @f3 to ptr), align 2 330631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP6:%.*]] = load bfloat, ptr addrspacecast (ptr addrspace(1) @f4 to ptr), align 2 3319ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: [[TMP7:%.*]] = load i64, ptr addrspacecast (ptr addrspace(1) @Int55 to ptr), align 8 3329ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: [[LOADEDV:%.*]] = trunc i64 [[TMP7]] to i55 3339ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: [[TMP8:%.*]] = load i64, ptr addrspacecast (ptr addrspace(1) @Int44 to ptr), align 8 3349ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: [[LOADEDV2:%.*]] = trunc i64 [[TMP8]] to i44 335631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP9:%.*]] = load i128, ptr addrspacecast (ptr addrspace(1) @Int128 to ptr), align 8 336631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 108) 337631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP10:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null 338631c9654SVikram // CHECK_CONSTRAINED-NEXT: br i1 [[TMP10]], label [[ARGPUSH_BLOCK:%.*]], label [[END_BLOCK:%.*]] 339631c9654SVikram // CHECK_CONSTRAINED: end.block: 340631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP11:%.*]] = xor i1 [[TMP10]], true 341631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTF_RESULT:%.*]] = sext i1 [[TMP11]] to i32 342631c9654SVikram // CHECK_CONSTRAINED-NEXT: ret i32 [[PRINTF_RESULT]] 343631c9654SVikram // CHECK_CONSTRAINED: argpush.block: 344631c9654SVikram // CHECK_CONSTRAINED-NEXT: store i32 434, ptr addrspace(1) [[PRINTF_ALLOC_FN]], align 4 345631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP12:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4 346631c9654SVikram // CHECK_CONSTRAINED-NEXT: store i64 7271852820361268873, ptr addrspace(1) [[TMP12]], align 8 347631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP13:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP12]], i32 8 348631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP14:%.*]] = zext i32 [[TMP0]] to i64 349631c9654SVikram // CHECK_CONSTRAINED-NEXT: store i64 [[TMP14]], ptr addrspace(1) [[TMP13]], align 8 350631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP13]], i32 8 351631c9654SVikram // CHECK_CONSTRAINED-NEXT: store ptr addrspacecast (ptr addrspace(3) @_ZZ4foo3vE1s to ptr), ptr addrspace(1) [[PRINTBUFFNEXTPTR]], align 8 3529ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR3:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR]], i32 8 353631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP15:%.*]] = zext i32 [[CONV]] to i64 3549ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: store i64 [[TMP15]], ptr addrspace(1) [[PRINTBUFFNEXTPTR3]], align 8 355631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR4:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR3]], i32 8 3569ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: store i64 [[TMP2]], ptr addrspace(1) [[PRINTBUFFNEXTPTR4]], align 8 357631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR5:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR4]], i32 8 3589ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: store double [[CONV1]], ptr addrspace(1) [[PRINTBUFFNEXTPTR5]], align 8 359631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR6:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR5]], i32 8 3609ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: store double [[TMP4]], ptr addrspace(1) [[PRINTBUFFNEXTPTR6]], align 8 361631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR7:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR6]], i32 8 3629ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: [[TMP16:%.*]] = fpext half [[TMP5]] to double 3639ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: store double [[TMP16]], ptr addrspace(1) [[PRINTBUFFNEXTPTR7]], align 8 364631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR8:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR7]], i32 8 3659ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: [[TMP17:%.*]] = fpext bfloat [[TMP6]] to double 3669ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: store double [[TMP17]], ptr addrspace(1) [[PRINTBUFFNEXTPTR8]], align 8 367631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR9:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR8]], i32 8 3689ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: [[TMP18:%.*]] = zext i55 [[LOADEDV]] to i64 3699ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: store i64 [[TMP18]], ptr addrspace(1) [[PRINTBUFFNEXTPTR9]], align 8 370631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR10:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR9]], i32 8 3719ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: [[TMP19:%.*]] = zext i44 [[LOADEDV2]] to i64 3729ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: store i64 [[TMP19]], ptr addrspace(1) [[PRINTBUFFNEXTPTR10]], align 8 3739ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR11:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR10]], i32 8 3749ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: store i128 [[TMP9]], ptr addrspace(1) [[PRINTBUFFNEXTPTR11]], align 8 3759ad72df5SMariya Podchishchaeva // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR12:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR11]], i32 16 376631c9654SVikram // CHECK_CONSTRAINED-NEXT: br label [[END_BLOCK]] 377631c9654SVikram // 378631c9654SVikram __device__ int foo3() { 379631c9654SVikram __shared__ int s; 380631c9654SVikram s = 25; 381631c9654SVikram return printf("Random values: %d,%p,%hd,%ld,%f,%f,%f,%f,%d,%d,%d\n",s, &s, g, n, f1, f2, f3, f4, Int55, Int44, Int128); 382631c9654SVikram } 383631c9654SVikram 384631c9654SVikram //A non trivial case, 385631c9654SVikram // CHECK-LABEL: define dso_local noundef i32 @_Z4foo4v 386631c9654SVikram // CHECK-NEXT: entry: 387631c9654SVikram // CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4, addrspace(5) 388631c9654SVikram // CHECK-NEXT: [[S:%.*]] = alloca ptr, align 8, addrspace(5) 389631c9654SVikram // CHECK-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr 390631c9654SVikram // CHECK-NEXT: [[S_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[S]] to ptr 391631c9654SVikram // CHECK-NEXT: store ptr addrspacecast (ptr addrspace(4) @.str.4 to ptr), ptr [[S_ASCAST]], align 8 392631c9654SVikram // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ASCAST]], align 8 393631c9654SVikram // CHECK-NEXT: [[TMP1:%.*]] = icmp eq ptr [[TMP0]], null 394631c9654SVikram // CHECK-NEXT: br i1 [[TMP1]], label [[STRLEN_JOIN:%.*]], label [[STRLEN_WHILE:%.*]] 395631c9654SVikram // CHECK: strlen.while: 396631c9654SVikram // CHECK-NEXT: [[TMP2:%.*]] = phi ptr [ [[TMP0]], [[ENTRY:%.*]] ], [ [[TMP3:%.*]], [[STRLEN_WHILE]] ] 397631c9654SVikram // CHECK-NEXT: [[TMP3]] = getelementptr i8, ptr [[TMP2]], i64 1 398631c9654SVikram // CHECK-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP2]], align 1 399631c9654SVikram // CHECK-NEXT: [[TMP5:%.*]] = icmp eq i8 [[TMP4]], 0 400631c9654SVikram // CHECK-NEXT: br i1 [[TMP5]], label [[STRLEN_WHILE_DONE:%.*]], label [[STRLEN_WHILE]] 401631c9654SVikram // CHECK: strlen.while.done: 402631c9654SVikram // CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP0]] to i64 403631c9654SVikram // CHECK-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP2]] to i64 404631c9654SVikram // CHECK-NEXT: [[TMP8:%.*]] = sub i64 [[TMP7]], [[TMP6]] 405631c9654SVikram // CHECK-NEXT: [[TMP9:%.*]] = add i64 [[TMP8]], 1 406631c9654SVikram // CHECK-NEXT: br label [[STRLEN_JOIN]] 407631c9654SVikram // CHECK: strlen.join: 408631c9654SVikram // CHECK-NEXT: [[TMP10:%.*]] = phi i64 [ [[TMP9]], [[STRLEN_WHILE_DONE]] ], [ 0, [[ENTRY]] ] 409631c9654SVikram // CHECK-NEXT: [[TMP11:%.*]] = add i64 [[TMP10]], 7 410631c9654SVikram // CHECK-NEXT: [[TMP12:%.*]] = and i64 [[TMP11]], 4294967288 411631c9654SVikram // CHECK-NEXT: [[TMP13:%.*]] = add i64 [[TMP12]], 12 412631c9654SVikram // CHECK-NEXT: [[TMP14:%.*]] = trunc i64 [[TMP13]] to i32 413631c9654SVikram // CHECK-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 [[TMP14]]) 414631c9654SVikram // CHECK-NEXT: [[TMP15:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null 415631c9654SVikram // CHECK-NEXT: br i1 [[TMP15]], label [[ARGPUSH_BLOCK:%.*]], label [[END_BLOCK:%.*]] 416631c9654SVikram // CHECK: end.block: 417631c9654SVikram // CHECK-NEXT: [[TMP16:%.*]] = xor i1 [[TMP15]], true 418631c9654SVikram // CHECK-NEXT: [[PRINTF_RESULT:%.*]] = sext i1 [[TMP16]] to i32 419631c9654SVikram // CHECK-NEXT: ret i32 [[PRINTF_RESULT]] 420631c9654SVikram // CHECK: argpush.block: 421631c9654SVikram // CHECK-NEXT: [[TMP17:%.*]] = shl i32 [[TMP14]], 2 422631c9654SVikram // CHECK-NEXT: store i32 [[TMP17]], ptr addrspace(1) [[PRINTF_ALLOC_FN]], align 4 423631c9654SVikram // CHECK-NEXT: [[TMP18:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4 424631c9654SVikram // CHECK-NEXT: call void @llvm.memcpy.p1.p0.i64(ptr addrspace(1) align 1 [[TMP18]], ptr align 1 [[TMP0]], i64 [[TMP10]], i1 false) 425631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP18]], i64 [[TMP12]] 426631c9654SVikram // CHECK-NEXT: store i64 10, ptr addrspace(1) [[PRINTBUFFNEXTPTR]], align 8 427631c9654SVikram // CHECK-NEXT: [[PRINTBUFFNEXTPTR1:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR]], i32 8 428631c9654SVikram // CHECK-NEXT: br label [[END_BLOCK]] 429631c9654SVikram // 430631c9654SVikram // CHECK_CONSTRAINED-LABEL: define dso_local noundef i32 @_Z4foo4v 431631c9654SVikram // CHECK_CONSTRAINED-NEXT: entry: 432631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[RETVAL:%.*]] = alloca i32, align 4, addrspace(5) 433631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[S:%.*]] = alloca ptr, align 8, addrspace(5) 434631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[RETVAL_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[RETVAL]] to ptr 435631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[S_ASCAST:%.*]] = addrspacecast ptr addrspace(5) [[S]] to ptr 436631c9654SVikram // CHECK_CONSTRAINED-NEXT: store ptr addrspacecast (ptr addrspace(4) @.str.4 to ptr), ptr [[S_ASCAST]], align 8 437631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP0:%.*]] = load ptr, ptr [[S_ASCAST]], align 8 438631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP1:%.*]] = icmp eq ptr [[TMP0]], null 439631c9654SVikram // CHECK_CONSTRAINED-NEXT: br i1 [[TMP1]], label [[STRLEN_JOIN:%.*]], label [[STRLEN_WHILE:%.*]] 440631c9654SVikram // CHECK_CONSTRAINED: strlen.while: 441631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP2:%.*]] = phi ptr [ [[TMP0]], [[ENTRY:%.*]] ], [ [[TMP3:%.*]], [[STRLEN_WHILE]] ] 442631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP3]] = getelementptr i8, ptr [[TMP2]], i64 1 443631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP2]], align 1 444631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP5:%.*]] = icmp eq i8 [[TMP4]], 0 445631c9654SVikram // CHECK_CONSTRAINED-NEXT: br i1 [[TMP5]], label [[STRLEN_WHILE_DONE:%.*]], label [[STRLEN_WHILE]] 446631c9654SVikram // CHECK_CONSTRAINED: strlen.while.done: 447631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP0]] to i64 448631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP2]] to i64 449631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP8:%.*]] = sub i64 [[TMP7]], [[TMP6]] 450631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP9:%.*]] = add i64 [[TMP8]], 1 451631c9654SVikram // CHECK_CONSTRAINED-NEXT: br label [[STRLEN_JOIN]] 452631c9654SVikram // CHECK_CONSTRAINED: strlen.join: 453631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP10:%.*]] = phi i64 [ [[TMP9]], [[STRLEN_WHILE_DONE]] ], [ 0, [[ENTRY]] ] 454631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP11:%.*]] = add i64 [[TMP10]], 7 455631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP12:%.*]] = and i64 [[TMP11]], 4294967288 456631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP13:%.*]] = add i64 [[TMP12]], 12 457631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP14:%.*]] = trunc i64 [[TMP13]] to i32 458631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTF_ALLOC_FN:%.*]] = call ptr addrspace(1) @__printf_alloc(i32 [[TMP14]]) 459631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP15:%.*]] = icmp ne ptr addrspace(1) [[PRINTF_ALLOC_FN]], null 460631c9654SVikram // CHECK_CONSTRAINED-NEXT: br i1 [[TMP15]], label [[ARGPUSH_BLOCK:%.*]], label [[END_BLOCK:%.*]] 461631c9654SVikram // CHECK_CONSTRAINED: end.block: 462631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP16:%.*]] = xor i1 [[TMP15]], true 463631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTF_RESULT:%.*]] = sext i1 [[TMP16]] to i32 464631c9654SVikram // CHECK_CONSTRAINED-NEXT: ret i32 [[PRINTF_RESULT]] 465631c9654SVikram // CHECK_CONSTRAINED: argpush.block: 466631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP17:%.*]] = shl i32 [[TMP14]], 2 467631c9654SVikram // CHECK_CONSTRAINED-NEXT: store i32 [[TMP17]], ptr addrspace(1) [[PRINTF_ALLOC_FN]], align 4 468631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[TMP18:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTF_ALLOC_FN]], i32 4 469631c9654SVikram // CHECK_CONSTRAINED-NEXT: call void @llvm.memcpy.p1.p0.i64(ptr addrspace(1) align 1 [[TMP18]], ptr align 1 [[TMP0]], i64 [[TMP10]], i1 false) 470631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP18]], i64 [[TMP12]] 471631c9654SVikram // CHECK_CONSTRAINED-NEXT: store i64 10, ptr addrspace(1) [[PRINTBUFFNEXTPTR]], align 8 472631c9654SVikram // CHECK_CONSTRAINED-NEXT: [[PRINTBUFFNEXTPTR1:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[PRINTBUFFNEXTPTR]], i32 8 473631c9654SVikram // CHECK_CONSTRAINED-NEXT: br label [[END_BLOCK]] 474631c9654SVikram // 475631c9654SVikram __device__ int foo4() { 476631c9654SVikram const char* s = "format str%d"; 477631c9654SVikram return printf(s, 10); 478631c9654SVikram } 479