1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2 ; RUN: opt < %s -instcombine -S | FileCheck %s 3 4 target datalayout = "n8:16:32:64" 5 6 define i32 @select_icmp_eq_and_1_0_or_2(i32 %x, i32 %y) { 7 ; CHECK-LABEL: @select_icmp_eq_and_1_0_or_2( 8 ; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 1 9 ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 2 10 ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], [[Y:%.*]] 11 ; CHECK-NEXT: ret i32 [[TMP2]] 12 ; 13 %and = and i32 %x, 1 14 %cmp = icmp eq i32 %and, 0 15 %or = or i32 %y, 2 16 %select = select i1 %cmp, i32 %y, i32 %or 17 ret i32 %select 18 } 19 20 define <2 x i32> @select_icmp_eq_and_1_0_or_2_vec(<2 x i32> %x, <2 x i32> %y) { 21 ; CHECK-LABEL: @select_icmp_eq_and_1_0_or_2_vec( 22 ; CHECK-NEXT: [[AND:%.*]] = shl <2 x i32> [[X:%.*]], <i32 1, i32 1> 23 ; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[AND]], <i32 2, i32 2> 24 ; CHECK-NEXT: [[TMP2:%.*]] = or <2 x i32> [[TMP1]], [[Y:%.*]] 25 ; CHECK-NEXT: ret <2 x i32> [[TMP2]] 26 ; 27 %and = and <2 x i32> %x, <i32 1, i32 1> 28 %cmp = icmp eq <2 x i32> %and, zeroinitializer 29 %or = or <2 x i32> %y, <i32 2, i32 2> 30 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or 31 ret <2 x i32> %select 32 } 33 34 define i32 @select_icmp_eq_and_1_0_xor_2(i32 %x, i32 %y) { 35 ; CHECK-LABEL: @select_icmp_eq_and_1_0_xor_2( 36 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1 37 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 38 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 2 39 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 40 ; CHECK-NEXT: ret i32 [[SELECT]] 41 ; 42 %and = and i32 %x, 1 43 %cmp = icmp eq i32 %and, 0 44 %xor = xor i32 %y, 2 45 %select = select i1 %cmp, i32 %y, i32 %xor 46 ret i32 %select 47 } 48 49 define i32 @select_icmp_eq_and_1_0_and_not_2(i32 %x, i32 %y) { 50 ; CHECK-LABEL: @select_icmp_eq_and_1_0_and_not_2( 51 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1 52 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 53 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -3 54 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 55 ; CHECK-NEXT: ret i32 [[SELECT]] 56 ; 57 %and = and i32 %x, 1 58 %cmp = icmp eq i32 %and, 0 59 %and2 = and i32 %y, -3 60 %select = select i1 %cmp, i32 %y, i32 %and2 61 ret i32 %select 62 } 63 64 define i32 @select_icmp_eq_and_32_0_or_8(i32 %x, i32 %y) { 65 ; CHECK-LABEL: @select_icmp_eq_and_32_0_or_8( 66 ; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 2 67 ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 8 68 ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], [[Y:%.*]] 69 ; CHECK-NEXT: ret i32 [[TMP2]] 70 ; 71 %and = and i32 %x, 32 72 %cmp = icmp eq i32 %and, 0 73 %or = or i32 %y, 8 74 %select = select i1 %cmp, i32 %y, i32 %or 75 ret i32 %select 76 } 77 78 define <2 x i32> @select_icmp_eq_and_32_0_or_8_vec(<2 x i32> %x, <2 x i32> %y) { 79 ; CHECK-LABEL: @select_icmp_eq_and_32_0_or_8_vec( 80 ; CHECK-NEXT: [[AND:%.*]] = lshr <2 x i32> [[X:%.*]], <i32 2, i32 2> 81 ; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[AND]], <i32 8, i32 8> 82 ; CHECK-NEXT: [[TMP2:%.*]] = or <2 x i32> [[TMP1]], [[Y:%.*]] 83 ; CHECK-NEXT: ret <2 x i32> [[TMP2]] 84 ; 85 %and = and <2 x i32> %x, <i32 32, i32 32> 86 %cmp = icmp eq <2 x i32> %and, zeroinitializer 87 %or = or <2 x i32> %y, <i32 8, i32 8> 88 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or 89 ret <2 x i32> %select 90 } 91 92 define i32 @select_icmp_eq_and_32_0_xor_8(i32 %x, i32 %y) { 93 ; CHECK-LABEL: @select_icmp_eq_and_32_0_xor_8( 94 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 32 95 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 96 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 8 97 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 98 ; CHECK-NEXT: ret i32 [[SELECT]] 99 ; 100 %and = and i32 %x, 32 101 %cmp = icmp eq i32 %and, 0 102 %xor = xor i32 %y, 8 103 %select = select i1 %cmp, i32 %y, i32 %xor 104 ret i32 %select 105 } 106 107 define i32 @select_icmp_eq_and_32_0_and_not_8(i32 %x, i32 %y) { 108 ; CHECK-LABEL: @select_icmp_eq_and_32_0_and_not_8( 109 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 32 110 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 111 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -9 112 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 113 ; CHECK-NEXT: ret i32 [[SELECT]] 114 ; 115 %and = and i32 %x, 32 116 %cmp = icmp eq i32 %and, 0 117 %and2 = and i32 %y, -9 118 %select = select i1 %cmp, i32 %y, i32 %and2 119 ret i32 %select 120 } 121 122 define i32 @select_icmp_ne_0_and_4096_or_4096(i32 %x, i32 %y) { 123 ; CHECK-LABEL: @select_icmp_ne_0_and_4096_or_4096( 124 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 125 ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], 4096 126 ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], [[Y:%.*]] 127 ; CHECK-NEXT: ret i32 [[TMP2]] 128 ; 129 %and = and i32 %x, 4096 130 %cmp = icmp ne i32 0, %and 131 %or = or i32 %y, 4096 132 %select = select i1 %cmp, i32 %y, i32 %or 133 ret i32 %select 134 } 135 136 define <2 x i32> @select_icmp_ne_0_and_4096_or_4096_vec(<2 x i32> %x, <2 x i32> %y) { 137 ; CHECK-LABEL: @select_icmp_ne_0_and_4096_or_4096_vec( 138 ; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[X:%.*]], <i32 4096, i32 4096> 139 ; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i32> [[AND]], <i32 4096, i32 4096> 140 ; CHECK-NEXT: [[TMP2:%.*]] = or <2 x i32> [[TMP1]], [[Y:%.*]] 141 ; CHECK-NEXT: ret <2 x i32> [[TMP2]] 142 ; 143 %and = and <2 x i32> %x, <i32 4096, i32 4096> 144 %cmp = icmp ne <2 x i32> zeroinitializer, %and 145 %or = or <2 x i32> %y, <i32 4096, i32 4096> 146 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or 147 ret <2 x i32> %select 148 } 149 150 define i32 @select_icmp_ne_0_and_4096_xor_4096(i32 %x, i32 %y) { 151 ; CHECK-LABEL: @select_icmp_ne_0_and_4096_xor_4096( 152 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 153 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 154 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096 155 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[XOR]], i32 [[Y]] 156 ; CHECK-NEXT: ret i32 [[SELECT]] 157 ; 158 %and = and i32 %x, 4096 159 %cmp = icmp ne i32 0, %and 160 %xor = xor i32 %y, 4096 161 %select = select i1 %cmp, i32 %y, i32 %xor 162 ret i32 %select 163 } 164 165 define i32 @select_icmp_ne_0_and_4096_and_not_4096(i32 %x, i32 %y) { 166 ; CHECK-LABEL: @select_icmp_ne_0_and_4096_and_not_4096( 167 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 168 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 169 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -4097 170 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[AND2]], i32 [[Y]] 171 ; CHECK-NEXT: ret i32 [[SELECT]] 172 ; 173 %and = and i32 %x, 4096 174 %cmp = icmp ne i32 0, %and 175 %and2 = and i32 %y, -4097 176 %select = select i1 %cmp, i32 %y, i32 %and2 177 ret i32 %select 178 } 179 180 define i32 @select_icmp_eq_and_4096_0_or_4096(i32 %x, i32 %y) { 181 ; CHECK-LABEL: @select_icmp_eq_and_4096_0_or_4096( 182 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 183 ; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[AND]], [[Y:%.*]] 184 ; CHECK-NEXT: ret i32 [[TMP1]] 185 ; 186 %and = and i32 %x, 4096 187 %cmp = icmp eq i32 %and, 0 188 %or = or i32 %y, 4096 189 %select = select i1 %cmp, i32 %y, i32 %or 190 ret i32 %select 191 } 192 193 define <2 x i32> @select_icmp_eq_and_4096_0_or_4096_vec(<2 x i32> %x, <2 x i32> %y) { 194 ; CHECK-LABEL: @select_icmp_eq_and_4096_0_or_4096_vec( 195 ; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[X:%.*]], <i32 4096, i32 4096> 196 ; CHECK-NEXT: [[TMP1:%.*]] = or <2 x i32> [[AND]], [[Y:%.*]] 197 ; CHECK-NEXT: ret <2 x i32> [[TMP1]] 198 ; 199 %and = and <2 x i32> %x, <i32 4096, i32 4096> 200 %cmp = icmp eq <2 x i32> %and, zeroinitializer 201 %or = or <2 x i32> %y, <i32 4096, i32 4096> 202 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or 203 ret <2 x i32> %select 204 } 205 206 define i32 @select_icmp_eq_and_4096_0_xor_4096(i32 %x, i32 %y) { 207 ; CHECK-LABEL: @select_icmp_eq_and_4096_0_xor_4096( 208 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 209 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 210 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096 211 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 212 ; CHECK-NEXT: ret i32 [[SELECT]] 213 ; 214 %and = and i32 %x, 4096 215 %cmp = icmp eq i32 %and, 0 216 %xor = xor i32 %y, 4096 217 %select = select i1 %cmp, i32 %y, i32 %xor 218 ret i32 %select 219 } 220 221 define i32 @select_icmp_eq_and_4096_0_and_not_4096(i32 %x, i32 %y) { 222 ; CHECK-LABEL: @select_icmp_eq_and_4096_0_and_not_4096( 223 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 224 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 225 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -4097 226 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 227 ; CHECK-NEXT: ret i32 [[SELECT]] 228 ; 229 %and = and i32 %x, 4096 230 %cmp = icmp eq i32 %and, 0 231 %and2 = and i32 %y, -4097 232 %select = select i1 %cmp, i32 %y, i32 %and2 233 ret i32 %select 234 } 235 236 define i32 @select_icmp_eq_0_and_1_or_1(i64 %x, i32 %y) { 237 ; CHECK-LABEL: @select_icmp_eq_0_and_1_or_1( 238 ; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[X:%.*]] to i32 239 ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 1 240 ; CHECK-NEXT: [[TMP3:%.*]] = or i32 [[TMP2]], [[Y:%.*]] 241 ; CHECK-NEXT: ret i32 [[TMP3]] 242 ; 243 %and = and i64 %x, 1 244 %cmp = icmp eq i64 %and, 0 245 %or = or i32 %y, 1 246 %select = select i1 %cmp, i32 %y, i32 %or 247 ret i32 %select 248 } 249 250 define <2 x i32> @select_icmp_eq_0_and_1_or_1_vec(<2 x i64> %x, <2 x i32> %y) { 251 ; CHECK-LABEL: @select_icmp_eq_0_and_1_or_1_vec( 252 ; CHECK-NEXT: [[TMP1:%.*]] = trunc <2 x i64> [[X:%.*]] to <2 x i32> 253 ; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], <i32 1, i32 1> 254 ; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i32> [[TMP2]], [[Y:%.*]] 255 ; CHECK-NEXT: ret <2 x i32> [[TMP3]] 256 ; 257 %and = and <2 x i64> %x, <i64 1, i64 1> 258 %cmp = icmp eq <2 x i64> %and, zeroinitializer 259 %or = or <2 x i32> %y, <i32 1, i32 1> 260 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or 261 ret <2 x i32> %select 262 } 263 264 define i32 @select_icmp_eq_0_and_1_xor_1(i64 %x, i32 %y) { 265 ; CHECK-LABEL: @select_icmp_eq_0_and_1_xor_1( 266 ; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[X:%.*]] to i32 267 ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 1 268 ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP2]], [[Y:%.*]] 269 ; CHECK-NEXT: ret i32 [[SELECT]] 270 ; 271 %and = and i64 %x, 1 272 %cmp = icmp eq i64 %and, 0 273 %xor = xor i32 %y, 1 274 %select = select i1 %cmp, i32 %y, i32 %xor 275 ret i32 %select 276 } 277 278 define i32 @select_icmp_eq_0_and_1_and_not_1(i64 %x, i32 %y) { 279 ; CHECK-LABEL: @select_icmp_eq_0_and_1_and_not_1( 280 ; CHECK-NEXT: [[AND:%.*]] = and i64 [[X:%.*]], 1 281 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[AND]], 0 282 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -2 283 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 284 ; CHECK-NEXT: ret i32 [[SELECT]] 285 ; 286 %and = and i64 %x, 1 287 %cmp = icmp eq i64 %and, 0 288 %and2 = and i32 %y, -2 289 %select = select i1 %cmp, i32 %y, i32 %and2 290 ret i32 %select 291 } 292 293 define i32 @select_icmp_ne_0_and_4096_or_32(i32 %x, i32 %y) { 294 ; CHECK-LABEL: @select_icmp_ne_0_and_4096_or_32( 295 ; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 7 296 ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 32 297 ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], 32 298 ; CHECK-NEXT: [[TMP3:%.*]] = or i32 [[TMP2]], [[Y:%.*]] 299 ; CHECK-NEXT: ret i32 [[TMP3]] 300 ; 301 %and = and i32 %x, 4096 302 %cmp = icmp ne i32 0, %and 303 %or = or i32 %y, 32 304 %select = select i1 %cmp, i32 %y, i32 %or 305 ret i32 %select 306 } 307 308 define i32 @select_icmp_ne_0_and_4096_xor_32(i32 %x, i32 %y) { 309 ; CHECK-LABEL: @select_icmp_ne_0_and_4096_xor_32( 310 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 311 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 312 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 32 313 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[XOR]], i32 [[Y]] 314 ; CHECK-NEXT: ret i32 [[SELECT]] 315 ; 316 %and = and i32 %x, 4096 317 %cmp = icmp ne i32 0, %and 318 %xor = xor i32 %y, 32 319 %select = select i1 %cmp, i32 %y, i32 %xor 320 ret i32 %select 321 } 322 323 define i32 @select_icmp_ne_0_and_4096_and_not_32(i32 %x, i32 %y) { 324 ; CHECK-LABEL: @select_icmp_ne_0_and_4096_and_not_32( 325 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 326 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 327 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -33 328 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[AND2]], i32 [[Y]] 329 ; CHECK-NEXT: ret i32 [[SELECT]] 330 ; 331 %and = and i32 %x, 4096 332 %cmp = icmp ne i32 0, %and 333 %and2 = and i32 %y, -33 334 %select = select i1 %cmp, i32 %y, i32 %and2 335 ret i32 %select 336 } 337 338 define i32 @select_icmp_ne_0_and_32_or_4096(i32 %x, i32 %y) { 339 ; CHECK-LABEL: @select_icmp_ne_0_and_32_or_4096( 340 ; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 7 341 ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 4096 342 ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[TMP1]], 4096 343 ; CHECK-NEXT: [[TMP3:%.*]] = or i32 [[TMP2]], [[Y:%.*]] 344 ; CHECK-NEXT: ret i32 [[TMP3]] 345 ; 346 %and = and i32 %x, 32 347 %cmp = icmp ne i32 0, %and 348 %or = or i32 %y, 4096 349 %select = select i1 %cmp, i32 %y, i32 %or 350 ret i32 %select 351 } 352 353 define <2 x i32> @select_icmp_ne_0_and_32_or_4096_vec(<2 x i32> %x, <2 x i32> %y) { 354 ; CHECK-LABEL: @select_icmp_ne_0_and_32_or_4096_vec( 355 ; CHECK-NEXT: [[AND:%.*]] = shl <2 x i32> [[X:%.*]], <i32 7, i32 7> 356 ; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i32> [[AND]], <i32 4096, i32 4096> 357 ; CHECK-NEXT: [[TMP2:%.*]] = xor <2 x i32> [[TMP1]], <i32 4096, i32 4096> 358 ; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i32> [[TMP2]], [[Y:%.*]] 359 ; CHECK-NEXT: ret <2 x i32> [[TMP3]] 360 ; 361 %and = and <2 x i32> %x, <i32 32, i32 32> 362 %cmp = icmp ne <2 x i32> zeroinitializer, %and 363 %or = or <2 x i32> %y, <i32 4096, i32 4096> 364 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or 365 ret <2 x i32> %select 366 } 367 368 define i32 @select_icmp_ne_0_and_32_xor_4096(i32 %x, i32 %y) { 369 ; CHECK-LABEL: @select_icmp_ne_0_and_32_xor_4096( 370 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 32 371 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 372 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096 373 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[XOR]], i32 [[Y]] 374 ; CHECK-NEXT: ret i32 [[SELECT]] 375 ; 376 %and = and i32 %x, 32 377 %cmp = icmp ne i32 0, %and 378 %xor = xor i32 %y, 4096 379 %select = select i1 %cmp, i32 %y, i32 %xor 380 ret i32 %select 381 } 382 383 define i32 @select_icmp_ne_0_and_32_and_not_4096(i32 %x, i32 %y) { 384 ; CHECK-LABEL: @select_icmp_ne_0_and_32_and_not_4096( 385 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 32 386 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 387 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -4097 388 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[AND2]], i32 [[Y]] 389 ; CHECK-NEXT: ret i32 [[SELECT]] 390 ; 391 %and = and i32 %x, 32 392 %cmp = icmp ne i32 0, %and 393 %and2 = and i32 %y, -4097 394 %select = select i1 %cmp, i32 %y, i32 %and2 395 ret i32 %select 396 } 397 398 define i8 @select_icmp_ne_0_and_1073741824_or_8(i32 %x, i8 %y) { 399 ; CHECK-LABEL: @select_icmp_ne_0_and_1073741824_or_8( 400 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1073741824 401 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 402 ; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], 8 403 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i8 [[OR]], i8 [[Y]] 404 ; CHECK-NEXT: ret i8 [[SELECT]] 405 ; 406 %and = and i32 %x, 1073741824 407 %cmp = icmp ne i32 0, %and 408 %or = or i8 %y, 8 409 %select = select i1 %cmp, i8 %y, i8 %or 410 ret i8 %select 411 } 412 413 define i8 @select_icmp_ne_0_and_1073741824_xor_8(i32 %x, i8 %y) { 414 ; CHECK-LABEL: @select_icmp_ne_0_and_1073741824_xor_8( 415 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1073741824 416 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 417 ; CHECK-NEXT: [[XOR:%.*]] = xor i8 [[Y:%.*]], 8 418 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i8 [[XOR]], i8 [[Y]] 419 ; CHECK-NEXT: ret i8 [[SELECT]] 420 ; 421 %and = and i32 %x, 1073741824 422 %cmp = icmp ne i32 0, %and 423 %xor = xor i8 %y, 8 424 %select = select i1 %cmp, i8 %y, i8 %xor 425 ret i8 %select 426 } 427 428 define i8 @select_icmp_ne_0_and_1073741824_and_not_8(i32 %x, i8 %y) { 429 ; CHECK-LABEL: @select_icmp_ne_0_and_1073741824_and_not_8( 430 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1073741824 431 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 432 ; CHECK-NEXT: [[AND2:%.*]] = and i8 [[Y:%.*]], -9 433 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i8 [[AND2]], i8 [[Y]] 434 ; CHECK-NEXT: ret i8 [[SELECT]] 435 ; 436 %and = and i32 %x, 1073741824 437 %cmp = icmp ne i32 0, %and 438 %and2 = and i8 %y, -9 439 %select = select i1 %cmp, i8 %y, i8 %and2 440 ret i8 %select 441 } 442 443 define i32 @select_icmp_ne_0_and_8_or_1073741824(i8 %x, i32 %y) { 444 ; CHECK-LABEL: @select_icmp_ne_0_and_8_or_1073741824( 445 ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 8 446 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0 447 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 1073741824 448 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[OR]], i32 [[Y]] 449 ; CHECK-NEXT: ret i32 [[SELECT]] 450 ; 451 %and = and i8 %x, 8 452 %cmp = icmp ne i8 0, %and 453 %or = or i32 %y, 1073741824 454 %select = select i1 %cmp, i32 %y, i32 %or 455 ret i32 %select 456 } 457 458 define i32 @select_icmp_ne_0_and_8_xor_1073741824(i8 %x, i32 %y) { 459 ; CHECK-LABEL: @select_icmp_ne_0_and_8_xor_1073741824( 460 ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 8 461 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0 462 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 1073741824 463 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[XOR]], i32 [[Y]] 464 ; CHECK-NEXT: ret i32 [[SELECT]] 465 ; 466 %and = and i8 %x, 8 467 %cmp = icmp ne i8 0, %and 468 %xor = xor i32 %y, 1073741824 469 %select = select i1 %cmp, i32 %y, i32 %xor 470 ret i32 %select 471 } 472 473 define i32 @select_icmp_ne_0_and_8_and_not_1073741824(i8 %x, i32 %y) { 474 ; CHECK-LABEL: @select_icmp_ne_0_and_8_and_not_1073741824( 475 ; CHECK-NEXT: [[AND:%.*]] = and i8 [[X:%.*]], 8 476 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[AND]], 0 477 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -1073741825 478 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[AND2]], i32 [[Y]] 479 ; CHECK-NEXT: ret i32 [[SELECT]] 480 ; 481 %and = and i8 %x, 8 482 %cmp = icmp ne i8 0, %and 483 %and2 = and i32 %y, -1073741825 484 %select = select i1 %cmp, i32 %y, i32 %and2 485 ret i32 %select 486 } 487 488 ; We can't combine here, because the cmp is scalar and the or vector. 489 ; Just make sure we don't assert. 490 define <2 x i32> @select_icmp_eq_and_1_0_or_vector_of_2s(i32 %x, <2 x i32> %y) { 491 ; CHECK-LABEL: @select_icmp_eq_and_1_0_or_vector_of_2s( 492 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1 493 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 494 ; CHECK-NEXT: [[OR:%.*]] = or <2 x i32> [[Y:%.*]], <i32 2, i32 2> 495 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], <2 x i32> [[Y]], <2 x i32> [[OR]] 496 ; CHECK-NEXT: ret <2 x i32> [[SELECT]] 497 ; 498 %and = and i32 %x, 1 499 %cmp = icmp eq i32 %and, 0 500 %or = or <2 x i32> %y, <i32 2, i32 2> 501 %select = select i1 %cmp, <2 x i32> %y, <2 x i32> %or 502 ret <2 x i32> %select 503 } 504 505 define i32 @select_icmp_and_8_ne_0_xor_8(i32 %x) { 506 ; CHECK-LABEL: @select_icmp_and_8_ne_0_xor_8( 507 ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], -9 508 ; CHECK-NEXT: ret i32 [[TMP1]] 509 ; 510 %and = and i32 %x, 8 511 %cmp = icmp eq i32 %and, 0 512 %xor = xor i32 %x, 8 513 %x.xor = select i1 %cmp, i32 %x, i32 %xor 514 ret i32 %x.xor 515 } 516 517 define i32 @select_icmp_and_8_eq_0_xor_8(i32 %x) { 518 ; CHECK-LABEL: @select_icmp_and_8_eq_0_xor_8( 519 ; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[X:%.*]], 8 520 ; CHECK-NEXT: ret i32 [[TMP1]] 521 ; 522 %and = and i32 %x, 8 523 %cmp = icmp eq i32 %and, 0 524 %xor = xor i32 %x, 8 525 %xor.x = select i1 %cmp, i32 %xor, i32 %x 526 ret i32 %xor.x 527 } 528 529 define i64 @select_icmp_x_and_8_eq_0_y_xor_8(i32 %x, i64 %y) { 530 ; CHECK-LABEL: @select_icmp_x_and_8_eq_0_y_xor_8( 531 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 8 532 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 533 ; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[Y:%.*]], 8 534 ; CHECK-NEXT: [[Y_XOR:%.*]] = select i1 [[CMP]], i64 [[Y]], i64 [[XOR]] 535 ; CHECK-NEXT: ret i64 [[Y_XOR]] 536 ; 537 %and = and i32 %x, 8 538 %cmp = icmp eq i32 %and, 0 539 %xor = xor i64 %y, 8 540 %y.xor = select i1 %cmp, i64 %y, i64 %xor 541 ret i64 %y.xor 542 } 543 544 define i64 @select_icmp_x_and_8_ne_0_y_xor_8(i32 %x, i64 %y) { 545 ; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_xor_8( 546 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 8 547 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 548 ; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[Y:%.*]], 8 549 ; CHECK-NEXT: [[XOR_Y:%.*]] = select i1 [[CMP]], i64 [[XOR]], i64 [[Y]] 550 ; CHECK-NEXT: ret i64 [[XOR_Y]] 551 ; 552 %and = and i32 %x, 8 553 %cmp = icmp eq i32 %and, 0 554 %xor = xor i64 %y, 8 555 %xor.y = select i1 %cmp, i64 %xor, i64 %y 556 ret i64 %xor.y 557 } 558 559 define i64 @select_icmp_x_and_8_ne_0_y_or_8(i32 %x, i64 %y) { 560 ; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_or_8( 561 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 8 562 ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], 8 563 ; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[TMP1]] to i64 564 ; CHECK-NEXT: [[TMP3:%.*]] = or i64 [[TMP2]], [[Y:%.*]] 565 ; CHECK-NEXT: ret i64 [[TMP3]] 566 ; 567 %and = and i32 %x, 8 568 %cmp = icmp eq i32 %and, 0 569 %or = or i64 %y, 8 570 %or.y = select i1 %cmp, i64 %or, i64 %y 571 ret i64 %or.y 572 } 573 574 define <2 x i64> @select_icmp_x_and_8_ne_0_y_or_8_vec(<2 x i32> %x, <2 x i64> %y) { 575 ; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_or_8_vec( 576 ; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> [[X:%.*]], <i32 8, i32 8> 577 ; CHECK-NEXT: [[TMP1:%.*]] = xor <2 x i32> [[AND]], <i32 8, i32 8> 578 ; CHECK-NEXT: [[TMP2:%.*]] = zext <2 x i32> [[TMP1]] to <2 x i64> 579 ; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i64> [[TMP2]], [[Y:%.*]] 580 ; CHECK-NEXT: ret <2 x i64> [[TMP3]] 581 ; 582 %and = and <2 x i32> %x, <i32 8, i32 8> 583 %cmp = icmp eq <2 x i32> %and, zeroinitializer 584 %or = or <2 x i64> %y, <i64 8, i64 8> 585 %or.y = select <2 x i1> %cmp, <2 x i64> %or, <2 x i64> %y 586 ret <2 x i64> %or.y 587 } 588 589 define i64 @select_icmp_x_and_8_ne_0_y_and_not_8(i32 %x, i64 %y) { 590 ; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_and_not_8( 591 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 8 592 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 593 ; CHECK-NEXT: [[AND2:%.*]] = and i64 [[Y:%.*]], -9 594 ; CHECK-NEXT: [[AND_Y:%.*]] = select i1 [[CMP]], i64 [[AND2]], i64 [[Y]] 595 ; CHECK-NEXT: ret i64 [[AND_Y]] 596 ; 597 %and = and i32 %x, 8 598 %cmp = icmp eq i32 %and, 0 599 %and2 = and i64 %y, -9 600 %and.y = select i1 %cmp, i64 %and2, i64 %y 601 ret i64 %and.y 602 } 603 604 define i32 @select_icmp_and_2147483648_ne_0_xor_2147483648(i32 %x) { 605 ; CHECK-LABEL: @select_icmp_and_2147483648_ne_0_xor_2147483648( 606 ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[X:%.*]], 2147483647 607 ; CHECK-NEXT: ret i32 [[TMP1]] 608 ; 609 %and = and i32 %x, 2147483648 610 %cmp = icmp eq i32 %and, 0 611 %xor = xor i32 %x, 2147483648 612 %x.xor = select i1 %cmp, i32 %x, i32 %xor 613 ret i32 %x.xor 614 } 615 616 define i32 @select_icmp_and_2147483648_eq_0_xor_2147483648(i32 %x) { 617 ; CHECK-LABEL: @select_icmp_and_2147483648_eq_0_xor_2147483648( 618 ; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[X:%.*]], -2147483648 619 ; CHECK-NEXT: ret i32 [[TMP1]] 620 ; 621 %and = and i32 %x, 2147483648 622 %cmp = icmp eq i32 %and, 0 623 %xor = xor i32 %x, 2147483648 624 %xor.x = select i1 %cmp, i32 %xor, i32 %x 625 ret i32 %xor.x 626 } 627 628 define i32 @select_icmp_x_and_2147483648_ne_0_or_2147483648(i32 %x) { 629 ; CHECK-LABEL: @select_icmp_x_and_2147483648_ne_0_or_2147483648( 630 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[X:%.*]], -2147483648 631 ; CHECK-NEXT: ret i32 [[OR]] 632 ; 633 %and = and i32 %x, 2147483648 634 %cmp = icmp eq i32 %and, 0 635 %or = or i32 %x, 2147483648 636 %or.x = select i1 %cmp, i32 %or, i32 %x 637 ret i32 %or.x 638 } 639 640 define i32 @test68(i32 %x, i32 %y) { 641 ; CHECK-LABEL: @test68( 642 ; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 6 643 ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 2 644 ; CHECK-NEXT: [[TMP3:%.*]] = or i32 [[TMP2]], [[Y:%.*]] 645 ; CHECK-NEXT: ret i32 [[TMP3]] 646 ; 647 %and = and i32 %x, 128 648 %cmp = icmp eq i32 %and, 0 649 %or = or i32 %y, 2 650 %select = select i1 %cmp, i32 %y, i32 %or 651 ret i32 %select 652 } 653 654 define <2 x i32> @test68vec(<2 x i32> %x, <2 x i32> %y) { 655 ; CHECK-LABEL: @test68vec( 656 ; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i32> [[X:%.*]], <i32 6, i32 6> 657 ; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], <i32 2, i32 2> 658 ; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i32> [[TMP2]], [[Y:%.*]] 659 ; CHECK-NEXT: ret <2 x i32> [[TMP3]] 660 ; 661 %and = and <2 x i32> %x, <i32 128, i32 128> 662 %cmp = icmp eq <2 x i32> %and, zeroinitializer 663 %or = or <2 x i32> %y, <i32 2, i32 2> 664 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or 665 ret <2 x i32> %select 666 } 667 668 define i32 @test68_xor(i32 %x, i32 %y) { 669 ; CHECK-LABEL: @test68_xor( 670 ; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[X:%.*]] to i8 671 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[TMP1]], -1 672 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 2 673 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 674 ; CHECK-NEXT: ret i32 [[SELECT]] 675 ; 676 %and = and i32 %x, 128 677 %cmp = icmp eq i32 %and, 0 678 %xor = xor i32 %y, 2 679 %select = select i1 %cmp, i32 %y, i32 %xor 680 ret i32 %select 681 } 682 683 define i32 @test68_and(i32 %x, i32 %y) { 684 ; CHECK-LABEL: @test68_and( 685 ; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[X:%.*]] to i8 686 ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[TMP1]], -1 687 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -3 688 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 689 ; CHECK-NEXT: ret i32 [[SELECT]] 690 ; 691 %and = and i32 %x, 128 692 %cmp = icmp eq i32 %and, 0 693 %and2 = and i32 %y, -3 694 %select = select i1 %cmp, i32 %y, i32 %and2 695 ret i32 %select 696 } 697 698 define i32 @test69(i32 %x, i32 %y) { 699 ; CHECK-LABEL: @test69( 700 ; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 6 701 ; CHECK-NEXT: [[TMP2:%.*]] = and i32 [[TMP1]], 2 702 ; CHECK-NEXT: [[TMP3:%.*]] = xor i32 [[TMP2]], 2 703 ; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[TMP3]], [[Y:%.*]] 704 ; CHECK-NEXT: ret i32 [[TMP4]] 705 ; 706 %and = and i32 %x, 128 707 %cmp = icmp ne i32 %and, 0 708 %or = or i32 %y, 2 709 %select = select i1 %cmp, i32 %y, i32 %or 710 ret i32 %select 711 } 712 713 define <2 x i32> @test69vec(<2 x i32> %x, <2 x i32> %y) { 714 ; CHECK-LABEL: @test69vec( 715 ; CHECK-NEXT: [[TMP1:%.*]] = lshr <2 x i32> [[X:%.*]], <i32 6, i32 6> 716 ; CHECK-NEXT: [[TMP2:%.*]] = and <2 x i32> [[TMP1]], <i32 2, i32 2> 717 ; CHECK-NEXT: [[TMP3:%.*]] = xor <2 x i32> [[TMP2]], <i32 2, i32 2> 718 ; CHECK-NEXT: [[TMP4:%.*]] = or <2 x i32> [[TMP3]], [[Y:%.*]] 719 ; CHECK-NEXT: ret <2 x i32> [[TMP4]] 720 ; 721 %and = and <2 x i32> %x, <i32 128, i32 128> 722 %cmp = icmp ne <2 x i32> %and, zeroinitializer 723 %or = or <2 x i32> %y, <i32 2, i32 2> 724 %select = select <2 x i1> %cmp, <2 x i32> %y, <2 x i32> %or 725 ret <2 x i32> %select 726 } 727 728 define i32 @test69_xor(i32 %x, i32 %y) { 729 ; CHECK-LABEL: @test69_xor( 730 ; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[X:%.*]] to i8 731 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[TMP1]], 0 732 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 2 733 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 734 ; CHECK-NEXT: ret i32 [[SELECT]] 735 ; 736 %and = and i32 %x, 128 737 %cmp = icmp ne i32 %and, 0 738 %xor = xor i32 %y, 2 739 %select = select i1 %cmp, i32 %y, i32 %xor 740 ret i32 %select 741 } 742 743 define i32 @test69_and(i32 %x, i32 %y) { 744 ; CHECK-LABEL: @test69_and( 745 ; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[X:%.*]] to i8 746 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[TMP1]], 0 747 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], 2 748 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 749 ; CHECK-NEXT: ret i32 [[SELECT]] 750 ; 751 %and = and i32 %x, 128 752 %cmp = icmp ne i32 %and, 0 753 %and2 = and i32 %y, 2 754 %select = select i1 %cmp, i32 %y, i32 %and2 755 ret i32 %select 756 } 757 758 define i8 @test70(i8 %x, i8 %y) { 759 ; CHECK-LABEL: @test70( 760 ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 0 761 ; CHECK-NEXT: [[OR:%.*]] = or i8 [[Y:%.*]], 2 762 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i8 [[OR]], i8 [[Y]] 763 ; CHECK-NEXT: ret i8 [[SELECT]] 764 ; 765 %cmp = icmp slt i8 %x, 0 766 %or = or i8 %y, 2 767 %select = select i1 %cmp, i8 %or, i8 %y 768 ret i8 %select 769 } 770 771 define i32 @shift_no_xor_multiuse_or(i32 %x, i32 %y) { 772 ; CHECK-LABEL: @shift_no_xor_multiuse_or( 773 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 2 774 ; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 1 775 ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 2 776 ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], [[Y]] 777 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[TMP2]], [[OR]] 778 ; CHECK-NEXT: ret i32 [[RES]] 779 ; 780 %and = and i32 %x, 1 781 %cmp = icmp eq i32 %and, 0 782 %or = or i32 %y, 2 783 %select = select i1 %cmp, i32 %y, i32 %or 784 %res = mul i32 %select, %or ; to bump up use count of the Or 785 ret i32 %res 786 } 787 788 define i32 @shift_no_xor_multiuse_xor(i32 %x, i32 %y) { 789 ; CHECK-LABEL: @shift_no_xor_multiuse_xor( 790 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1 791 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 792 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 2 793 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 794 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[XOR]] 795 ; CHECK-NEXT: ret i32 [[RES]] 796 ; 797 %and = and i32 %x, 1 798 %cmp = icmp eq i32 %and, 0 799 %xor = xor i32 %y, 2 800 %select = select i1 %cmp, i32 %y, i32 %xor 801 %res = mul i32 %select, %xor ; to bump up use count of the Xor 802 ret i32 %res 803 } 804 805 define i32 @shift_no_xor_multiuse_and(i32 %x, i32 %y) { 806 ; CHECK-LABEL: @shift_no_xor_multiuse_and( 807 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1 808 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 809 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -3 810 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 811 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[AND2]] 812 ; CHECK-NEXT: ret i32 [[RES]] 813 ; 814 %and = and i32 %x, 1 815 %cmp = icmp eq i32 %and, 0 816 %and2 = and i32 %y, -3 817 %select = select i1 %cmp, i32 %y, i32 %and2 818 %res = mul i32 %select, %and2 ; to bump up use count of the And 819 ret i32 %res 820 } 821 822 define i32 @no_shift_no_xor_multiuse_or(i32 %x, i32 %y) { 823 ; CHECK-LABEL: @no_shift_no_xor_multiuse_or( 824 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 825 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 4096 826 ; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[AND]], [[Y]] 827 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[TMP1]], [[OR]] 828 ; CHECK-NEXT: ret i32 [[RES]] 829 ; 830 %and = and i32 %x, 4096 831 %cmp = icmp eq i32 %and, 0 832 %or = or i32 %y, 4096 833 %select = select i1 %cmp, i32 %y, i32 %or 834 %res = mul i32 %select, %or ; to bump up use count of the Or 835 ret i32 %res 836 } 837 838 define i32 @no_shift_no_xor_multiuse_xor(i32 %x, i32 %y) { 839 ; CHECK-LABEL: @no_shift_no_xor_multiuse_xor( 840 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 841 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 842 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096 843 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 844 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[XOR]] 845 ; CHECK-NEXT: ret i32 [[RES]] 846 ; 847 %and = and i32 %x, 4096 848 %cmp = icmp eq i32 %and, 0 849 %xor = xor i32 %y, 4096 850 %select = select i1 %cmp, i32 %y, i32 %xor 851 %res = mul i32 %select, %xor ; to bump up use count of the Xor 852 ret i32 %res 853 } 854 855 define i32 @no_shift_no_xor_multiuse_and(i32 %x, i32 %y) { 856 ; CHECK-LABEL: @no_shift_no_xor_multiuse_and( 857 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 858 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 859 ; CHECK-NEXT: [[AND2:%.*]] = add i32 [[Y:%.*]], -4097 860 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 861 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[AND2]] 862 ; CHECK-NEXT: ret i32 [[RES]] 863 ; 864 %and = and i32 %x, 4096 865 %cmp = icmp eq i32 %and, 0 866 %and2 = add i32 %y, -4097 867 %select = select i1 %cmp, i32 %y, i32 %and2 868 %res = mul i32 %select, %and2 ; to bump up use count of the And 869 ret i32 %res 870 } 871 872 define i32 @no_shift_xor_multiuse_or(i32 %x, i32 %y) { 873 ; CHECK-LABEL: @no_shift_xor_multiuse_or( 874 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 875 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 4096 876 ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], 4096 877 ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], [[Y]] 878 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[TMP2]], [[OR]] 879 ; CHECK-NEXT: ret i32 [[RES]] 880 ; 881 %and = and i32 %x, 4096 882 %cmp = icmp ne i32 0, %and 883 %or = or i32 %y, 4096 884 %select = select i1 %cmp, i32 %y, i32 %or 885 %res = mul i32 %select, %or ; to bump up use count of the Or 886 ret i32 %res 887 } 888 889 define i32 @no_shift_xor_multiuse_xor(i32 %x, i32 %y) { 890 ; CHECK-LABEL: @no_shift_xor_multiuse_xor( 891 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 892 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 893 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096 894 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[XOR]], i32 [[Y]] 895 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[XOR]] 896 ; CHECK-NEXT: ret i32 [[RES]] 897 ; 898 %and = and i32 %x, 4096 899 %cmp = icmp ne i32 0, %and 900 %xor = xor i32 %y, 4096 901 %select = select i1 %cmp, i32 %y, i32 %xor 902 %res = mul i32 %select, %xor ; to bump up use count of the Xor 903 ret i32 %res 904 } 905 906 define i32 @no_shift_xor_multiuse_and(i32 %x, i32 %y) { 907 ; CHECK-LABEL: @no_shift_xor_multiuse_and( 908 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 909 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 910 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -4097 911 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[AND2]], i32 [[Y]] 912 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[AND2]] 913 ; CHECK-NEXT: ret i32 [[RES]] 914 ; 915 %and = and i32 %x, 4096 916 %cmp = icmp ne i32 0, %and 917 %and2 = and i32 %y, -4097 918 %select = select i1 %cmp, i32 %y, i32 %and2 919 %res = mul i32 %select, %and2 ; to bump up use count of the And 920 ret i32 %res 921 } 922 923 define i32 @shift_xor_multiuse_or(i32 %x, i32 %y) { 924 ; CHECK-LABEL: @shift_xor_multiuse_or( 925 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 926 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 927 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 2048 928 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[OR]], i32 [[Y]] 929 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[OR]] 930 ; CHECK-NEXT: ret i32 [[RES]] 931 ; 932 %and = and i32 %x, 4096 933 %cmp = icmp ne i32 0, %and 934 %or = or i32 %y, 2048 935 %select = select i1 %cmp, i32 %y, i32 %or 936 %res = mul i32 %select, %or ; to bump up use count of the Or 937 ret i32 %res 938 } 939 940 define i32 @shift_xor_multiuse_xor(i32 %x, i32 %y) { 941 ; CHECK-LABEL: @shift_xor_multiuse_xor( 942 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 943 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 944 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 2048 945 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[XOR]], i32 [[Y]] 946 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[XOR]] 947 ; CHECK-NEXT: ret i32 [[RES]] 948 ; 949 %and = and i32 %x, 4096 950 %cmp = icmp ne i32 0, %and 951 %xor = xor i32 %y, 2048 952 %select = select i1 %cmp, i32 %y, i32 %xor 953 %res = mul i32 %select, %xor ; to bump up use count of the Xor 954 ret i32 %res 955 } 956 957 define i32 @shift_xor_multiuse_and(i32 %x, i32 %y) { 958 ; CHECK-LABEL: @shift_xor_multiuse_and( 959 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 960 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 961 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -2049 962 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[AND2]], i32 [[Y]] 963 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[AND2]] 964 ; CHECK-NEXT: ret i32 [[RES]] 965 ; 966 %and = and i32 %x, 4096 967 %cmp = icmp ne i32 0, %and 968 %and2 = and i32 %y, -2049 969 %select = select i1 %cmp, i32 %y, i32 %and2 970 %res = mul i32 %select, %and2 ; to bump up use count of the and 971 ret i32 %res 972 } 973 974 define i32 @shift_no_xor_multiuse_cmp(i32 %x, i32 %y, i32 %z, i32 %w) { 975 ; CHECK-LABEL: @shift_no_xor_multiuse_cmp( 976 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1 977 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 978 ; CHECK-NEXT: [[TMP1:%.*]] = shl nuw nsw i32 [[AND]], 1 979 ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], [[Y:%.*]] 980 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 981 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[TMP2]], [[SELECT2]] 982 ; CHECK-NEXT: ret i32 [[RES]] 983 ; 984 %and = and i32 %x, 1 985 %cmp = icmp eq i32 %and, 0 986 %or = or i32 %y, 2 987 %select = select i1 %cmp, i32 %y, i32 %or 988 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 989 %res = mul i32 %select, %select2 990 ret i32 %res 991 } 992 993 define i32 @shift_no_xor_multiuse_cmp_with_xor(i32 %x, i32 %y, i32 %z, i32 %w) { 994 ; CHECK-LABEL: @shift_no_xor_multiuse_cmp_with_xor( 995 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1 996 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 997 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 2 998 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 999 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1000 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1001 ; CHECK-NEXT: ret i32 [[RES]] 1002 ; 1003 %and = and i32 %x, 1 1004 %cmp = icmp eq i32 %and, 0 1005 %xor = xor i32 %y, 2 1006 %select = select i1 %cmp, i32 %y, i32 %xor 1007 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1008 %res = mul i32 %select, %select2 1009 ret i32 %res 1010 } 1011 1012 define i32 @shift_no_xor_multiuse_cmp_with_and(i32 %x, i32 %y, i32 %z, i32 %w) { 1013 ; CHECK-LABEL: @shift_no_xor_multiuse_cmp_with_and( 1014 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1 1015 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 1016 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -3 1017 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 1018 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1019 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1020 ; CHECK-NEXT: ret i32 [[RES]] 1021 ; 1022 %and = and i32 %x, 1 1023 %cmp = icmp eq i32 %and, 0 1024 %and2 = and i32 %y, -3 1025 %select = select i1 %cmp, i32 %y, i32 %and2 1026 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1027 %res = mul i32 %select, %select2 1028 ret i32 %res 1029 } 1030 1031 define i32 @no_shift_no_xor_multiuse_cmp(i32 %x, i32 %y, i32 %z, i32 %w) { 1032 ; CHECK-LABEL: @no_shift_no_xor_multiuse_cmp( 1033 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1034 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 1035 ; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[AND]], [[Y:%.*]] 1036 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1037 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[TMP1]], [[SELECT2]] 1038 ; CHECK-NEXT: ret i32 [[RES]] 1039 ; 1040 %and = and i32 %x, 4096 1041 %cmp = icmp eq i32 %and, 0 1042 %or = or i32 %y, 4096 1043 %select = select i1 %cmp, i32 %y, i32 %or 1044 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1045 %res = mul i32 %select, %select2 1046 ret i32 %res 1047 } 1048 1049 define i32 @no_shift_no_xor_multiuse_cmp_with_xor(i32 %x, i32 %y, i32 %z, i32 %w) { 1050 ; CHECK-LABEL: @no_shift_no_xor_multiuse_cmp_with_xor( 1051 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1052 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 1053 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096 1054 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 1055 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1056 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1057 ; CHECK-NEXT: ret i32 [[RES]] 1058 ; 1059 %and = and i32 %x, 4096 1060 %cmp = icmp eq i32 %and, 0 1061 %xor = xor i32 %y, 4096 1062 %select = select i1 %cmp, i32 %y, i32 %xor 1063 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1064 %res = mul i32 %select, %select2 1065 ret i32 %res 1066 } 1067 1068 define i32 @no_shift_no_xor_multiuse_cmp_with_and(i32 %x, i32 %y, i32 %z, i32 %w) { 1069 ; CHECK-LABEL: @no_shift_no_xor_multiuse_cmp_with_and( 1070 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1071 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 1072 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -4097 1073 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 1074 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1075 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1076 ; CHECK-NEXT: ret i32 [[RES]] 1077 ; 1078 %and = and i32 %x, 4096 1079 %cmp = icmp eq i32 %and, 0 1080 %and2 = and i32 %y, -4097 1081 %select = select i1 %cmp, i32 %y, i32 %and2 1082 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1083 %res = mul i32 %select, %select2 1084 ret i32 %res 1085 } 1086 1087 define i32 @no_shift_xor_multiuse_cmp(i32 %x, i32 %y, i32 %z, i32 %w) { 1088 ; CHECK-LABEL: @no_shift_xor_multiuse_cmp( 1089 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1090 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 1091 ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], 4096 1092 ; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[TMP1]], [[Y:%.*]] 1093 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[W:%.*]], i32 [[Z:%.*]] 1094 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[TMP2]], [[SELECT2]] 1095 ; CHECK-NEXT: ret i32 [[RES]] 1096 ; 1097 %and = and i32 %x, 4096 1098 %cmp = icmp ne i32 0, %and 1099 %or = or i32 %y, 4096 1100 %select = select i1 %cmp, i32 %y, i32 %or 1101 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1102 %res = mul i32 %select, %select2 1103 ret i32 %res 1104 } 1105 1106 define i32 @no_shift_xor_multiuse_cmp_with_xor(i32 %x, i32 %y, i32 %z, i32 %w) { 1107 ; CHECK-LABEL: @no_shift_xor_multiuse_cmp_with_xor( 1108 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1109 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0 1110 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096 1111 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 1112 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1113 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1114 ; CHECK-NEXT: ret i32 [[RES]] 1115 ; 1116 %and = and i32 %x, 4096 1117 %cmp = icmp ne i32 0, %and 1118 %xor = xor i32 %y, 4096 1119 %select = select i1 %cmp, i32 %y, i32 %xor 1120 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1121 %res = mul i32 %select, %select2 1122 ret i32 %res 1123 } 1124 1125 define i32 @no_shift_xor_multiuse_cmp_with_and(i32 %x, i32 %y, i32 %z, i32 %w) { 1126 ; CHECK-LABEL: @no_shift_xor_multiuse_cmp_with_and( 1127 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1128 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0 1129 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -4097 1130 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 1131 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1132 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1133 ; CHECK-NEXT: ret i32 [[RES]] 1134 ; 1135 %and = and i32 %x, 4096 1136 %cmp = icmp ne i32 0, %and 1137 %and2 = and i32 %y, -4097 1138 %select = select i1 %cmp, i32 %y, i32 %and2 1139 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1140 %res = mul i32 %select, %select2 1141 ret i32 %res 1142 } 1143 1144 define i32 @shift_xor_multiuse_cmp(i32 %x, i32 %y, i32 %z, i32 %w) { 1145 ; CHECK-LABEL: @shift_xor_multiuse_cmp( 1146 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1147 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0 1148 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 2048 1149 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[OR]] 1150 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1151 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1152 ; CHECK-NEXT: ret i32 [[RES]] 1153 ; 1154 %and = and i32 %x, 4096 1155 %cmp = icmp ne i32 0, %and 1156 %or = or i32 %y, 2048 1157 %select = select i1 %cmp, i32 %y, i32 %or 1158 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1159 %res = mul i32 %select, %select2 1160 ret i32 %res 1161 } 1162 1163 define i32 @shift_xor_multiuse_cmp_with_xor(i32 %x, i32 %y, i32 %z, i32 %w) { 1164 ; CHECK-LABEL: @shift_xor_multiuse_cmp_with_xor( 1165 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1166 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0 1167 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 2048 1168 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 1169 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1170 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1171 ; CHECK-NEXT: ret i32 [[RES]] 1172 ; 1173 %and = and i32 %x, 4096 1174 %cmp = icmp ne i32 0, %and 1175 %xor = xor i32 %y, 2048 1176 %select = select i1 %cmp, i32 %y, i32 %xor 1177 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1178 %res = mul i32 %select, %select2 1179 ret i32 %res 1180 } 1181 1182 define i32 @shift_xor_multiuse_cmp_with_and(i32 %x, i32 %y, i32 %z, i32 %w) { 1183 ; CHECK-LABEL: @shift_xor_multiuse_cmp_with_and( 1184 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1185 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0 1186 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -2049 1187 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 1188 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1189 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1190 ; CHECK-NEXT: ret i32 [[RES]] 1191 ; 1192 %and = and i32 %x, 4096 1193 %cmp = icmp ne i32 0, %and 1194 %and2 = and i32 %y, -2049 1195 %select = select i1 %cmp, i32 %y, i32 %and2 1196 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1197 %res = mul i32 %select, %select2 1198 ret i32 %res 1199 } 1200 1201 define i32 @shift_no_xor_multiuse_cmp_or(i32 %x, i32 %y, i32 %z, i32 %w) { 1202 ; CHECK-LABEL: @shift_no_xor_multiuse_cmp_or( 1203 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1 1204 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 1205 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 2 1206 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[OR]] 1207 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1208 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1209 ; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[OR]] 1210 ; CHECK-NEXT: ret i32 [[RES2]] 1211 ; 1212 %and = and i32 %x, 1 1213 %cmp = icmp eq i32 %and, 0 1214 %or = or i32 %y, 2 1215 %select = select i1 %cmp, i32 %y, i32 %or 1216 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1217 %res = mul i32 %select, %select2 1218 %res2 = mul i32 %res, %or ; to bump up the use count of the or 1219 ret i32 %res2 1220 } 1221 1222 define i32 @shift_no_xor_multiuse_cmp_xor(i32 %x, i32 %y, i32 %z, i32 %w) { 1223 ; CHECK-LABEL: @shift_no_xor_multiuse_cmp_xor( 1224 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1 1225 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 1226 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 2 1227 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 1228 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1229 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1230 ; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[XOR]] 1231 ; CHECK-NEXT: ret i32 [[RES2]] 1232 ; 1233 %and = and i32 %x, 1 1234 %cmp = icmp eq i32 %and, 0 1235 %xor = xor i32 %y, 2 1236 %select = select i1 %cmp, i32 %y, i32 %xor 1237 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1238 %res = mul i32 %select, %select2 1239 %res2 = mul i32 %res, %xor ; to bump up the use count of the xor 1240 ret i32 %res2 1241 } 1242 1243 define i32 @shift_no_xor_multiuse_cmp_and(i32 %x, i32 %y, i32 %z, i32 %w) { 1244 ; CHECK-LABEL: @shift_no_xor_multiuse_cmp_and( 1245 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1 1246 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 1247 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -3 1248 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 1249 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1250 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1251 ; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[AND2]] 1252 ; CHECK-NEXT: ret i32 [[RES2]] 1253 ; 1254 %and = and i32 %x, 1 1255 %cmp = icmp eq i32 %and, 0 1256 %and2 = and i32 %y, -3 1257 %select = select i1 %cmp, i32 %y, i32 %and2 1258 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1259 %res = mul i32 %select, %select2 1260 %res2 = mul i32 %res, %and2 ; to bump up the use count of the and 1261 ret i32 %res2 1262 } 1263 1264 define i32 @no_shift_no_xor_multiuse_cmp_or(i32 %x, i32 %y, i32 %z, i32 %w) { 1265 ; CHECK-LABEL: @no_shift_no_xor_multiuse_cmp_or( 1266 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1267 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 1268 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 4096 1269 ; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[AND]], [[Y]] 1270 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1271 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[TMP1]], [[SELECT2]] 1272 ; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[OR]] 1273 ; CHECK-NEXT: ret i32 [[RES2]] 1274 ; 1275 %and = and i32 %x, 4096 1276 %cmp = icmp eq i32 %and, 0 1277 %or = or i32 %y, 4096 1278 %select = select i1 %cmp, i32 %y, i32 %or 1279 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1280 %res = mul i32 %select, %select2 1281 %res2 = mul i32 %res, %or ; to bump up the use count of the or 1282 ret i32 %res2 1283 } 1284 1285 define i32 @no_shift_no_xor_multiuse_cmp_xor(i32 %x, i32 %y, i32 %z, i32 %w) { 1286 ; CHECK-LABEL: @no_shift_no_xor_multiuse_cmp_xor( 1287 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1288 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 1289 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096 1290 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 1291 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1292 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1293 ; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[XOR]] 1294 ; CHECK-NEXT: ret i32 [[RES2]] 1295 ; 1296 %and = and i32 %x, 4096 1297 %cmp = icmp eq i32 %and, 0 1298 %xor = xor i32 %y, 4096 1299 %select = select i1 %cmp, i32 %y, i32 %xor 1300 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1301 %res = mul i32 %select, %select2 1302 %res2 = mul i32 %res, %xor ; to bump up the use count of the xor 1303 ret i32 %res2 1304 } 1305 1306 define i32 @no_shift_no_xor_multiuse_cmp_and(i32 %x, i32 %y, i32 %z, i32 %w) { 1307 ; CHECK-LABEL: @no_shift_no_xor_multiuse_cmp_and( 1308 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1309 ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0 1310 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -4097 1311 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 1312 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1313 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1314 ; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[AND2]] 1315 ; CHECK-NEXT: ret i32 [[RES2]] 1316 ; 1317 %and = and i32 %x, 4096 1318 %cmp = icmp eq i32 %and, 0 1319 %and2 = and i32 %y, -4097 1320 %select = select i1 %cmp, i32 %y, i32 %and2 1321 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1322 %res = mul i32 %select, %select2 1323 %res2 = mul i32 %res, %and2 ; to bump up the use count of the and 1324 ret i32 %res2 1325 } 1326 1327 define i32 @no_shift_xor_multiuse_cmp_or(i32 %x, i32 %y, i32 %z, i32 %w) { 1328 ; CHECK-LABEL: @no_shift_xor_multiuse_cmp_or( 1329 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1330 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0 1331 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 4096 1332 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[OR]] 1333 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1334 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1335 ; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[OR]] 1336 ; CHECK-NEXT: ret i32 [[RES2]] 1337 ; 1338 %and = and i32 %x, 4096 1339 %cmp = icmp ne i32 0, %and 1340 %or = or i32 %y, 4096 1341 %select = select i1 %cmp, i32 %y, i32 %or 1342 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1343 %res = mul i32 %select, %select2 1344 %res2 = mul i32 %res, %or ; to bump up the use count of the or 1345 ret i32 %res2 1346 } 1347 1348 define i32 @no_shift_xor_multiuse_cmp_xor(i32 %x, i32 %y, i32 %z, i32 %w) { 1349 ; CHECK-LABEL: @no_shift_xor_multiuse_cmp_xor( 1350 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1351 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0 1352 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096 1353 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 1354 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1355 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1356 ; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[XOR]] 1357 ; CHECK-NEXT: ret i32 [[RES2]] 1358 ; 1359 %and = and i32 %x, 4096 1360 %cmp = icmp ne i32 0, %and 1361 %xor = xor i32 %y, 4096 1362 %select = select i1 %cmp, i32 %y, i32 %xor 1363 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1364 %res = mul i32 %select, %select2 1365 %res2 = mul i32 %res, %xor ; to bump up the use count of the xor 1366 ret i32 %res2 1367 } 1368 1369 define i32 @no_shift_xor_multiuse_cmp_and(i32 %x, i32 %y, i32 %z, i32 %w) { 1370 ; CHECK-LABEL: @no_shift_xor_multiuse_cmp_and( 1371 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1372 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0 1373 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], -4097 1374 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 1375 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1376 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1377 ; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[AND2]] 1378 ; CHECK-NEXT: ret i32 [[RES2]] 1379 ; 1380 %and = and i32 %x, 4096 1381 %cmp = icmp ne i32 0, %and 1382 %and2 = and i32 %y, -4097 1383 %select = select i1 %cmp, i32 %y, i32 %and2 1384 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1385 %res = mul i32 %select, %select2 1386 %res2 = mul i32 %res, %and2 ; to bump up the use count of the and 1387 ret i32 %res2 1388 } 1389 1390 define i32 @shift_xor_multiuse_cmp_or(i32 %x, i32 %y, i32 %z, i32 %w) { 1391 ; CHECK-LABEL: @shift_xor_multiuse_cmp_or( 1392 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1393 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0 1394 ; CHECK-NEXT: [[OR:%.*]] = or i32 [[Y:%.*]], 2048 1395 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[OR]] 1396 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1397 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1398 ; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[OR]] 1399 ; CHECK-NEXT: ret i32 [[RES2]] 1400 ; 1401 %and = and i32 %x, 4096 1402 %cmp = icmp ne i32 0, %and 1403 %or = or i32 %y, 2048 1404 %select = select i1 %cmp, i32 %y, i32 %or 1405 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1406 %res = mul i32 %select, %select2 1407 %res2 = mul i32 %res, %or ; to bump up the use count of the or 1408 ret i32 %res2 1409 } 1410 1411 define i32 @shift_xor_multiuse_cmp_xor(i32 %x, i32 %y, i32 %z, i32 %w) { 1412 ; CHECK-LABEL: @shift_xor_multiuse_cmp_xor( 1413 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1414 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0 1415 ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 2048 1416 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]] 1417 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1418 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1419 ; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[XOR]] 1420 ; CHECK-NEXT: ret i32 [[RES2]] 1421 ; 1422 %and = and i32 %x, 4096 1423 %cmp = icmp ne i32 0, %and 1424 %xor = xor i32 %y, 2048 1425 %select = select i1 %cmp, i32 %y, i32 %xor 1426 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1427 %res = mul i32 %select, %select2 1428 %res2 = mul i32 %res, %xor ; to bump up the use count of the xor 1429 ret i32 %res2 1430 } 1431 1432 define i32 @shift_xor_multiuse_cmp_and(i32 %x, i32 %y, i32 %z, i32 %w) { 1433 ; CHECK-LABEL: @shift_xor_multiuse_cmp_and( 1434 ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096 1435 ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0 1436 ; CHECK-NEXT: [[AND2:%.*]] = and i32 [[Y:%.*]], 2048 1437 ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[AND2]] 1438 ; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]] 1439 ; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]] 1440 ; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[AND2]] 1441 ; CHECK-NEXT: ret i32 [[RES2]] 1442 ; 1443 %and = and i32 %x, 4096 1444 %cmp = icmp ne i32 0, %and 1445 %and2 = and i32 %y, 2048 1446 %select = select i1 %cmp, i32 %y, i32 %and2 1447 %select2 = select i1 %cmp, i32 %z, i32 %w ; to bump up use count of the cmp 1448 %res = mul i32 %select, %select2 1449 %res2 = mul i32 %res, %and2 ; to bump up the use count of the and 1450 ret i32 %res2 1451 } 1452