| Stanislav Mekhanoshin | 20279dc | 2018-06-20 20:24:20 +0000 | [diff] [blame^] | 1 | ; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefix=GCN %s | 
|  | 2 |  | 
|  | 3 | ; GCN-LABEL: {{^}}sel_constants_sub_constant_sel_constants: | 
|  | 4 | ; GCN: v_cndmask_b32_e64 v{{[0-9]+}}, 2, 9, | 
|  | 5 | define amdgpu_kernel void @sel_constants_sub_constant_sel_constants(i32 addrspace(1)* %p, i1 %cond) { | 
|  | 6 | %sel = select i1 %cond, i32 -4, i32 3 | 
|  | 7 | %bo = sub i32 5, %sel | 
|  | 8 | store i32 %bo, i32 addrspace(1)* %p, align 4 | 
|  | 9 | ret void | 
|  | 10 | } | 
|  | 11 |  | 
|  | 12 | ; GCN-LABEL: {{^}}sel_constants_sub_constant_sel_constants_i16: | 
|  | 13 | ; TODO: shrink i16 constant. This is correct but suboptimal. | 
|  | 14 | ; GCN: v_mov_b32_e32 [[T:v[0-9]+]], 0xffff0009 | 
|  | 15 | ; GCN: v_cndmask_b32_e32 v{{[0-9]+}}, 2, [[T]], | 
|  | 16 | define amdgpu_kernel void @sel_constants_sub_constant_sel_constants_i16(i16 addrspace(1)* %p, i1 %cond) { | 
|  | 17 | %sel = select i1 %cond, i16 -4, i16 3 | 
|  | 18 | %bo = sub i16 5, %sel | 
|  | 19 | store i16 %bo, i16 addrspace(1)* %p, align 2 | 
|  | 20 | ret void | 
|  | 21 | } | 
|  | 22 |  | 
|  | 23 | ; GCN-LABEL: {{^}}sel_constants_sub_constant_sel_constants_i16_neg: | 
|  | 24 | ; GCN: v_mov_b32_e32 [[F:v[0-9]+]], 0xfffff449 | 
|  | 25 | ; GCN: v_cndmask_b32_e64 v{{[0-9]+}}, [[F]], -3, | 
|  | 26 | define amdgpu_kernel void @sel_constants_sub_constant_sel_constants_i16_neg(i16 addrspace(1)* %p, i1 %cond) { | 
|  | 27 | %sel = select i1 %cond, i16 4, i16 3000 | 
|  | 28 | %bo = sub i16 1, %sel | 
|  | 29 | store i16 %bo, i16 addrspace(1)* %p, align 2 | 
|  | 30 | ret void | 
|  | 31 | } | 
|  | 32 |  | 
|  | 33 | ; GCN-LABEL: {{^}}sel_constants_sub_constant_sel_constants_v2i16: | 
|  | 34 | ; GCN-DAG: v_mov_b32_e32 [[F:v[0-9]+]], 0x60002 | 
|  | 35 | ; GCN-DAG: v_mov_b32_e32 [[T:v[0-9]+]], 0x50009 | 
|  | 36 | ; GCN:     v_cndmask_b32_e32 v{{[0-9]+}}, [[F]], [[T]], | 
|  | 37 | define amdgpu_kernel void @sel_constants_sub_constant_sel_constants_v2i16(<2 x i16> addrspace(1)* %p, i1 %cond) { | 
|  | 38 | %sel = select i1 %cond, <2 x i16> <i16 -4, i16 2>, <2 x i16> <i16 3, i16 1> | 
|  | 39 | %bo = sub <2 x i16> <i16 5, i16 7>, %sel | 
|  | 40 | store <2 x i16> %bo, <2 x i16> addrspace(1)* %p, align 4 | 
|  | 41 | ret void | 
|  | 42 | } | 
|  | 43 |  | 
|  | 44 | ; GCN-LABEL: {{^}}sel_constants_sub_constant_sel_constants_v4i32: | 
|  | 45 | ; GCN-DAG: v_cndmask_b32_e64 v{{[0-9]+}}, 2, 9, | 
|  | 46 | ; GCN-DAG: v_cndmask_b32_e64 v{{[0-9]+}}, 6, 5, | 
|  | 47 | ; GCN-DAG: v_cndmask_b32_e64 v{{[0-9]+}}, 10, 6, | 
|  | 48 | ; GCN-DAG: v_cndmask_b32_e64 v{{[0-9]+}}, 14, 7, | 
|  | 49 | define amdgpu_kernel void @sel_constants_sub_constant_sel_constants_v4i32(<4 x i32> addrspace(1)* %p, i1 %cond) { | 
|  | 50 | %sel = select i1 %cond, <4 x i32> <i32 -4, i32 2, i32 3, i32 4>, <4 x i32> <i32 3, i32 1, i32 -1, i32 -3> | 
|  | 51 | %bo = sub <4 x i32> <i32 5, i32 7, i32 9, i32 11>, %sel | 
|  | 52 | store <4 x i32> %bo, <4 x i32> addrspace(1)* %p, align 32 | 
|  | 53 | ret void | 
|  | 54 | } | 
|  | 55 |  | 
|  | 56 | ; GCN-LABEL: {{^}}sdiv_constant_sel_constants: | 
|  | 57 | ; GCN: v_cndmask_b32_e64 v{{[0-9]+}}, 5, 0, | 
|  | 58 | define amdgpu_kernel void @sdiv_constant_sel_constants(i32 addrspace(1)* %p, i1 %cond) { | 
|  | 59 | %sel = select i1 %cond, i32 121, i32 23 | 
|  | 60 | %bo = sdiv i32 120, %sel | 
|  | 61 | store i32 %bo, i32 addrspace(1)* %p, align 4 | 
|  | 62 | ret void | 
|  | 63 | } | 
|  | 64 |  | 
|  | 65 | ; GCN-LABEL: {{^}}udiv_constant_sel_constants: | 
|  | 66 | ; GCN: v_cndmask_b32_e64 v{{[0-9]+}}, 5, 0, | 
|  | 67 | define amdgpu_kernel void @udiv_constant_sel_constants(i32 addrspace(1)* %p, i1 %cond) { | 
|  | 68 | %sel = select i1 %cond, i32 -4, i32 23 | 
|  | 69 | %bo = udiv i32 120, %sel | 
|  | 70 | store i32 %bo, i32 addrspace(1)* %p, align 4 | 
|  | 71 | ret void | 
|  | 72 | } | 
|  | 73 |  | 
|  | 74 | ; GCN-LABEL: {{^}}srem_constant_sel_constants: | 
|  | 75 | ; GCN: v_cndmask_b32_e64 v{{[0-9]+}}, 3, 33, | 
|  | 76 | define amdgpu_kernel void @srem_constant_sel_constants(i32 addrspace(1)* %p, i1 %cond) { | 
|  | 77 | %sel = select i1 %cond, i32 34, i32 15 | 
|  | 78 | %bo = srem i32 33, %sel | 
|  | 79 | store i32 %bo, i32 addrspace(1)* %p, align 4 | 
|  | 80 | ret void | 
|  | 81 | } | 
|  | 82 |  | 
|  | 83 | ; GCN-LABEL: {{^}}urem_constant_sel_constants: | 
|  | 84 | ; GCN: v_cndmask_b32_e64 v{{[0-9]+}}, 3, 33, | 
|  | 85 | define amdgpu_kernel void @urem_constant_sel_constants(i32 addrspace(1)* %p, i1 %cond) { | 
|  | 86 | %sel = select i1 %cond, i32 34, i32 15 | 
|  | 87 | %bo = urem i32 33, %sel | 
|  | 88 | store i32 %bo, i32 addrspace(1)* %p, align 4 | 
|  | 89 | ret void | 
|  | 90 | } | 
|  | 91 |  | 
|  | 92 | ; GCN-LABEL: {{^}}shl_constant_sel_constants: | 
|  | 93 | ; GCN: v_cndmask_b32_e64 v{{[0-9]+}}, 8, 4, | 
|  | 94 | define amdgpu_kernel void @shl_constant_sel_constants(i32 addrspace(1)* %p, i1 %cond) { | 
|  | 95 | %sel = select i1 %cond, i32 2, i32 3 | 
|  | 96 | %bo = shl i32 1, %sel | 
|  | 97 | store i32 %bo, i32 addrspace(1)* %p, align 4 | 
|  | 98 | ret void | 
|  | 99 | } | 
|  | 100 |  | 
|  | 101 | ; GCN-LABEL: {{^}}lshr_constant_sel_constants: | 
|  | 102 | ; GCN: v_cndmask_b32_e64 v{{[0-9]+}}, 8, 16, | 
|  | 103 | define amdgpu_kernel void @lshr_constant_sel_constants(i32 addrspace(1)* %p, i1 %cond) { | 
|  | 104 | %sel = select i1 %cond, i32 2, i32 3 | 
|  | 105 | %bo = lshr i32 64, %sel | 
|  | 106 | store i32 %bo, i32 addrspace(1)* %p, align 4 | 
|  | 107 | ret void | 
|  | 108 | } | 
|  | 109 |  | 
|  | 110 | ; GCN-LABEL: {{^}}ashr_constant_sel_constants: | 
|  | 111 | ; GCN: v_cndmask_b32_e64 v{{[0-9]+}}, 16, 32, | 
|  | 112 | define amdgpu_kernel void @ashr_constant_sel_constants(i32 addrspace(1)* %p, i1 %cond) { | 
|  | 113 | %sel = select i1 %cond, i32 2, i32 3 | 
|  | 114 | %bo = ashr i32 128, %sel | 
|  | 115 | store i32 %bo, i32 addrspace(1)* %p, align 4 | 
|  | 116 | ret void | 
|  | 117 | } | 
|  | 118 |  | 
|  | 119 | ; GCN-LABEL: {{^}}fsub_constant_sel_constants: | 
|  | 120 | ; GCN: v_cndmask_b32_e64 v{{[0-9]+}}, -4.0, 1.0, | 
|  | 121 | define amdgpu_kernel void @fsub_constant_sel_constants(float addrspace(1)* %p, i1 %cond) { | 
|  | 122 | %sel = select i1 %cond, float -2.0, float 3.0 | 
|  | 123 | %bo = fsub float -1.0, %sel | 
|  | 124 | store float %bo, float addrspace(1)* %p, align 4 | 
|  | 125 | ret void | 
|  | 126 | } | 
|  | 127 |  | 
|  | 128 | ; GCN-LABEL: {{^}}fsub_constant_sel_constants_f16: | 
|  | 129 | ; TODO: it shall be possible to fold constants with OpSel | 
|  | 130 | ; GCN-DAG: v_mov_b32_e32 [[T:v[0-9]+]], 0x3c00 | 
|  | 131 | ; GCN-DAG: v_mov_b32_e32 [[F:v[0-9]+]], 0xc400 | 
|  | 132 | ; GCN:     v_cndmask_b32_e32 v{{[0-9]+}}, [[F]], [[T]], | 
|  | 133 | define amdgpu_kernel void @fsub_constant_sel_constants_f16(half addrspace(1)* %p, i1 %cond) { | 
|  | 134 | %sel = select i1 %cond, half -2.0, half 3.0 | 
|  | 135 | %bo = fsub half -1.0, %sel | 
|  | 136 | store half %bo, half addrspace(1)* %p, align 2 | 
|  | 137 | ret void | 
|  | 138 | } | 
|  | 139 |  | 
|  | 140 | ; GCN-LABEL: {{^}}fsub_constant_sel_constants_v2f16: | 
|  | 141 | ; GCN-DAG: v_mov_b32_e32 [[T:v[0-9]+]], 0x45003c00 | 
|  | 142 | ; GCN:     v_cndmask_b32_e32 v{{[0-9]+}}, -2.0, [[T]], | 
|  | 143 | define amdgpu_kernel void @fsub_constant_sel_constants_v2f16(<2 x half> addrspace(1)* %p, i1 %cond) { | 
|  | 144 | %sel = select i1 %cond, <2 x half> <half -2.0, half -3.0>, <2 x half> <half -1.0, half 4.0> | 
|  | 145 | %bo = fsub <2 x half> <half -1.0, half 2.0>, %sel | 
|  | 146 | store <2 x half> %bo, <2 x half> addrspace(1)* %p, align 4 | 
|  | 147 | ret void | 
|  | 148 | } | 
|  | 149 |  | 
|  | 150 | ; GCN-LABEL: {{^}}fsub_constant_sel_constants_v4f32: | 
|  | 151 | ; GCN-DAG: v_mov_b32_e32 [[T2:v[0-9]+]], 0x40a00000 | 
|  | 152 | ; GCN-DAG: v_mov_b32_e32 [[T3:v[0-9]+]], 0x41100000 | 
|  | 153 | ; GCN-DAG: v_mov_b32_e32 [[T4:v[0-9]+]], 0x41500000 | 
|  | 154 | ; GCN-DAG: v_mov_b32_e32 [[F4:v[0-9]+]], 0x40c00000 | 
|  | 155 | ; GCN-DAG: v_cndmask_b32_e64 v{{[0-9]+}}, 0, 1.0, | 
|  | 156 | ; GCN-DAG: v_cndmask_b32_e32 v{{[0-9]+}}, 2.0, [[T2]], | 
|  | 157 | ; GCN-DAG: v_cndmask_b32_e32 v{{[0-9]+}}, 4.0, [[T3]], | 
|  | 158 | ; GCN-DAG: v_cndmask_b32_e32 v{{[0-9]+}}, [[F4]], [[T4]], | 
|  | 159 | define amdgpu_kernel void @fsub_constant_sel_constants_v4f32(<4 x float> addrspace(1)* %p, i1 %cond) { | 
|  | 160 | %sel = select i1 %cond, <4 x float> <float -2.0, float -3.0, float -4.0, float -5.0>, <4 x float> <float -1.0, float 0.0, float 1.0, float 2.0> | 
|  | 161 | %bo = fsub <4 x float> <float -1.0, float 2.0, float 5.0, float 8.0>, %sel | 
|  | 162 | store <4 x float> %bo, <4 x float> addrspace(1)* %p, align 32 | 
|  | 163 | ret void | 
|  | 164 | } | 
|  | 165 |  | 
|  | 166 | ; GCN-LABEL: {{^}}fdiv_constant_sel_constants: | 
|  | 167 | ; GCN: v_cndmask_b32_e64 v{{[0-9]+}}, 4.0, -2.0, | 
|  | 168 | define amdgpu_kernel void @fdiv_constant_sel_constants(float addrspace(1)* %p, i1 %cond) { | 
|  | 169 | %sel = select i1 %cond, float -4.0, float 2.0 | 
|  | 170 | %bo = fdiv float 8.0, %sel | 
|  | 171 | store float %bo, float addrspace(1)* %p, align 4 | 
|  | 172 | ret void | 
|  | 173 | } | 
|  | 174 |  | 
|  | 175 | ; GCN-LABEL: {{^}}frem_constant_sel_constants: | 
|  | 176 | ; GCN: v_cndmask_b32_e64 v{{[0-9]+}}, 2.0, 1.0, | 
|  | 177 | define amdgpu_kernel void @frem_constant_sel_constants(float addrspace(1)* %p, i1 %cond) { | 
|  | 178 | %sel = select i1 %cond, float -4.0, float 3.0 | 
|  | 179 | %bo = frem float 5.0, %sel | 
|  | 180 | store float %bo, float addrspace(1)* %p, align 4 | 
|  | 181 | ret void | 
|  | 182 | } |