; RUN: split-file %s %t ; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/invalid-first-arg-addrspace.ll | FileCheck %t/invalid-first-arg-addrspace.ll ; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/invalid-first-arg-type.ll | FileCheck %t/invalid-first-arg-type.ll ; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/invalid-return.ll | FileCheck %t/invalid-return.ll ; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/non-variadic.ll | FileCheck %t/non-variadic.ll ; RUN: opt -mtriple=amdgcn-- -passes=amdgpu-printf-runtime-binding -mcpu=fiji -S < %t/too-many-args.ll | FileCheck %t/too-many-args.ll ;--- invalid-first-arg-addrspace.ll define amdgpu_kernel void @test_kernel(i32 %n) { ; CHECK-LABEL: define amdgpu_kernel void @test_kernel( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[MEM:%.*]] = alloca i32, align 4, addrspace(5) ; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5) ; CHECK-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) [[STR]], ptr addrspace(5) [[STR]], i32 [[N]]) ; CHECK-NEXT: store i32 [[CALL1]], ptr addrspace(5) [[MEM]], align 4 ; CHECK-NEXT: ret void ; entry: %mem = alloca i32, align 4, addrspace(5) %str = alloca [9 x i8], align 1, addrspace(5) %call1 = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) %str, ptr addrspace(5) %str, i32 %n) store i32 %call1, ptr addrspace(5) %mem, align 4 ret void } define i32 @test_func(i32 %n) { ; CHECK-LABEL: define i32 @test_func( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5) ; CHECK-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) [[STR]], ptr addrspace(5) [[STR]], i32 [[N]]) ; CHECK-NEXT: ret i32 [[CALL1]] ; entry: %str = alloca [9 x i8], align 1, addrspace(5) %call1 = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) %str, ptr addrspace(5) %str, i32 %n) ret i32 %call1 } define i32 @test_null_argument(i32 %n) { ; CHECK-LABEL: define i32 @test_null_argument( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5) ; CHECK-NEXT: [[CALL1:%.*]] = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) null, ptr addrspace(5) [[STR]], i32 [[N]]) ; CHECK-NEXT: ret i32 [[CALL1]] ; %str = alloca [9 x i8], align 1, addrspace(5) %call1 = call i32 (ptr addrspace(5), ...) @printf(ptr addrspace(5) zeroinitializer, ptr addrspace(5) %str, i32 %n) ret i32 %call1 } declare i32 @printf(ptr addrspace(5), ...) ;--- invalid-first-arg-type.ll define amdgpu_kernel void @test_kernel(i32 %n) { ; CHECK-LABEL: define amdgpu_kernel void @test_kernel( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[MEM:%.*]] = alloca float, align 4, addrspace(5) ; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5) ; CHECK-NEXT: [[CALL1:%.*]] = call float (i32, ...) @printf(i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]]) ; CHECK-NEXT: store float [[CALL1]], ptr addrspace(5) [[MEM]], align 4 ; CHECK-NEXT: ret void ; entry: %mem = alloca float, align 4, addrspace(5) %str = alloca [9 x i8], align 1, addrspace(5) %call1 = call float (i32, ...) @printf(i32 %n, ptr addrspace(5) %str, i32 %n) store float %call1, ptr addrspace(5) %mem, align 4 ret void } define float @test_func(i32 %n) { ; CHECK-LABEL: define float @test_func( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5) ; CHECK-NEXT: [[CALL1:%.*]] = call float (i32, ...) @printf(i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]]) ; CHECK-NEXT: ret float [[CALL1]] ; entry: %str = alloca [9 x i8], align 1, addrspace(5) %call1 = call float (i32, ...) @printf(i32 %n, ptr addrspace(5) %str, i32 %n) ret float %call1 } declare float @printf(i32, ...) ;--- invalid-return.ll @.str = private unnamed_addr addrspace(4) constant [6 x i8] c"%s:%d\00", align 1 define amdgpu_kernel void @test_kernel(i32 %n) { ; CHECK-LABEL: define amdgpu_kernel void @test_kernel( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[MEM:%.*]] = alloca float, align 4, addrspace(5) ; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5) ; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) [[STR]], i32 [[N]]) ; CHECK-NEXT: store float [[CALL1]], ptr addrspace(5) [[MEM]], align 4 ; CHECK-NEXT: ret void ; entry: %mem = alloca float, align 4, addrspace(5) %str = alloca [9 x i8], align 1, addrspace(5) %call1 = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) %str, i32 %n) store float %call1, ptr addrspace(5) %mem, align 4 ret void } define float @test_func(i32 %n) { ; CHECK-LABEL: define float @test_func( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5) ; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) [[STR]], i32 [[N]]) ; CHECK-NEXT: ret float [[CALL1]] ; entry: %str = alloca [9 x i8], align 1, addrspace(5) %call1 = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) @.str, ptr addrspace(5) %str, i32 %n) ret float %call1 } define float @test_null_argument(i32 %n) { ; CHECK-LABEL: define float @test_null_argument( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5) ; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) null, ptr addrspace(5) [[STR]], i32 [[N]]) ; CHECK-NEXT: ret float [[CALL1]] ; %str = alloca [9 x i8], align 1, addrspace(5) %call1 = call float (ptr addrspace(4), ...) @printf(ptr addrspace(4) null, ptr addrspace(5) %str, i32 %n) ret float %call1 } declare float @printf(ptr addrspace(4), ...) ;--- non-variadic.ll @.str = private unnamed_addr addrspace(4) constant [6 x i8] c"%s:%d\00", align 1 define amdgpu_kernel void @test_kernel(i32 %n) { ; CHECK-LABEL: define amdgpu_kernel void @test_kernel( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[MEM:%.*]] = alloca i32, align 4, addrspace(5) ; CHECK-NEXT: [[CALL1:%.*]] = call i32 @printf(ptr addrspace(4) @.str, i32 [[N]]) ; CHECK-NEXT: store i32 [[CALL1]], ptr addrspace(5) [[MEM]], align 4 ; CHECK-NEXT: ret void ; entry: %mem = alloca i32, align 4, addrspace(5) %call1 = call i32 (ptr addrspace(4), i32) @printf(ptr addrspace(4) @.str, i32 %n) store i32 %call1, ptr addrspace(5) %mem, align 4 ret void } define i32 @test_func(i32 %n) { ; CHECK-LABEL: define i32 @test_func( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[CALL1:%.*]] = call i32 @printf(ptr addrspace(4) @.str, i32 [[N]]) ; CHECK-NEXT: ret i32 [[CALL1]] ; entry: %call1 = call i32 (ptr addrspace(4), i32) @printf(ptr addrspace(4) @.str, i32 %n) ret i32 %call1 } define i32 @test_null_argument(i32 %n) { ; CHECK-LABEL: define i32 @test_null_argument( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[CALL1:%.*]] = call i32 @printf(ptr addrspace(4) null, i32 [[N]]) ; CHECK-NEXT: ret i32 [[CALL1]] ; %call1 = call i32 (ptr addrspace(4), i32) @printf(ptr addrspace(4) null, i32 %n) ret i32 %call1 } declare i32 @printf(ptr addrspace(4), i32) ;--- too-many-args.ll @.str = private unnamed_addr addrspace(4) constant [6 x i8] c"%s:%d\00", align 1 define amdgpu_kernel void @test_kernel(i32 %n) { ; CHECK-LABEL: define amdgpu_kernel void @test_kernel( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[MEM:%.*]] = alloca float, align 4, addrspace(5) ; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5) ; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]]) ; CHECK-NEXT: store float [[CALL1]], ptr addrspace(5) [[MEM]], align 4 ; CHECK-NEXT: ret void ; entry: %mem = alloca float, align 4, addrspace(5) %str = alloca [9 x i8], align 1, addrspace(5) %call1 = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 %n, ptr addrspace(5) %str, i32 %n) store float %call1, ptr addrspace(5) %mem, align 4 ret void } define float @test_func(i32 %n) { ; CHECK-LABEL: define float @test_func( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5) ; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]]) ; CHECK-NEXT: ret float [[CALL1]] ; entry: %str = alloca [9 x i8], align 1, addrspace(5) %call1 = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) @.str, i32 %n, ptr addrspace(5) %str, i32 %n) ret float %call1 } define float @test_null_argument(i32 %n) { ; CHECK-LABEL: define float @test_null_argument( ; CHECK-SAME: i32 [[N:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[STR:%.*]] = alloca [9 x i8], align 1, addrspace(5) ; CHECK-NEXT: [[CALL1:%.*]] = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) null, i32 [[N]], ptr addrspace(5) [[STR]], i32 [[N]]) ; CHECK-NEXT: ret float [[CALL1]] ; %str = alloca [9 x i8], align 1, addrspace(5) %call1 = call float (ptr addrspace(4), i32, ...) @printf(ptr addrspace(4) null, i32 %n, ptr addrspace(5) %str, i32 %n) ret float %call1 } declare float @printf(ptr addrspace(4), i32, ...)