brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.5 KiB · c85080f Raw
119 lines · plain
1; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_20 | FileCheck %s --check-prefixes=CHECK,NOALIGN42; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_20 -nvptx-force-min-byval-param-align | FileCheck %s --check-prefixes=CHECK,ALIGN43; RUN: %if ptxas %{ llc < %s -mtriple=nvptx64 -mcpu=sm_20 | %ptxas-verify %}4; RUN: %if ptxas %{ llc < %s -mtriple=nvptx64 -mcpu=sm_20 -nvptx-force-min-byval-param-align | %ptxas-verify %}5 6;;; Need 4-byte alignment on ptr passed byval7define ptx_device void @t1(ptr byval(float) %x) {8; CHECK: .func t19; CHECK: .param .align 4 .b8 t1_param_0[4]10  ret void11}12 13 14;;; Need 8-byte alignment on ptr passed byval15define ptx_device void @t2(ptr byval(double) %x) {16; CHECK: .func t217; CHECK: .param .align 8 .b8 t2_param_0[8]18  ret void19}20 21 22;;; Need 4-byte alignment on float2* passed byval23%struct.float2 = type { float, float }24define ptx_device void @t3(ptr byval(%struct.float2) %x) {25; CHECK: .func t326; CHECK: .param .align 4 .b8 t3_param_0[8]27  ret void28}29 30define ptx_device void @t4(ptr byval(i8) %x) {31; CHECK: .func t432; NOALIGN4: .param .align 1 .b8 t4_param_0[1]33; ALIGN4: .param .align 4 .b8 t4_param_0[1]34  ret void35}36 37;;; Make sure we adjust alignment at the call site as well.38define ptx_device void @t5(ptr align 2 byval(i8) %x) {39; CHECK: .func t540; NOALIGN4: .param .align 2 .b8 t5_param_0[1]41; ALIGN4: .param .align 4 .b8 t5_param_0[1]42; CHECK: {43; NOALIGN4: .param .align 1 .b8 param0[1];44; ALIGN4:   .param .align 4 .b8 param0[1];45; CHECK: call.uni46  call void @t4(ptr byval(i8) %x)47  ret void48}49 50;;; Make sure we adjust alignment for a function prototype51;;; in case of an inderect call.52 53declare ptr @getfp(i32 %n)54%struct.half2 = type { half, half }55define ptx_device void @t6() {56; CHECK: .func t657  %fp = call ptr @getfp(i32 0)58; CHECK: prototype_2 : .callprototype ()_ (.param .align 8 .b8 _[8]);59  call void %fp(ptr byval(double) null);60 61  %fp2 = call ptr @getfp(i32 1)62; NOALIGN4: prototype_4 : .callprototype ()_ (.param .align 2 .b8 _[4]);63; ALIGN4: prototype_4 : .callprototype ()_ (.param .align 4 .b8 _[4]);64  call void %fp(ptr byval(%struct.half2) null);65 66  %fp3 = call ptr @getfp(i32 2)67; NOALIGN4: prototype_6 : .callprototype ()_ (.param .align 1 .b8 _[1]);68; ALIGN4: prototype_6 : .callprototype ()_ (.param .align 4 .b8 _[1]);69  call void %fp(ptr byval(i8) null);70  ret void71}72 73; CHECK-LABEL: .func check_ptr_align1(74; CHECK: 	ld.param.b64 	%rd1, [check_ptr_align1_param_0];75; CHECK-NOT: 	ld.param.b876; CHECK: 	st.b8 	[%rd1+3], 0;77; CHECK: 	st.b8 	[%rd1+2], 0;78; CHECK: 	st.b8 	[%rd1+1], 0;79; CHECK: 	st.b8 	[%rd1], 1;80; CHECK: 	ret;81define void @check_ptr_align1(ptr align 1 %_arg_ptr) {82entry:83  store i32 1, ptr %_arg_ptr, align 184  ret void85}86 87; CHECK-LABEL: .func check_ptr_align2(88; CHECK: 	ld.param.b64 	%rd1, [check_ptr_align2_param_0];89; CHECK-NOT: 	ld.param.b1690; CHECK: 	st.b16 	[%rd1+2], 0;91; CHECK: 	st.b16 	[%rd1], 2;92; CHECK: 	ret;93define void @check_ptr_align2(ptr align 2 %_arg_ptr) {94entry:95  store i32 2, ptr %_arg_ptr, align 296  ret void97}98 99; CHECK-LABEL: .func check_ptr_align4(100; CHECK: 	ld.param.b64 	%rd1, [check_ptr_align4_param_0];101; CHECK-NOT: 	ld.param.b32102; CHECK: 	st.b32 	[%rd1], 4;103; CHECK: 	ret;104define void @check_ptr_align4(ptr align 4 %_arg_ptr) {105entry:106  store i32 4, ptr %_arg_ptr, align 4107  ret void108}109 110; CHECK-LABEL: .func check_ptr_align8(111; CHECK: 	ld.param.b64 	%rd1, [check_ptr_align8_param_0];112; CHECK: 	st.b32 	[%rd1], 8;113; CHECK: 	ret;114define void @check_ptr_align8(ptr align 8 %_arg_ptr) {115entry:116  store i32 8, ptr %_arg_ptr, align 8117  ret void118}119