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