1 ; Tests if we can read select instructions. 2 3 ; RUN: %p2i -i %s --insts | FileCheck %s 4 ; RUN: %p2i -i %s --args -notranslate -timing | \ 5 ; RUN: FileCheck --check-prefix=NOIR %s 6 7 define internal void @Seli1(i32 %p) { 8 entry: 9 %vc = trunc i32 %p to i1 10 %vt = trunc i32 %p to i1 11 %ve = trunc i32 %p to i1 12 %r = select i1 %vc, i1 %vt, i1 %ve 13 ret void 14 } 15 16 ; CHECK: define internal void @Seli1(i32 %p) { 17 ; CHECK-NEXT: entry: 18 ; CHECK-NEXT: %vc = trunc i32 %p to i1 19 ; CHECK-NEXT: %vt = trunc i32 %p to i1 20 ; CHECK-NEXT: %ve = trunc i32 %p to i1 21 ; CHECK-NEXT: %r = select i1 %vc, i1 %vt, i1 %ve 22 ; CHECK-NEXT: ret void 23 ; CHECK-NEXT: } 24 25 define internal void @Seli8(i32 %p) { 26 entry: 27 %vc = trunc i32 %p to i1 28 %vt = trunc i32 %p to i8 29 %ve = trunc i32 %p to i8 30 %r = select i1 %vc, i8 %vt, i8 %ve 31 ret void 32 } 33 34 ; CHECK-NEXT: define internal void @Seli8(i32 %p) { 35 ; CHECK-NEXT: entry: 36 ; CHECK-NEXT: %vc = trunc i32 %p to i1 37 ; CHECK-NEXT: %vt = trunc i32 %p to i8 38 ; CHECK-NEXT: %ve = trunc i32 %p to i8 39 ; CHECK-NEXT: %r = select i1 %vc, i8 %vt, i8 %ve 40 ; CHECK-NEXT: ret void 41 ; CHECK-NEXT: } 42 43 define internal void @Seli16(i32 %p) { 44 entry: 45 %vc = trunc i32 %p to i1 46 %vt = trunc i32 %p to i16 47 %ve = trunc i32 %p to i16 48 %r = select i1 %vc, i16 %vt, i16 %ve 49 ret void 50 } 51 52 ; CHECK-NEXT: define internal void @Seli16(i32 %p) { 53 ; CHECK-NEXT: entry: 54 ; CHECK-NEXT: %vc = trunc i32 %p to i1 55 ; CHECK-NEXT: %vt = trunc i32 %p to i16 56 ; CHECK-NEXT: %ve = trunc i32 %p to i16 57 ; CHECK-NEXT: %r = select i1 %vc, i16 %vt, i16 %ve 58 ; CHECK-NEXT: ret void 59 ; CHECK-NEXT: } 60 61 define internal i32 @Seli32(i32 %pc, i32 %pt, i32 %pe) { 62 entry: 63 %vc = trunc i32 %pc to i1 64 %r = select i1 %vc, i32 %pt, i32 %pe 65 ret i32 %r 66 } 67 68 ; CHECK-NEXT: define internal i32 @Seli32(i32 %pc, i32 %pt, i32 %pe) { 69 ; CHECK-NEXT: entry: 70 ; CHECK-NEXT: %vc = trunc i32 %pc to i1 71 ; CHECK-NEXT: %r = select i1 %vc, i32 %pt, i32 %pe 72 ; CHECK-NEXT: ret i32 %r 73 ; CHECK-NEXT: } 74 75 define internal i64 @Seli64(i64 %pc, i64 %pt, i64 %pe) { 76 entry: 77 %vc = trunc i64 %pc to i1 78 %r = select i1 %vc, i64 %pt, i64 %pe 79 ret i64 %r 80 } 81 82 ; CHECK-NEXT: define internal i64 @Seli64(i64 %pc, i64 %pt, i64 %pe) { 83 ; CHECK-NEXT: entry: 84 ; CHECK-NEXT: %vc = trunc i64 %pc to i1 85 ; CHECK-NEXT: %r = select i1 %vc, i64 %pt, i64 %pe 86 ; CHECK-NEXT: ret i64 %r 87 ; CHECK-NEXT: } 88 89 define internal float @SelFloat(i32 %pc, float %pt, float %pe) { 90 entry: 91 %vc = trunc i32 %pc to i1 92 %r = select i1 %vc, float %pt, float %pe 93 ret float %r 94 } 95 96 ; CHECK-NEXT: define internal float @SelFloat(i32 %pc, float %pt, float %pe) { 97 ; CHECK-NEXT: entry: 98 ; CHECK-NEXT: %vc = trunc i32 %pc to i1 99 ; CHECK-NEXT: %r = select i1 %vc, float %pt, float %pe 100 ; CHECK-NEXT: ret float %r 101 ; CHECK-NEXT: } 102 103 define internal double @SelDouble(i32 %pc, double %pt, double %pe) { 104 entry: 105 %vc = trunc i32 %pc to i1 106 %r = select i1 %vc, double %pt, double %pe 107 ret double %r 108 } 109 110 ; CHECK-NEXT: define internal double @SelDouble(i32 %pc, double %pt, double %pe) { 111 ; CHECK-NEXT: entry: 112 ; CHECK-NEXT: %vc = trunc i32 %pc to i1 113 ; CHECK-NEXT: %r = select i1 %vc, double %pt, double %pe 114 ; CHECK-NEXT: ret double %r 115 ; CHECK-NEXT: } 116 117 define internal <16 x i1> @SelV16x1(i32 %pc, <16 x i1> %pt, <16 x i1> %pe) { 118 entry: 119 %vc = trunc i32 %pc to i1 120 %r = select i1 %vc, <16 x i1> %pt, <16 x i1> %pe 121 ret <16 x i1> %r 122 } 123 124 ; CHECK-NEXT: define internal <16 x i1> @SelV16x1(i32 %pc, <16 x i1> %pt, <16 x i1> %pe) { 125 ; CHECK-NEXT: entry: 126 ; CHECK-NEXT: %vc = trunc i32 %pc to i1 127 ; CHECK-NEXT: %r = select i1 %vc, <16 x i1> %pt, <16 x i1> %pe 128 ; CHECK-NEXT: ret <16 x i1> %r 129 ; CHECK-NEXT: } 130 131 define internal <8 x i1> @SelV8x1(i32 %pc, <8 x i1> %pt, <8 x i1> %pe) { 132 entry: 133 %vc = trunc i32 %pc to i1 134 %r = select i1 %vc, <8 x i1> %pt, <8 x i1> %pe 135 ret <8 x i1> %r 136 } 137 138 ; CHECK-NEXT: define internal <8 x i1> @SelV8x1(i32 %pc, <8 x i1> %pt, <8 x i1> %pe) { 139 ; CHECK-NEXT: entry: 140 ; CHECK-NEXT: %vc = trunc i32 %pc to i1 141 ; CHECK-NEXT: %r = select i1 %vc, <8 x i1> %pt, <8 x i1> %pe 142 ; CHECK-NEXT: ret <8 x i1> %r 143 ; CHECK-NEXT: } 144 145 define internal <4 x i1> @SelV4x1(i32 %pc, <4 x i1> %pt, <4 x i1> %pe) { 146 entry: 147 %vc = trunc i32 %pc to i1 148 %r = select i1 %vc, <4 x i1> %pt, <4 x i1> %pe 149 ret <4 x i1> %r 150 } 151 152 ; CHECK-NEXT: define internal <4 x i1> @SelV4x1(i32 %pc, <4 x i1> %pt, <4 x i1> %pe) { 153 ; CHECK-NEXT: entry: 154 ; CHECK-NEXT: %vc = trunc i32 %pc to i1 155 ; CHECK-NEXT: %r = select i1 %vc, <4 x i1> %pt, <4 x i1> %pe 156 ; CHECK-NEXT: ret <4 x i1> %r 157 ; CHECK-NEXT: } 158 159 define internal <16 x i8> @SelV16x8(i32 %pc, <16 x i8> %pt, <16 x i8> %pe) { 160 entry: 161 %vc = trunc i32 %pc to i1 162 %r = select i1 %vc, <16 x i8> %pt, <16 x i8> %pe 163 ret <16 x i8> %r 164 } 165 166 ; CHECK-NEXT: define internal <16 x i8> @SelV16x8(i32 %pc, <16 x i8> %pt, <16 x i8> %pe) { 167 ; CHECK-NEXT: entry: 168 ; CHECK-NEXT: %vc = trunc i32 %pc to i1 169 ; CHECK-NEXT: %r = select i1 %vc, <16 x i8> %pt, <16 x i8> %pe 170 ; CHECK-NEXT: ret <16 x i8> %r 171 ; CHECK-NEXT: } 172 173 define internal <8 x i16> @SelV8x16(i32 %pc, <8 x i16> %pt, <8 x i16> %pe) { 174 entry: 175 %vc = trunc i32 %pc to i1 176 %r = select i1 %vc, <8 x i16> %pt, <8 x i16> %pe 177 ret <8 x i16> %r 178 } 179 180 ; CHECK-NEXT: define internal <8 x i16> @SelV8x16(i32 %pc, <8 x i16> %pt, <8 x i16> %pe) { 181 ; CHECK-NEXT: entry: 182 ; CHECK-NEXT: %vc = trunc i32 %pc to i1 183 ; CHECK-NEXT: %r = select i1 %vc, <8 x i16> %pt, <8 x i16> %pe 184 ; CHECK-NEXT: ret <8 x i16> %r 185 ; CHECK-NEXT: } 186 187 define internal <4 x i32> @SelV4x32(i32 %pc, <4 x i32> %pt, <4 x i32> %pe) { 188 entry: 189 %vc = trunc i32 %pc to i1 190 %r = select i1 %vc, <4 x i32> %pt, <4 x i32> %pe 191 ret <4 x i32> %r 192 } 193 194 ; CHECK-NEXT: define internal <4 x i32> @SelV4x32(i32 %pc, <4 x i32> %pt, <4 x i32> %pe) { 195 ; CHECK-NEXT: entry: 196 ; CHECK-NEXT: %vc = trunc i32 %pc to i1 197 ; CHECK-NEXT: %r = select i1 %vc, <4 x i32> %pt, <4 x i32> %pe 198 ; CHECK-NEXT: ret <4 x i32> %r 199 ; CHECK-NEXT: } 200 201 define internal <4 x float> @SelV4xfloat(i32 %pc, <4 x float> %pt, <4 x float> %pe) { 202 entry: 203 %vc = trunc i32 %pc to i1 204 %r = select i1 %vc, <4 x float> %pt, <4 x float> %pe 205 ret <4 x float> %r 206 } 207 208 ; CHECK-NEXT: define internal <4 x float> @SelV4xfloat(i32 %pc, <4 x float> %pt, <4 x float> %pe) { 209 ; CHECK-NEXT: entry: 210 ; CHECK-NEXT: %vc = trunc i32 %pc to i1 211 ; CHECK-NEXT: %r = select i1 %vc, <4 x float> %pt, <4 x float> %pe 212 ; CHECK-NEXT: ret <4 x float> %r 213 ; CHECK-NEXT: } 214 215 define internal <16 x i1> @SelV16x1Vcond(<16 x i1> %pc, <16 x i1> %pt, <16 x i1> %pe) { 216 entry: 217 %r = select <16 x i1> %pc, <16 x i1> %pt, <16 x i1> %pe 218 ret <16 x i1> %r 219 } 220 221 ; CHECK-NEXT: define internal <16 x i1> @SelV16x1Vcond(<16 x i1> %pc, <16 x i1> %pt, <16 x i1> %pe) { 222 ; CHECK-NEXT: entry: 223 ; CHECK-NEXT: %r = select <16 x i1> %pc, <16 x i1> %pt, <16 x i1> %pe 224 ; CHECK-NEXT: ret <16 x i1> %r 225 ; CHECK-NEXT: } 226 227 define internal <8 x i1> @SelV8x1Vcond(<8 x i1> %pc, <8 x i1> %pt, <8 x i1> %pe) { 228 entry: 229 %r = select <8 x i1> %pc, <8 x i1> %pt, <8 x i1> %pe 230 ret <8 x i1> %r 231 } 232 233 ; CHECK-NEXT: define internal <8 x i1> @SelV8x1Vcond(<8 x i1> %pc, <8 x i1> %pt, <8 x i1> %pe) { 234 ; CHECK-NEXT: entry: 235 ; CHECK-NEXT: %r = select <8 x i1> %pc, <8 x i1> %pt, <8 x i1> %pe 236 ; CHECK-NEXT: ret <8 x i1> %r 237 ; CHECK-NEXT: } 238 239 define internal <4 x i1> @SelV4x1Vcond(<4 x i1> %pc, <4 x i1> %pt, <4 x i1> %pe) { 240 entry: 241 %r = select <4 x i1> %pc, <4 x i1> %pt, <4 x i1> %pe 242 ret <4 x i1> %r 243 } 244 245 ; CHECK-NEXT: define internal <4 x i1> @SelV4x1Vcond(<4 x i1> %pc, <4 x i1> %pt, <4 x i1> %pe) { 246 ; CHECK-NEXT: entry: 247 ; CHECK-NEXT: %r = select <4 x i1> %pc, <4 x i1> %pt, <4 x i1> %pe 248 ; CHECK-NEXT: ret <4 x i1> %r 249 ; CHECK-NEXT: } 250 251 define internal <16 x i8> @SelV16x8Vcond(<16 x i1> %pc, <16 x i8> %pt, <16 x i8> %pe) { 252 entry: 253 %r = select <16 x i1> %pc, <16 x i8> %pt, <16 x i8> %pe 254 ret <16 x i8> %r 255 } 256 257 ; CHECK-NEXT: define internal <16 x i8> @SelV16x8Vcond(<16 x i1> %pc, <16 x i8> %pt, <16 x i8> %pe) { 258 ; CHECK-NEXT: entry: 259 ; CHECK-NEXT: %r = select <16 x i1> %pc, <16 x i8> %pt, <16 x i8> %pe 260 ; CHECK-NEXT: ret <16 x i8> %r 261 ; CHECK-NEXT: } 262 263 define internal <8 x i16> @SelV8x16Vcond(<8 x i1> %pc, <8 x i16> %pt, <8 x i16> %pe) { 264 entry: 265 %r = select <8 x i1> %pc, <8 x i16> %pt, <8 x i16> %pe 266 ret <8 x i16> %r 267 } 268 269 ; CHECK-NEXT: define internal <8 x i16> @SelV8x16Vcond(<8 x i1> %pc, <8 x i16> %pt, <8 x i16> %pe) { 270 ; CHECK-NEXT: entry: 271 ; CHECK-NEXT: %r = select <8 x i1> %pc, <8 x i16> %pt, <8 x i16> %pe 272 ; CHECK-NEXT: ret <8 x i16> %r 273 ; CHECK-NEXT: } 274 275 define internal <4 x i32> @SelV4x32Vcond(<4 x i1> %pc, <4 x i32> %pt, <4 x i32> %pe) { 276 entry: 277 %r = select <4 x i1> %pc, <4 x i32> %pt, <4 x i32> %pe 278 ret <4 x i32> %r 279 } 280 281 ; CHECK-NEXT: define internal <4 x i32> @SelV4x32Vcond(<4 x i1> %pc, <4 x i32> %pt, <4 x i32> %pe) { 282 ; CHECK-NEXT: entry: 283 ; CHECK-NEXT: %r = select <4 x i1> %pc, <4 x i32> %pt, <4 x i32> %pe 284 ; CHECK-NEXT: ret <4 x i32> %r 285 ; CHECK-NEXT: } 286 287 define internal <4 x float> @SelV4xfloatVcond(<4 x i1> %pc, <4 x float> %pt, <4 x float> %pe) { 288 entry: 289 %r = select <4 x i1> %pc, <4 x float> %pt, <4 x float> %pe 290 ret <4 x float> %r 291 } 292 293 ; CHECK-NEXT: define internal <4 x float> @SelV4xfloatVcond(<4 x i1> %pc, <4 x float> %pt, <4 x float> %pe) { 294 ; CHECK-NEXT: entry: 295 ; CHECK-NEXT: %r = select <4 x i1> %pc, <4 x float> %pt, <4 x float> %pe 296 ; CHECK-NEXT: ret <4 x float> %r 297 ; CHECK-NEXT: } 298 299 ; NOIR: Total across all functions 300