1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2 | FileCheck %s -check-prefixes=X32 3 ; RUN: llc < %s -mtriple=x86_64-linux -mattr=+sse2 | FileCheck %s -check-prefixes=X64,X64-LIN 4 ; RUN: llc < %s -mtriple=x86_64-win32 -mattr=+sse2 | FileCheck %s -check-prefixes=X64,X64-WIN 5 6 ; Though it is undefined, we want xor undef,undef to produce zero. 7 define <4 x i32> @test1() nounwind { 8 ; X32-LABEL: test1: 9 ; X32: # %bb.0: 10 ; X32-NEXT: xorps %xmm0, %xmm0 11 ; X32-NEXT: retl 12 ; 13 ; X64-LABEL: test1: 14 ; X64: # %bb.0: 15 ; X64-NEXT: xorps %xmm0, %xmm0 16 ; X64-NEXT: retq 17 %tmp = xor <4 x i32> undef, undef 18 ret <4 x i32> %tmp 19 } 20 21 ; Though it is undefined, we want xor undef,undef to produce zero. 22 define i32 @test2() nounwind{ 23 ; X32-LABEL: test2: 24 ; X32: # %bb.0: 25 ; X32-NEXT: xorl %eax, %eax 26 ; X32-NEXT: retl 27 ; 28 ; X64-LABEL: test2: 29 ; X64: # %bb.0: 30 ; X64-NEXT: xorl %eax, %eax 31 ; X64-NEXT: retq 32 %tmp = xor i32 undef, undef 33 ret i32 %tmp 34 } 35 36 define i32 @test3(i32 %a, i32 %b) nounwind { 37 ; X32-LABEL: test3: 38 ; X32: # %bb.0: # %entry 39 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 40 ; X32-NEXT: notl %eax 41 ; X32-NEXT: andl {{[0-9]+}}(%esp), %eax 42 ; X32-NEXT: shrl %eax 43 ; X32-NEXT: retl 44 ; 45 ; X64-LIN-LABEL: test3: 46 ; X64-LIN: # %bb.0: # %entry 47 ; X64-LIN-NEXT: notl %esi 48 ; X64-LIN-NEXT: andl %edi, %esi 49 ; X64-LIN-NEXT: shrl %esi 50 ; X64-LIN-NEXT: movl %esi, %eax 51 ; X64-LIN-NEXT: retq 52 ; 53 ; X64-WIN-LABEL: test3: 54 ; X64-WIN: # %bb.0: # %entry 55 ; X64-WIN-NEXT: notl %edx 56 ; X64-WIN-NEXT: andl %ecx, %edx 57 ; X64-WIN-NEXT: shrl %edx 58 ; X64-WIN-NEXT: movl %edx, %eax 59 ; X64-WIN-NEXT: retq 60 entry: 61 %tmp1not = xor i32 %b, -2 62 %tmp3 = and i32 %tmp1not, %a 63 %tmp4 = lshr i32 %tmp3, 1 64 ret i32 %tmp4 65 } 66 67 define i32 @test4(i32 %a, i32 %b) nounwind { 68 ; X32-LABEL: test4: 69 ; X32: # %bb.0: # %entry 70 ; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 71 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 72 ; X32-NEXT: .p2align 4, 0x90 73 ; X32-NEXT: .LBB3_1: # %bb 74 ; X32-NEXT: # =>This Inner Loop Header: Depth=1 75 ; X32-NEXT: xorl %ecx, %eax 76 ; X32-NEXT: movl %eax, %edx 77 ; X32-NEXT: notl %edx 78 ; X32-NEXT: andl %ecx, %edx 79 ; X32-NEXT: addl %edx, %edx 80 ; X32-NEXT: movl %edx, %ecx 81 ; X32-NEXT: jne .LBB3_1 82 ; X32-NEXT: # %bb.2: # %bb12 83 ; X32-NEXT: retl 84 ; 85 ; X64-LIN-LABEL: test4: 86 ; X64-LIN: # %bb.0: # %entry 87 ; X64-LIN-NEXT: .p2align 4, 0x90 88 ; X64-LIN-NEXT: .LBB3_1: # %bb 89 ; X64-LIN-NEXT: # =>This Inner Loop Header: Depth=1 90 ; X64-LIN-NEXT: xorl %esi, %edi 91 ; X64-LIN-NEXT: movl %edi, %eax 92 ; X64-LIN-NEXT: notl %eax 93 ; X64-LIN-NEXT: andl %esi, %eax 94 ; X64-LIN-NEXT: addl %eax, %eax 95 ; X64-LIN-NEXT: movl %eax, %esi 96 ; X64-LIN-NEXT: jne .LBB3_1 97 ; X64-LIN-NEXT: # %bb.2: # %bb12 98 ; X64-LIN-NEXT: movl %edi, %eax 99 ; X64-LIN-NEXT: retq 100 ; 101 ; X64-WIN-LABEL: test4: 102 ; X64-WIN: # %bb.0: # %entry 103 ; X64-WIN-NEXT: .p2align 4, 0x90 104 ; X64-WIN-NEXT: .LBB3_1: # %bb 105 ; X64-WIN-NEXT: # =>This Inner Loop Header: Depth=1 106 ; X64-WIN-NEXT: xorl %edx, %ecx 107 ; X64-WIN-NEXT: movl %ecx, %eax 108 ; X64-WIN-NEXT: notl %eax 109 ; X64-WIN-NEXT: andl %edx, %eax 110 ; X64-WIN-NEXT: addl %eax, %eax 111 ; X64-WIN-NEXT: movl %eax, %edx 112 ; X64-WIN-NEXT: jne .LBB3_1 113 ; X64-WIN-NEXT: # %bb.2: # %bb12 114 ; X64-WIN-NEXT: movl %ecx, %eax 115 ; X64-WIN-NEXT: retq 116 entry: 117 br label %bb 118 bb: 119 %b_addr.0 = phi i32 [ %b, %entry ], [ %tmp8, %bb ] 120 %a_addr.0 = phi i32 [ %a, %entry ], [ %tmp3, %bb ] 121 %tmp3 = xor i32 %a_addr.0, %b_addr.0 122 %tmp4not = xor i32 %tmp3, 2147483647 123 %tmp6 = and i32 %tmp4not, %b_addr.0 124 %tmp8 = shl i32 %tmp6, 1 125 %tmp10 = icmp eq i32 %tmp8, 0 126 br i1 %tmp10, label %bb12, label %bb 127 bb12: 128 ret i32 %tmp3 129 } 130 131 define i16 @test5(i16 %a, i16 %b) nounwind { 132 ; X32-LABEL: test5: 133 ; X32: # %bb.0: # %entry 134 ; X32-NEXT: movzwl {{[0-9]+}}(%esp), %ecx 135 ; X32-NEXT: movzwl {{[0-9]+}}(%esp), %eax 136 ; X32-NEXT: .p2align 4, 0x90 137 ; X32-NEXT: .LBB4_1: # %bb 138 ; X32-NEXT: # =>This Inner Loop Header: Depth=1 139 ; X32-NEXT: xorl %ecx, %eax 140 ; X32-NEXT: movl %eax, %edx 141 ; X32-NEXT: notl %edx 142 ; X32-NEXT: andl %ecx, %edx 143 ; X32-NEXT: addl %edx, %edx 144 ; X32-NEXT: testw %dx, %dx 145 ; X32-NEXT: movl %edx, %ecx 146 ; X32-NEXT: jne .LBB4_1 147 ; X32-NEXT: # %bb.2: # %bb12 148 ; X32-NEXT: # kill: def $ax killed $ax killed $eax 149 ; X32-NEXT: retl 150 ; 151 ; X64-LIN-LABEL: test5: 152 ; X64-LIN: # %bb.0: # %entry 153 ; X64-LIN-NEXT: .p2align 4, 0x90 154 ; X64-LIN-NEXT: .LBB4_1: # %bb 155 ; X64-LIN-NEXT: # =>This Inner Loop Header: Depth=1 156 ; X64-LIN-NEXT: xorl %esi, %edi 157 ; X64-LIN-NEXT: movl %edi, %eax 158 ; X64-LIN-NEXT: notl %eax 159 ; X64-LIN-NEXT: andl %esi, %eax 160 ; X64-LIN-NEXT: addl %eax, %eax 161 ; X64-LIN-NEXT: testw %ax, %ax 162 ; X64-LIN-NEXT: movl %eax, %esi 163 ; X64-LIN-NEXT: jne .LBB4_1 164 ; X64-LIN-NEXT: # %bb.2: # %bb12 165 ; X64-LIN-NEXT: movl %edi, %eax 166 ; X64-LIN-NEXT: retq 167 ; 168 ; X64-WIN-LABEL: test5: 169 ; X64-WIN: # %bb.0: # %entry 170 ; X64-WIN-NEXT: # kill: def $dx killed $dx def $edx 171 ; X64-WIN-NEXT: # kill: def $cx killed $cx def $ecx 172 ; X64-WIN-NEXT: .p2align 4, 0x90 173 ; X64-WIN-NEXT: .LBB4_1: # %bb 174 ; X64-WIN-NEXT: # =>This Inner Loop Header: Depth=1 175 ; X64-WIN-NEXT: xorl %edx, %ecx 176 ; X64-WIN-NEXT: movl %ecx, %eax 177 ; X64-WIN-NEXT: notl %eax 178 ; X64-WIN-NEXT: andl %edx, %eax 179 ; X64-WIN-NEXT: addl %eax, %eax 180 ; X64-WIN-NEXT: testw %ax, %ax 181 ; X64-WIN-NEXT: movl %eax, %edx 182 ; X64-WIN-NEXT: jne .LBB4_1 183 ; X64-WIN-NEXT: # %bb.2: # %bb12 184 ; X64-WIN-NEXT: movl %ecx, %eax 185 ; X64-WIN-NEXT: retq 186 entry: 187 br label %bb 188 bb: 189 %b_addr.0 = phi i16 [ %b, %entry ], [ %tmp8, %bb ] 190 %a_addr.0 = phi i16 [ %a, %entry ], [ %tmp3, %bb ] 191 %tmp3 = xor i16 %a_addr.0, %b_addr.0 192 %tmp4not = xor i16 %tmp3, 32767 193 %tmp6 = and i16 %tmp4not, %b_addr.0 194 %tmp8 = shl i16 %tmp6, 1 195 %tmp10 = icmp eq i16 %tmp8, 0 196 br i1 %tmp10, label %bb12, label %bb 197 bb12: 198 ret i16 %tmp3 199 } 200 201 define i8 @test6(i8 %a, i8 %b) nounwind { 202 ; X32-LABEL: test6: 203 ; X32: # %bb.0: # %entry 204 ; X32-NEXT: movb {{[0-9]+}}(%esp), %cl 205 ; X32-NEXT: movb {{[0-9]+}}(%esp), %al 206 ; X32-NEXT: .p2align 4, 0x90 207 ; X32-NEXT: .LBB5_1: # %bb 208 ; X32-NEXT: # =>This Inner Loop Header: Depth=1 209 ; X32-NEXT: xorb %cl, %al 210 ; X32-NEXT: movl %eax, %edx 211 ; X32-NEXT: notb %dl 212 ; X32-NEXT: andb %cl, %dl 213 ; X32-NEXT: addb %dl, %dl 214 ; X32-NEXT: movl %edx, %ecx 215 ; X32-NEXT: jne .LBB5_1 216 ; X32-NEXT: # %bb.2: # %bb12 217 ; X32-NEXT: retl 218 ; 219 ; X64-LIN-LABEL: test6: 220 ; X64-LIN: # %bb.0: # %entry 221 ; X64-LIN-NEXT: .p2align 4, 0x90 222 ; X64-LIN-NEXT: .LBB5_1: # %bb 223 ; X64-LIN-NEXT: # =>This Inner Loop Header: Depth=1 224 ; X64-LIN-NEXT: xorb %sil, %dil 225 ; X64-LIN-NEXT: movl %edi, %eax 226 ; X64-LIN-NEXT: notb %al 227 ; X64-LIN-NEXT: andb %sil, %al 228 ; X64-LIN-NEXT: addb %al, %al 229 ; X64-LIN-NEXT: movl %eax, %esi 230 ; X64-LIN-NEXT: jne .LBB5_1 231 ; X64-LIN-NEXT: # %bb.2: # %bb12 232 ; X64-LIN-NEXT: movl %edi, %eax 233 ; X64-LIN-NEXT: retq 234 ; 235 ; X64-WIN-LABEL: test6: 236 ; X64-WIN: # %bb.0: # %entry 237 ; X64-WIN-NEXT: .p2align 4, 0x90 238 ; X64-WIN-NEXT: .LBB5_1: # %bb 239 ; X64-WIN-NEXT: # =>This Inner Loop Header: Depth=1 240 ; X64-WIN-NEXT: xorb %dl, %cl 241 ; X64-WIN-NEXT: movl %ecx, %eax 242 ; X64-WIN-NEXT: notb %al 243 ; X64-WIN-NEXT: andb %dl, %al 244 ; X64-WIN-NEXT: addb %al, %al 245 ; X64-WIN-NEXT: movl %eax, %edx 246 ; X64-WIN-NEXT: jne .LBB5_1 247 ; X64-WIN-NEXT: # %bb.2: # %bb12 248 ; X64-WIN-NEXT: movl %ecx, %eax 249 ; X64-WIN-NEXT: retq 250 entry: 251 br label %bb 252 bb: 253 %b_addr.0 = phi i8 [ %b, %entry ], [ %tmp8, %bb ] 254 %a_addr.0 = phi i8 [ %a, %entry ], [ %tmp3, %bb ] 255 %tmp3 = xor i8 %a_addr.0, %b_addr.0 256 %tmp4not = xor i8 %tmp3, 127 257 %tmp6 = and i8 %tmp4not, %b_addr.0 258 %tmp8 = shl i8 %tmp6, 1 259 %tmp10 = icmp eq i8 %tmp8, 0 260 br i1 %tmp10, label %bb12, label %bb 261 bb12: 262 ret i8 %tmp3 263 } 264 265 define i32 @test7(i32 %a, i32 %b) nounwind { 266 ; X32-LABEL: test7: 267 ; X32: # %bb.0: # %entry 268 ; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx 269 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 270 ; X32-NEXT: .p2align 4, 0x90 271 ; X32-NEXT: .LBB6_1: # %bb 272 ; X32-NEXT: # =>This Inner Loop Header: Depth=1 273 ; X32-NEXT: xorl %ecx, %eax 274 ; X32-NEXT: movl %eax, %edx 275 ; X32-NEXT: xorl $2147483646, %edx # imm = 0x7FFFFFFE 276 ; X32-NEXT: andl %ecx, %edx 277 ; X32-NEXT: addl %edx, %edx 278 ; X32-NEXT: movl %edx, %ecx 279 ; X32-NEXT: jne .LBB6_1 280 ; X32-NEXT: # %bb.2: # %bb12 281 ; X32-NEXT: retl 282 ; 283 ; X64-LIN-LABEL: test7: 284 ; X64-LIN: # %bb.0: # %entry 285 ; X64-LIN-NEXT: .p2align 4, 0x90 286 ; X64-LIN-NEXT: .LBB6_1: # %bb 287 ; X64-LIN-NEXT: # =>This Inner Loop Header: Depth=1 288 ; X64-LIN-NEXT: xorl %esi, %edi 289 ; X64-LIN-NEXT: movl %edi, %eax 290 ; X64-LIN-NEXT: xorl $2147483646, %eax # imm = 0x7FFFFFFE 291 ; X64-LIN-NEXT: andl %esi, %eax 292 ; X64-LIN-NEXT: addl %eax, %eax 293 ; X64-LIN-NEXT: movl %eax, %esi 294 ; X64-LIN-NEXT: jne .LBB6_1 295 ; X64-LIN-NEXT: # %bb.2: # %bb12 296 ; X64-LIN-NEXT: movl %edi, %eax 297 ; X64-LIN-NEXT: retq 298 ; 299 ; X64-WIN-LABEL: test7: 300 ; X64-WIN: # %bb.0: # %entry 301 ; X64-WIN-NEXT: .p2align 4, 0x90 302 ; X64-WIN-NEXT: .LBB6_1: # %bb 303 ; X64-WIN-NEXT: # =>This Inner Loop Header: Depth=1 304 ; X64-WIN-NEXT: xorl %edx, %ecx 305 ; X64-WIN-NEXT: movl %ecx, %eax 306 ; X64-WIN-NEXT: xorl $2147483646, %eax # imm = 0x7FFFFFFE 307 ; X64-WIN-NEXT: andl %edx, %eax 308 ; X64-WIN-NEXT: addl %eax, %eax 309 ; X64-WIN-NEXT: movl %eax, %edx 310 ; X64-WIN-NEXT: jne .LBB6_1 311 ; X64-WIN-NEXT: # %bb.2: # %bb12 312 ; X64-WIN-NEXT: movl %ecx, %eax 313 ; X64-WIN-NEXT: retq 314 entry: 315 br label %bb 316 bb: 317 %b_addr.0 = phi i32 [ %b, %entry ], [ %tmp8, %bb ] 318 %a_addr.0 = phi i32 [ %a, %entry ], [ %tmp3, %bb ] 319 %tmp3 = xor i32 %a_addr.0, %b_addr.0 320 %tmp4not = xor i32 %tmp3, 2147483646 321 %tmp6 = and i32 %tmp4not, %b_addr.0 322 %tmp8 = shl i32 %tmp6, 1 323 %tmp10 = icmp eq i32 %tmp8, 0 324 br i1 %tmp10, label %bb12, label %bb 325 bb12: 326 ret i32 %tmp3 327 } 328 329 ; rdar://7553032 330 define i32 @test8(i32 %a) nounwind { 331 ; X32-LABEL: test8: 332 ; X32: # %bb.0: # %entry 333 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 334 ; X32-NEXT: notl %eax 335 ; X32-NEXT: retl 336 ; 337 ; X64-LIN-LABEL: test8: 338 ; X64-LIN: # %bb.0: # %entry 339 ; X64-LIN-NEXT: notl %edi 340 ; X64-LIN-NEXT: movl %edi, %eax 341 ; X64-LIN-NEXT: retq 342 ; 343 ; X64-WIN-LABEL: test8: 344 ; X64-WIN: # %bb.0: # %entry 345 ; X64-WIN-NEXT: notl %ecx 346 ; X64-WIN-NEXT: movl %ecx, %eax 347 ; X64-WIN-NEXT: retq 348 entry: 349 %t1 = sub i32 0, %a 350 %t2 = add i32 %t1, -1 351 ret i32 %t2 352 } 353 354 define i32 @test9(i32 %a) nounwind { 355 ; X32-LABEL: test9: 356 ; X32: # %bb.0: 357 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 358 ; X32-NEXT: notl %eax 359 ; X32-NEXT: andl $4096, %eax # imm = 0x1000 360 ; X32-NEXT: retl 361 ; 362 ; X64-LIN-LABEL: test9: 363 ; X64-LIN: # %bb.0: 364 ; X64-LIN-NEXT: notl %edi 365 ; X64-LIN-NEXT: andl $4096, %edi # imm = 0x1000 366 ; X64-LIN-NEXT: movl %edi, %eax 367 ; X64-LIN-NEXT: retq 368 ; 369 ; X64-WIN-LABEL: test9: 370 ; X64-WIN: # %bb.0: 371 ; X64-WIN-NEXT: notl %ecx 372 ; X64-WIN-NEXT: andl $4096, %ecx # imm = 0x1000 373 ; X64-WIN-NEXT: movl %ecx, %eax 374 ; X64-WIN-NEXT: retq 375 %1 = and i32 %a, 4096 376 %2 = xor i32 %1, 4096 377 ret i32 %2 378 } 379 380 ; PR15948 381 define <4 x i32> @test10(<4 x i32> %a) nounwind { 382 ; X32-LABEL: test10: 383 ; X32: # %bb.0: 384 ; X32-NEXT: andnps {{\.LCPI.*}}, %xmm0 385 ; X32-NEXT: retl 386 ; 387 ; X64-LIN-LABEL: test10: 388 ; X64-LIN: # %bb.0: 389 ; X64-LIN-NEXT: andnps {{.*}}(%rip), %xmm0 390 ; X64-LIN-NEXT: retq 391 ; 392 ; X64-WIN-LABEL: test10: 393 ; X64-WIN: # %bb.0: 394 ; X64-WIN-NEXT: movaps (%rcx), %xmm0 395 ; X64-WIN-NEXT: andnps __xmm@{{.*}}(%rip), %xmm0 396 ; X64-WIN-NEXT: retq 397 %1 = and <4 x i32> %a, <i32 4096, i32 4096, i32 4096, i32 4096> 398 %2 = xor <4 x i32> %1, <i32 4096, i32 4096, i32 4096, i32 4096> 399 ret <4 x i32> %2 400 } 401 402 define i32 @PR17487(i1 %tobool) { 403 ; X32-LABEL: PR17487: 404 ; X32: # %bb.0: 405 ; X32-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 406 ; X32-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 407 ; X32-NEXT: pandn {{\.LCPI.*}}, %xmm0 408 ; X32-NEXT: pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3] 409 ; X32-NEXT: movd %xmm1, %ecx 410 ; X32-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 411 ; X32-NEXT: movd %xmm0, %edx 412 ; X32-NEXT: xorl $1, %edx 413 ; X32-NEXT: xorl %eax, %eax 414 ; X32-NEXT: orl %ecx, %edx 415 ; X32-NEXT: setne %al 416 ; X32-NEXT: retl 417 ; 418 ; X64-LIN-LABEL: PR17487: 419 ; X64-LIN: # %bb.0: 420 ; X64-LIN-NEXT: movd %edi, %xmm0 421 ; X64-LIN-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 422 ; X64-LIN-NEXT: pandn {{.*}}(%rip), %xmm0 423 ; X64-LIN-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 424 ; X64-LIN-NEXT: movq %xmm0, %rcx 425 ; X64-LIN-NEXT: xorl %eax, %eax 426 ; X64-LIN-NEXT: cmpq $1, %rcx 427 ; X64-LIN-NEXT: setne %al 428 ; X64-LIN-NEXT: retq 429 ; 430 ; X64-WIN-LABEL: PR17487: 431 ; X64-WIN: # %bb.0: 432 ; X64-WIN-NEXT: movzbl %cl, %eax 433 ; X64-WIN-NEXT: movd %eax, %xmm0 434 ; X64-WIN-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 435 ; X64-WIN-NEXT: pandn __xmm@{{.*}}(%rip), %xmm0 436 ; X64-WIN-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 437 ; X64-WIN-NEXT: movq %xmm0, %rcx 438 ; X64-WIN-NEXT: xorl %eax, %eax 439 ; X64-WIN-NEXT: cmpq $1, %rcx 440 ; X64-WIN-NEXT: setne %al 441 ; X64-WIN-NEXT: retq 442 %tmp = insertelement <2 x i1> undef, i1 %tobool, i32 1 443 %tmp1 = zext <2 x i1> %tmp to <2 x i64> 444 %tmp2 = xor <2 x i64> %tmp1, <i64 1, i64 1> 445 %tmp3 = extractelement <2 x i64> %tmp2, i32 1 446 %add = add nsw i64 0, %tmp3 447 %cmp6 = icmp ne i64 %add, 1 448 %conv7 = zext i1 %cmp6 to i32 449 ret i32 %conv7 450 } 451 452 define i32 @test11(i32 %b) { 453 ; X32-LABEL: test11: 454 ; X32: # %bb.0: 455 ; X32-NEXT: movb {{[0-9]+}}(%esp), %cl 456 ; X32-NEXT: movl $-2, %eax 457 ; X32-NEXT: roll %cl, %eax 458 ; X32-NEXT: retl 459 ; 460 ; X64-LIN-LABEL: test11: 461 ; X64-LIN: # %bb.0: 462 ; X64-LIN-NEXT: movl $-2, %eax 463 ; X64-LIN-NEXT: movl %edi, %ecx 464 ; X64-LIN-NEXT: roll %cl, %eax 465 ; X64-LIN-NEXT: retq 466 ; 467 ; X64-WIN-LABEL: test11: 468 ; X64-WIN: # %bb.0: 469 ; X64-WIN-NEXT: movl $-2, %eax 470 ; X64-WIN-NEXT: # kill: def $cl killed $cl killed $ecx 471 ; X64-WIN-NEXT: roll %cl, %eax 472 ; X64-WIN-NEXT: retq 473 %shl = shl i32 1, %b 474 %neg = xor i32 %shl, -1 475 ret i32 %neg 476 } 477 478 %struct.ref_s = type { %union.v, i16, i16 } 479 %union.v = type { i64 } 480 481 define %struct.ref_s* @test12(%struct.ref_s* %op, i64 %osbot, i64 %intval) { 482 ; X32-LABEL: test12: 483 ; X32: # %bb.0: 484 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax 485 ; X32-NEXT: notl %eax 486 ; X32-NEXT: leal (%eax,%eax,2), %eax 487 ; X32-NEXT: shll $2, %eax 488 ; X32-NEXT: addl {{[0-9]+}}(%esp), %eax 489 ; X32-NEXT: retl 490 ; 491 ; X64-LIN-LABEL: test12: 492 ; X64-LIN: # %bb.0: 493 ; X64-LIN-NEXT: xorq $-1, %rdx 494 ; X64-LIN-NEXT: shlq $32, %rdx 495 ; X64-LIN-NEXT: sarq $28, %rdx 496 ; X64-LIN-NEXT: leaq (%rdx,%rdi), %rax 497 ; X64-LIN-NEXT: retq 498 ; 499 ; X64-WIN-LABEL: test12: 500 ; X64-WIN: # %bb.0: 501 ; X64-WIN-NEXT: xorq $-1, %r8 502 ; X64-WIN-NEXT: shlq $32, %r8 503 ; X64-WIN-NEXT: sarq $28, %r8 504 ; X64-WIN-NEXT: leaq (%r8,%rcx), %rax 505 ; X64-WIN-NEXT: retq 506 %neg = shl i64 %intval, 32 507 %sext = xor i64 %neg, -4294967296 508 %idx.ext = ashr exact i64 %sext, 32 509 %add.ptr = getelementptr inbounds %struct.ref_s, %struct.ref_s* %op, i64 %idx.ext 510 ret %struct.ref_s* %add.ptr 511 } 512