brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.4 KiB · fa4d699 Raw
152 lines · plain
1; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN %s2; RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1010 < %s | FileCheck -check-prefixes=GCN %s3 4; Test that image.sample LOD(_L), Level 0(_LZ), Derivative(_D) instructions are sunk across the branch and not left in the first block. Since the kill may terminate the shader there might be no need for sampling the image.5 6; GCN-LABEL: {{^}}sinking_img_sample:7; GCN-NOT: image_sample_l v8; GCN-NOT: image_sample_lz v9; GCN-NOT: image_sample_c_lz v10; GCN-NOT: image_sample_c_l v11; GCN-NOT: image_sample_d v12; GCN-NOT: image_sample_c_d v13; GCN-NOT: image_sample_d_cl v14; GCN-NOT: image_sample_c_d_cl v15; GCN: branch16; GCN: image_sample_l v17; GCN: image_sample_lz v18; GCN: image_sample_c_lz v19; GCN: image_sample_c_l v20; GCN: image_sample_d v21; GCN: image_sample_c_d v22; GCN: image_sample_d_cl v23; GCN: image_sample_c_d_cl v24; GCN: exp null25 26define amdgpu_ps float @sinking_img_sample(i1 %cond) {27main_body:28  %i1 = call <3 x float> @llvm.amdgcn.image.sample.l.2d.v3f32.f32(i32 7, float poison, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)29  %i2 = call <3 x float> @llvm.amdgcn.image.sample.lz.2d.v3f32.f32(i32 7, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)30  %i3 = call <3 x float> @llvm.amdgcn.image.sample.c.lz.2d.v3f32.f32(i32 7, float poison, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)31  %i4 = call <3 x float> @llvm.amdgcn.image.sample.c.l.2d.v3f32.f32(i32 7, float poison, float poison, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)32  %i5 = call <3 x float> @llvm.amdgcn.image.sample.d.2d.v3f32.f32(i32 7, float poison, float poison, float poison, float poison, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)33  %i6 = call <3 x float> @llvm.amdgcn.image.sample.c.d.2d.v3f32.f32(i32 7, float poison, float poison, float poison, float poison, float poison, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)34  %i7 = call <3 x float> @llvm.amdgcn.image.sample.d.cl.2d.v3f32.f32(i32 7, float poison, float poison, float poison, float poison, float poison, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)35  %i8 = call <3 x float> @llvm.amdgcn.image.sample.c.d.cl.2d.v3f32.f32(i32 7, float poison, float poison, float poison, float poison, float poison, float poison, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)36  br i1 %cond, label %endif1, label %if137 38if1:                                              ; preds = %main_body39  call void @llvm.amdgcn.kill(i1 false) #440  br label %exit41 42endif1:                                           ; preds = %main_body43  %i22 = extractelement <3 x float> %i1, i32 144  %i23 = call nsz arcp contract float @llvm.fma.f32(float %i22, float 0.000000e+00, float 0.000000e+00) #145  %i24 = extractelement <3 x float> %i2, i32 146  %i25 = call nsz arcp contract float @llvm.fma.f32(float %i23, float %i24, float 0.000000e+00) #147  %i26 = extractelement <3 x float> %i3, i32 148  %i27 = call nsz arcp contract float @llvm.fma.f32(float %i25, float %i26, float 0.000000e+00) #149  %i28 = extractelement <3 x float> %i4, i32 150  %i29 = call nsz arcp contract float @llvm.fma.f32(float %i27, float %i28, float 0.000000e+00) #151  %i30 = extractelement <3 x float> %i5, i32 152  %i31 = call nsz arcp contract float @llvm.fma.f32(float %i29, float %i30, float 0.000000e+00) #153  %i32 = extractelement <3 x float> %i6, i32 154  %i33 = call nsz arcp contract float @llvm.fma.f32(float %i31, float %i32, float 0.000000e+00) #155  %i34 = extractelement <3 x float> %i7, i32 156  %i35 = call nsz arcp contract float @llvm.fma.f32(float %i33, float %i34, float 0.000000e+00) #157  %i36 = extractelement <3 x float> %i8, i32 158  %i37 = call nsz arcp contract float @llvm.fma.f32(float %i35, float %i36, float 0.000000e+00) #159  br label %exit60 61exit:                                             ; preds = %endif1, %if162  %i38 = phi float [ poison, %if1 ], [ %i37, %endif1 ]63  ret float %i3864}65 66 67; Test that image.sample instructions which use WQM are marked as Convergent and will be left in the first block.68 69; GCN-LABEL: {{^}}no_sinking_img_sample:70; GCN: image_sample v71; GCN: image_sample_c v72; GCN: image_sample_cl v73; GCN: image_sample_c_cl v74; GCN: image_sample_b v75; GCN: image_sample_c_b v76; GCN: image_sample_b_cl v77; GCN: branch78; GCN-NOT: image_sample v79; GCN-NOT: image_sample_c v80; GCN-NOT: image_sample_cl v81; GCN-NOT: image_sample_c_cl v82; GCN-NOT: image_sample_b v83; GCN-NOT: image_sample_c_b v84; GCN-NOT: image_sample_b_cl v85; GCN: exp null86 87define amdgpu_ps float @no_sinking_img_sample(i1 %cond) {88main_body:89  %i1 = call <3 x float> @llvm.amdgcn.image.sample.2d.v3f32.f32(i32 7, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)90  %i2 = call <3 x float> @llvm.amdgcn.image.sample.c.2d.v3f32.f32(i32 7, float poison, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)91  %i3 = call <3 x float> @llvm.amdgcn.image.sample.cl.2d.v3f32.f32(i32 7, float poison, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)92  %i4 = call <3 x float> @llvm.amdgcn.image.sample.c.cl.2d.v3f32.f32(i32 7, float poison, float poison, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)93  %i5 = call <3 x float> @llvm.amdgcn.image.sample.b.2d.v3f32.f32(i32 7, float poison, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)94  %i6 = call <3 x float> @llvm.amdgcn.image.sample.c.b.2d.v3f32.f32(i32 7, float poison, float poison, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)95  %i7 = call <3 x float> @llvm.amdgcn.image.sample.b.cl.2d.v3f32.f32.f32(i32 7, float poison, float poison, float poison, float poison, <8 x i32> poison, <4 x i32> poison, i1 false, i32 0, i32 0)96  br i1 %cond, label %endif1, label %if197 98if1:                                              ; preds = %main_body99  call void @llvm.amdgcn.kill(i1 false) #4100  br label %exit101 102endif1:                                           ; preds = %main_body103  %i22 = extractelement <3 x float> %i1, i32 2104  %i23 = call nsz arcp contract float @llvm.fma.f32(float %i22, float 0.000000e+00, float 0.000000e+00) #1105  %i24 = extractelement <3 x float> %i2, i32 2106  %i25 = call nsz arcp contract float @llvm.fma.f32(float %i23, float %i24, float 0.000000e+00) #1107  %i26 = extractelement <3 x float> %i3, i32 2108  %i27 = call nsz arcp contract float @llvm.fma.f32(float %i25, float %i26, float 0.000000e+00) #1109  %i28 = extractelement <3 x float> %i4, i32 2110  %i29 = call nsz arcp contract float @llvm.fma.f32(float %i27, float %i28, float 0.000000e+00) #1111  %i30 = extractelement <3 x float> %i5, i32 2112  %i31 = call nsz arcp contract float @llvm.fma.f32(float %i29, float %i30, float 0.000000e+00) #1113  %i32 = extractelement <3 x float> %i6, i32 2114  %i33 = call nsz arcp contract float @llvm.fma.f32(float %i31, float %i32, float 0.000000e+00) #1115  %i34 = extractelement <3 x float> %i7, i32 2116  %i35 = call nsz arcp contract float @llvm.fma.f32(float %i33, float %i34, float 0.000000e+00) #1117  br label %exit118 119exit:                                             ; preds = %endif1, %if1120  %i36 = phi float [ poison, %if1 ], [ %i35, %endif1 ]121  ret float %i36122}123 124; Function Attrs: nounwind readonly willreturn125declare <3 x float> @llvm.amdgcn.image.sample.2d.v3f32.f32(i32 immarg, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3126declare <3 x float> @llvm.amdgcn.image.sample.c.2d.v3f32.f32(i32 immarg, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3127declare <3 x float> @llvm.amdgcn.image.sample.cl.2d.v3f32.f32(i32 immarg, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3128declare <3 x float> @llvm.amdgcn.image.sample.c.cl.2d.v3f32.f32(i32 immarg, float, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3129declare <3 x float> @llvm.amdgcn.image.sample.b.2d.v3f32.f32(i32 immarg, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3130declare <3 x float> @llvm.amdgcn.image.sample.c.b.2d.v3f32.f32(i32 immarg, float, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3131declare <3 x float> @llvm.amdgcn.image.sample.b.cl.2d.v3f32.f32.(i32 immarg, float, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3132declare <3 x float> @llvm.amdgcn.image.sample.c.b.cl.2d.v3f32.f32(i32 immarg, float, float, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3133declare <3 x float> @llvm.amdgcn.image.sample.l.2d.v3f32.f32(i32 immarg, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3134declare <3 x float> @llvm.amdgcn.image.sample.lz.2d.v3f32.f32(i32 immarg, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3135declare <3 x float> @llvm.amdgcn.image.sample.c.lz.2d.v3f32.f32(i32 immarg, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3136declare <3 x float> @llvm.amdgcn.image.sample.c.l.2d.v3f32.f32(i32 immarg, float, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3137declare <3 x float> @llvm.amdgcn.image.sample.d.2d.v3f32.f32.f32(i32 immarg, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3138declare <3 x float> @llvm.amdgcn.image.sample.c.d.2d.v3f32.f32.f32(i32 immarg, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3139declare <3 x float> @llvm.amdgcn.image.sample.d.cl.2d.v3f32.f32.f32(i32 immarg, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3140declare <3 x float> @llvm.amdgcn.image.sample.c.d.cl.2d.v3f32.f32.f32(i32 immarg, float, float, float, float, float, float, float, float, <8 x i32>, <4 x i32>, i1 immarg, i32 immarg, i32 immarg) #3141 142; Function Attrs: nofree nosync nounwind readnone speculatable willreturn143declare float @llvm.fma.f32(float, float, float) #2144 145; Function Attrs: nounwind146declare void @llvm.amdgcn.kill(i1) #4147 148attributes #1 = { nounwind readnone }149attributes #2 = { nofree nosync nounwind readnone speculatable willreturn }150attributes #3 = { nounwind readonly willreturn }151attributes #4 = { nounwind }152