Lines Matching +full:batch +full:- +full:reduce
2 ; RUN: llc -O0 < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mcpu=skylake | FileCheck -…
3 ; RUN: llc -O3 < %s -mtriple=x86_64-linux-generic -verify-machineinstrs -mcpu=skylake | FileCheck -…
6 ; CHECK-O0-LABEL: load_i8:
7 ; CHECK-O0: # %bb.0:
8 ; CHECK-O0-NEXT: movb (%rdi), %al
9 ; CHECK-O0-NEXT: retq
11 ; CHECK-O3-LABEL: load_i8:
12 ; CHECK-O3: # %bb.0:
13 ; CHECK-O3-NEXT: movzbl (%rdi), %eax
14 ; CHECK-O3-NEXT: retq
20 ; CHECK-O0-LABEL: store_i8:
21 ; CHECK-O0: # %bb.0:
22 ; CHECK-O0-NEXT: movb %sil, %al
23 ; CHECK-O0-NEXT: movb %al, (%rdi)
24 ; CHECK-O0-NEXT: retq
26 ; CHECK-O3-LABEL: store_i8:
27 ; CHECK-O3: # %bb.0:
28 ; CHECK-O3-NEXT: movb %sil, (%rdi)
29 ; CHECK-O3-NEXT: retq
35 ; CHECK-O0-LABEL: load_i16:
36 ; CHECK-O0: # %bb.0:
37 ; CHECK-O0-NEXT: movw (%rdi), %ax
38 ; CHECK-O0-NEXT: retq
40 ; CHECK-O3-LABEL: load_i16:
41 ; CHECK-O3: # %bb.0:
42 ; CHECK-O3-NEXT: movzwl (%rdi), %eax
43 ; CHECK-O3-NEXT: retq
50 ; CHECK-O0-LABEL: store_i16:
51 ; CHECK-O0: # %bb.0:
52 ; CHECK-O0-NEXT: movw %si, %ax
53 ; CHECK-O0-NEXT: movw %ax, (%rdi)
54 ; CHECK-O0-NEXT: retq
56 ; CHECK-O3-LABEL: store_i16:
57 ; CHECK-O3: # %bb.0:
58 ; CHECK-O3-NEXT: movw %si, (%rdi)
59 ; CHECK-O3-NEXT: retq
65 ; CHECK-LABEL: load_i32:
67 ; CHECK-NEXT: movl (%rdi), %eax
68 ; CHECK-NEXT: retq
74 ; CHECK-LABEL: store_i32:
76 ; CHECK-NEXT: movl %esi, (%rdi)
77 ; CHECK-NEXT: retq
83 ; CHECK-LABEL: load_i64:
85 ; CHECK-NEXT: movq (%rdi), %rax
86 ; CHECK-NEXT: retq
92 ; CHECK-LABEL: store_i64:
94 ; CHECK-NEXT: movq %rsi, (%rdi)
95 ; CHECK-NEXT: retq
108 ; CHECK-O0-LABEL: narrow_writeback_or:
109 ; CHECK-O0: # %bb.0:
110 ; CHECK-O0-NEXT: movq (%rdi), %rax
111 ; CHECK-O0-NEXT: orq $7, %rax
112 ; CHECK-O0-NEXT: movq %rax, (%rdi)
113 ; CHECK-O0-NEXT: retq
115 ; CHECK-O3-LABEL: narrow_writeback_or:
116 ; CHECK-O3: # %bb.0:
117 ; CHECK-O3-NEXT: orq $7, (%rdi)
118 ; CHECK-O3-NEXT: retq
127 ; CHECK-O0-LABEL: narrow_writeback_and:
128 ; CHECK-O0: # %bb.0:
129 ; CHECK-O0-NEXT: movq (%rdi), %rax
130 ; CHECK-O0-NEXT: # kill: def $eax killed $eax killed $rax
131 ; CHECK-O0-NEXT: andl $-256, %eax
132 ; CHECK-O0-NEXT: # kill: def $rax killed $eax
133 ; CHECK-O0-NEXT: movq %rax, (%rdi)
134 ; CHECK-O0-NEXT: retq
136 ; CHECK-O3-LABEL: narrow_writeback_and:
137 ; CHECK-O3: # %bb.0:
138 ; CHECK-O3-NEXT: movl $4294967040, %eax # imm = 0xFFFFFF00
139 ; CHECK-O3-NEXT: andq %rax, (%rdi)
140 ; CHECK-O3-NEXT: retq
149 ; CHECK-O0-LABEL: narrow_writeback_xor:
150 ; CHECK-O0: # %bb.0:
151 ; CHECK-O0-NEXT: movq (%rdi), %rax
152 ; CHECK-O0-NEXT: xorq $7, %rax
153 ; CHECK-O0-NEXT: movq %rax, (%rdi)
154 ; CHECK-O0-NEXT: retq
156 ; CHECK-O3-LABEL: narrow_writeback_xor:
157 ; CHECK-O3: # %bb.0:
158 ; CHECK-O3-NEXT: xorq $7, (%rdi)
159 ; CHECK-O3-NEXT: retq
166 ;; Next batch of tests are exercising cases where store widening would
178 ; CHECK-LABEL: widen_store:
180 ; CHECK-NEXT: movl %esi, (%rdi)
181 ; CHECK-NEXT: movl %edx, 4(%rdi)
182 ; CHECK-NEXT: retq
193 ; CHECK-LABEL: widen_store_unaligned:
195 ; CHECK-NEXT: movl %esi, (%rdi)
196 ; CHECK-NEXT: movl %edx, 4(%rdi)
197 ; CHECK-NEXT: retq
206 ; CHECK-LABEL: widen_broadcast:
208 ; CHECK-NEXT: movl %esi, (%rdi)
209 ; CHECK-NEXT: movl %esi, 4(%rdi)
210 ; CHECK-NEXT: retq
219 ; CHECK-LABEL: widen_broadcast_unaligned:
221 ; CHECK-NEXT: movl %esi, (%rdi)
222 ; CHECK-NEXT: movl %esi, 4(%rdi)
223 ; CHECK-NEXT: retq
231 ; CHECK-LABEL: load_i128:
233 ; CHECK-NEXT: vmovdqa (%rdi), %xmm0
234 ; CHECK-NEXT: vmovq %xmm0, %rax
235 ; CHECK-NEXT: vpextrq $1, %xmm0, %rdx
236 ; CHECK-NEXT: retq
242 ; CHECK-O0-LABEL: store_i128:
243 ; CHECK-O0: # %bb.0:
244 ; CHECK-O0-NEXT: vmovq %rsi, %xmm0
245 ; CHECK-O0-NEXT: vmovq %rdx, %xmm1
246 ; CHECK-O0-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
247 ; CHECK-O0-NEXT: vmovdqa %xmm0, (%rdi)
248 ; CHECK-O0-NEXT: retq
250 ; CHECK-O3-LABEL: store_i128:
251 ; CHECK-O3: # %bb.0:
252 ; CHECK-O3-NEXT: vmovq %rdx, %xmm0
253 ; CHECK-O3-NEXT: vmovq %rsi, %xmm1
254 ; CHECK-O3-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
255 ; CHECK-O3-NEXT: vmovdqa %xmm0, (%rdi)
256 ; CHECK-O3-NEXT: retq
262 ; CHECK-O0-LABEL: load_i256:
263 ; CHECK-O0: # %bb.0:
264 ; CHECK-O0-NEXT: subq $56, %rsp
265 ; CHECK-O0-NEXT: .cfi_def_cfa_offset 64
266 ; CHECK-O0-NEXT: movq %rdi, %rax
267 ; CHECK-O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
268 ; CHECK-O0-NEXT: movq %rdi, (%rsp) # 8-byte Spill
269 ; CHECK-O0-NEXT: movl $32, %edi
270 ; CHECK-O0-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
271 ; CHECK-O0-NEXT: xorl %ecx, %ecx
272 ; CHECK-O0-NEXT: callq __atomic_load@PLT
273 ; CHECK-O0-NEXT: movq (%rsp), %rdi # 8-byte Reload
274 ; CHECK-O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
275 ; CHECK-O0-NEXT: movq {{[0-9]+}}(%rsp), %rcx
276 ; CHECK-O0-NEXT: movq {{[0-9]+}}(%rsp), %rdx
277 ; CHECK-O0-NEXT: movq {{[0-9]+}}(%rsp), %rsi
278 ; CHECK-O0-NEXT: movq {{[0-9]+}}(%rsp), %r8
279 ; CHECK-O0-NEXT: movq %r8, 24(%rdi)
280 ; CHECK-O0-NEXT: movq %rsi, 16(%rdi)
281 ; CHECK-O0-NEXT: movq %rdx, 8(%rdi)
282 ; CHECK-O0-NEXT: movq %rcx, (%rdi)
283 ; CHECK-O0-NEXT: addq $56, %rsp
284 ; CHECK-O0-NEXT: .cfi_def_cfa_offset 8
285 ; CHECK-O0-NEXT: retq
287 ; CHECK-O3-LABEL: load_i256:
288 ; CHECK-O3: # %bb.0:
289 ; CHECK-O3-NEXT: pushq %rbx
290 ; CHECK-O3-NEXT: .cfi_def_cfa_offset 16
291 ; CHECK-O3-NEXT: subq $32, %rsp
292 ; CHECK-O3-NEXT: .cfi_def_cfa_offset 48
293 ; CHECK-O3-NEXT: .cfi_offset %rbx, -16
294 ; CHECK-O3-NEXT: movq %rdi, %rbx
295 ; CHECK-O3-NEXT: movq %rsp, %rdx
296 ; CHECK-O3-NEXT: movl $32, %edi
297 ; CHECK-O3-NEXT: xorl %ecx, %ecx
298 ; CHECK-O3-NEXT: callq __atomic_load@PLT
299 ; CHECK-O3-NEXT: vmovups (%rsp), %ymm0
300 ; CHECK-O3-NEXT: vmovups %ymm0, (%rbx)
301 ; CHECK-O3-NEXT: movq %rbx, %rax
302 ; CHECK-O3-NEXT: addq $32, %rsp
303 ; CHECK-O3-NEXT: .cfi_def_cfa_offset 16
304 ; CHECK-O3-NEXT: popq %rbx
305 ; CHECK-O3-NEXT: .cfi_def_cfa_offset 8
306 ; CHECK-O3-NEXT: vzeroupper
307 ; CHECK-O3-NEXT: retq
313 ; CHECK-O0-LABEL: store_i256:
314 ; CHECK-O0: # %bb.0:
315 ; CHECK-O0-NEXT: subq $40, %rsp
316 ; CHECK-O0-NEXT: .cfi_def_cfa_offset 48
317 ; CHECK-O0-NEXT: movq %rsi, %rax
318 ; CHECK-O0-NEXT: movq %rdi, %rsi
319 ; CHECK-O0-NEXT: movq %rax, (%rsp)
320 ; CHECK-O0-NEXT: movq %rdx, {{[0-9]+}}(%rsp)
321 ; CHECK-O0-NEXT: movq %rcx, {{[0-9]+}}(%rsp)
322 ; CHECK-O0-NEXT: movq %r8, {{[0-9]+}}(%rsp)
323 ; CHECK-O0-NEXT: movl $32, %edi
324 ; CHECK-O0-NEXT: movq %rsp, %rdx
325 ; CHECK-O0-NEXT: xorl %ecx, %ecx
326 ; CHECK-O0-NEXT: callq __atomic_store@PLT
327 ; CHECK-O0-NEXT: addq $40, %rsp
328 ; CHECK-O0-NEXT: .cfi_def_cfa_offset 8
329 ; CHECK-O0-NEXT: retq
331 ; CHECK-O3-LABEL: store_i256:
332 ; CHECK-O3: # %bb.0:
333 ; CHECK-O3-NEXT: subq $40, %rsp
334 ; CHECK-O3-NEXT: .cfi_def_cfa_offset 48
335 ; CHECK-O3-NEXT: movq %rdi, %rax
336 ; CHECK-O3-NEXT: movq %r8, {{[0-9]+}}(%rsp)
337 ; CHECK-O3-NEXT: movq %rcx, {{[0-9]+}}(%rsp)
338 ; CHECK-O3-NEXT: movq %rdx, {{[0-9]+}}(%rsp)
339 ; CHECK-O3-NEXT: movq %rsi, (%rsp)
340 ; CHECK-O3-NEXT: movq %rsp, %rdx
341 ; CHECK-O3-NEXT: movl $32, %edi
342 ; CHECK-O3-NEXT: movq %rax, %rsi
343 ; CHECK-O3-NEXT: xorl %ecx, %ecx
344 ; CHECK-O3-NEXT: callq __atomic_store@PLT
345 ; CHECK-O3-NEXT: addq $40, %rsp
346 ; CHECK-O3-NEXT: .cfi_def_cfa_offset 8
347 ; CHECK-O3-NEXT: retq
354 ; CHECK-O0-LABEL: vec_store:
355 ; CHECK-O0: # %bb.0:
356 ; CHECK-O0-NEXT: vmovd %xmm0, %ecx
357 ; CHECK-O0-NEXT: vpextrd $1, %xmm0, %eax
358 ; CHECK-O0-NEXT: movl %ecx, (%rdi)
359 ; CHECK-O0-NEXT: movl %eax, 4(%rdi)
360 ; CHECK-O0-NEXT: retq
362 ; CHECK-O3-LABEL: vec_store:
363 ; CHECK-O3: # %bb.0:
364 ; CHECK-O3-NEXT: vmovd %xmm0, %eax
365 ; CHECK-O3-NEXT: vpextrd $1, %xmm0, %ecx
366 ; CHECK-O3-NEXT: movl %eax, (%rdi)
367 ; CHECK-O3-NEXT: movl %ecx, 4(%rdi)
368 ; CHECK-O3-NEXT: retq
379 ; CHECK-O0-LABEL: vec_store_unaligned:
380 ; CHECK-O0: # %bb.0:
381 ; CHECK-O0-NEXT: vmovd %xmm0, %ecx
382 ; CHECK-O0-NEXT: vpextrd $1, %xmm0, %eax
383 ; CHECK-O0-NEXT: movl %ecx, (%rdi)
384 ; CHECK-O0-NEXT: movl %eax, 4(%rdi)
385 ; CHECK-O0-NEXT: retq
387 ; CHECK-O3-LABEL: vec_store_unaligned:
388 ; CHECK-O3: # %bb.0:
389 ; CHECK-O3-NEXT: vmovd %xmm0, %eax
390 ; CHECK-O3-NEXT: vpextrd $1, %xmm0, %ecx
391 ; CHECK-O3-NEXT: movl %eax, (%rdi)
392 ; CHECK-O3-NEXT: movl %ecx, 4(%rdi)
393 ; CHECK-O3-NEXT: retq
407 ; CHECK-LABEL: widen_broadcast2:
409 ; CHECK-NEXT: vmovd %xmm0, %eax
410 ; CHECK-NEXT: movl %eax, (%rdi)
411 ; CHECK-NEXT: movl %eax, 4(%rdi)
412 ; CHECK-NEXT: retq
422 ; CHECK-LABEL: widen_broadcast2_unaligned:
424 ; CHECK-NEXT: vmovd %xmm0, %eax
425 ; CHECK-NEXT: movl %eax, (%rdi)
426 ; CHECK-NEXT: movl %eax, 4(%rdi)
427 ; CHECK-NEXT: retq
437 ; CHECK-LABEL: widen_zero_init:
439 ; CHECK-NEXT: movl $0, (%rdi)
440 ; CHECK-NEXT: movl $0, 4(%rdi)
441 ; CHECK-NEXT: retq
450 ; CHECK-LABEL: widen_zero_init_unaligned:
452 ; CHECK-NEXT: movl $0, (%rdi)
453 ; CHECK-NEXT: movl $0, 4(%rdi)
454 ; CHECK-NEXT: retq
461 ;; The next batch of tests are stressing load folding. Folding is legal
466 ; CHECK-LABEL: load_fold_add1:
468 ; CHECK-NEXT: movq (%rdi), %rax
469 ; CHECK-NEXT: addq $15, %rax
470 ; CHECK-NEXT: retq
477 ; CHECK-LABEL: load_fold_add2:
479 ; CHECK-NEXT: movq %rsi, %rax
480 ; CHECK-NEXT: addq (%rdi), %rax
481 ; CHECK-NEXT: retq
488 ; CHECK-O0-LABEL: load_fold_add3:
489 ; CHECK-O0: # %bb.0:
490 ; CHECK-O0-NEXT: movq (%rdi), %rax
491 ; CHECK-O0-NEXT: addq (%rsi), %rax
492 ; CHECK-O0-NEXT: retq
494 ; CHECK-O3-LABEL: load_fold_add3:
495 ; CHECK-O3: # %bb.0:
496 ; CHECK-O3-NEXT: movq (%rsi), %rax
497 ; CHECK-O3-NEXT: addq (%rdi), %rax
498 ; CHECK-O3-NEXT: retq
507 ; CHECK-O0-LABEL: load_fold_sub1:
508 ; CHECK-O0: # %bb.0:
509 ; CHECK-O0-NEXT: movq (%rdi), %rax
510 ; CHECK-O0-NEXT: subq $15, %rax
511 ; CHECK-O0-NEXT: retq
513 ; CHECK-O3-LABEL: load_fold_sub1:
514 ; CHECK-O3: # %bb.0:
515 ; CHECK-O3-NEXT: movq (%rdi), %rax
516 ; CHECK-O3-NEXT: addq $-15, %rax
517 ; CHECK-O3-NEXT: retq
524 ; CHECK-LABEL: load_fold_sub2:
526 ; CHECK-NEXT: movq (%rdi), %rax
527 ; CHECK-NEXT: subq %rsi, %rax
528 ; CHECK-NEXT: retq
535 ; CHECK-LABEL: load_fold_sub3:
537 ; CHECK-NEXT: movq (%rdi), %rax
538 ; CHECK-NEXT: subq (%rsi), %rax
539 ; CHECK-NEXT: retq
548 ; CHECK-O0-LABEL: load_fold_mul1:
549 ; CHECK-O0: # %bb.0:
550 ; CHECK-O0-NEXT: imulq $15, (%rdi), %rax
551 ; CHECK-O0-NEXT: retq
553 ; CHECK-O3-LABEL: load_fold_mul1:
554 ; CHECK-O3: # %bb.0:
555 ; CHECK-O3-NEXT: movq (%rdi), %rax
556 ; CHECK-O3-NEXT: leaq (%rax,%rax,4), %rax
557 ; CHECK-O3-NEXT: leaq (%rax,%rax,2), %rax
558 ; CHECK-O3-NEXT: retq
565 ; CHECK-LABEL: load_fold_mul2:
567 ; CHECK-NEXT: movq %rsi, %rax
568 ; CHECK-NEXT: imulq (%rdi), %rax
569 ; CHECK-NEXT: retq
576 ; CHECK-O0-LABEL: load_fold_mul3:
577 ; CHECK-O0: # %bb.0:
578 ; CHECK-O0-NEXT: movq (%rdi), %rax
579 ; CHECK-O0-NEXT: imulq (%rsi), %rax
580 ; CHECK-O0-NEXT: retq
582 ; CHECK-O3-LABEL: load_fold_mul3:
583 ; CHECK-O3: # %bb.0:
584 ; CHECK-O3-NEXT: movq (%rsi), %rax
585 ; CHECK-O3-NEXT: imulq (%rdi), %rax
586 ; CHECK-O3-NEXT: retq
595 ; CHECK-O0-LABEL: load_fold_sdiv1:
596 ; CHECK-O0: # %bb.0:
597 ; CHECK-O0-NEXT: movq (%rdi), %rax
598 ; CHECK-O0-NEXT: movl $15, %ecx
599 ; CHECK-O0-NEXT: cqto
600 ; CHECK-O0-NEXT: idivq %rcx
601 ; CHECK-O0-NEXT: retq
603 ; CHECK-O3-LABEL: load_fold_sdiv1:
604 ; CHECK-O3: # %bb.0:
605 ; CHECK-O3-NEXT: movq (%rdi), %rcx
606 ; CHECK-O3-NEXT: movabsq $-8608480567731124087, %rdx # imm = 0x8888888888888889
607 ; CHECK-O3-NEXT: movq %rcx, %rax
608 ; CHECK-O3-NEXT: imulq %rdx
609 ; CHECK-O3-NEXT: addq %rdx, %rcx
610 ; CHECK-O3-NEXT: movq %rcx, %rax
611 ; CHECK-O3-NEXT: shrq $63, %rax
612 ; CHECK-O3-NEXT: sarq $3, %rcx
613 ; CHECK-O3-NEXT: addq %rax, %rcx
614 ; CHECK-O3-NEXT: movq %rcx, %rax
615 ; CHECK-O3-NEXT: retq
623 ; CHECK-O0-LABEL: load_fold_sdiv2:
624 ; CHECK-O0: # %bb.0:
625 ; CHECK-O0-NEXT: movq (%rdi), %rax
626 ; CHECK-O0-NEXT: cqto
627 ; CHECK-O0-NEXT: idivq %rsi
628 ; CHECK-O0-NEXT: retq
630 ; CHECK-O3-LABEL: load_fold_sdiv2:
631 ; CHECK-O3: # %bb.0:
632 ; CHECK-O3-NEXT: movq (%rdi), %rax
633 ; CHECK-O3-NEXT: movq %rax, %rcx
634 ; CHECK-O3-NEXT: orq %rsi, %rcx
635 ; CHECK-O3-NEXT: shrq $32, %rcx
636 ; CHECK-O3-NEXT: je .LBB35_1
637 ; CHECK-O3-NEXT: # %bb.2:
638 ; CHECK-O3-NEXT: cqto
639 ; CHECK-O3-NEXT: idivq %rsi
640 ; CHECK-O3-NEXT: retq
641 ; CHECK-O3-NEXT: .LBB35_1:
642 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
643 ; CHECK-O3-NEXT: xorl %edx, %edx
644 ; CHECK-O3-NEXT: divl %esi
645 ; CHECK-O3-NEXT: # kill: def $eax killed $eax def $rax
646 ; CHECK-O3-NEXT: retq
653 ; CHECK-O0-LABEL: load_fold_sdiv3:
654 ; CHECK-O0: # %bb.0:
655 ; CHECK-O0-NEXT: movq (%rdi), %rax
656 ; CHECK-O0-NEXT: cqto
657 ; CHECK-O0-NEXT: idivq (%rsi)
658 ; CHECK-O0-NEXT: retq
660 ; CHECK-O3-LABEL: load_fold_sdiv3:
661 ; CHECK-O3: # %bb.0:
662 ; CHECK-O3-NEXT: movq (%rdi), %rax
663 ; CHECK-O3-NEXT: movq (%rsi), %rcx
664 ; CHECK-O3-NEXT: movq %rax, %rdx
665 ; CHECK-O3-NEXT: orq %rcx, %rdx
666 ; CHECK-O3-NEXT: shrq $32, %rdx
667 ; CHECK-O3-NEXT: je .LBB36_1
668 ; CHECK-O3-NEXT: # %bb.2:
669 ; CHECK-O3-NEXT: cqto
670 ; CHECK-O3-NEXT: idivq %rcx
671 ; CHECK-O3-NEXT: retq
672 ; CHECK-O3-NEXT: .LBB36_1:
673 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
674 ; CHECK-O3-NEXT: xorl %edx, %edx
675 ; CHECK-O3-NEXT: divl %ecx
676 ; CHECK-O3-NEXT: # kill: def $eax killed $eax def $rax
677 ; CHECK-O3-NEXT: retq
686 ; CHECK-O0-LABEL: load_fold_udiv1:
687 ; CHECK-O0: # %bb.0:
688 ; CHECK-O0-NEXT: movq (%rdi), %rax
689 ; CHECK-O0-NEXT: movl $15, %ecx
690 ; CHECK-O0-NEXT: xorl %edx, %edx
691 ; CHECK-O0-NEXT: # kill: def $rdx killed $edx
692 ; CHECK-O0-NEXT: divq %rcx
693 ; CHECK-O0-NEXT: retq
695 ; CHECK-O3-LABEL: load_fold_udiv1:
696 ; CHECK-O3: # %bb.0:
697 ; CHECK-O3-NEXT: movq (%rdi), %rdx
698 ; CHECK-O3-NEXT: movabsq $-8608480567731124087, %rax # imm = 0x8888888888888889
699 ; CHECK-O3-NEXT: mulxq %rax, %rax, %rax
700 ; CHECK-O3-NEXT: shrq $3, %rax
701 ; CHECK-O3-NEXT: retq
708 ; CHECK-O0-LABEL: load_fold_udiv2:
709 ; CHECK-O0: # %bb.0:
710 ; CHECK-O0-NEXT: movq (%rdi), %rax
711 ; CHECK-O0-NEXT: xorl %ecx, %ecx
712 ; CHECK-O0-NEXT: movl %ecx, %edx
713 ; CHECK-O0-NEXT: divq %rsi
714 ; CHECK-O0-NEXT: retq
716 ; CHECK-O3-LABEL: load_fold_udiv2:
717 ; CHECK-O3: # %bb.0:
718 ; CHECK-O3-NEXT: movq (%rdi), %rax
719 ; CHECK-O3-NEXT: movq %rax, %rcx
720 ; CHECK-O3-NEXT: orq %rsi, %rcx
721 ; CHECK-O3-NEXT: shrq $32, %rcx
722 ; CHECK-O3-NEXT: je .LBB38_1
723 ; CHECK-O3-NEXT: # %bb.2:
724 ; CHECK-O3-NEXT: xorl %edx, %edx
725 ; CHECK-O3-NEXT: divq %rsi
726 ; CHECK-O3-NEXT: retq
727 ; CHECK-O3-NEXT: .LBB38_1:
728 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
729 ; CHECK-O3-NEXT: xorl %edx, %edx
730 ; CHECK-O3-NEXT: divl %esi
731 ; CHECK-O3-NEXT: # kill: def $eax killed $eax def $rax
732 ; CHECK-O3-NEXT: retq
739 ; CHECK-O0-LABEL: load_fold_udiv3:
740 ; CHECK-O0: # %bb.0:
741 ; CHECK-O0-NEXT: movq (%rdi), %rax
742 ; CHECK-O0-NEXT: xorl %ecx, %ecx
743 ; CHECK-O0-NEXT: movl %ecx, %edx
744 ; CHECK-O0-NEXT: divq (%rsi)
745 ; CHECK-O0-NEXT: retq
747 ; CHECK-O3-LABEL: load_fold_udiv3:
748 ; CHECK-O3: # %bb.0:
749 ; CHECK-O3-NEXT: movq (%rdi), %rax
750 ; CHECK-O3-NEXT: movq (%rsi), %rcx
751 ; CHECK-O3-NEXT: movq %rax, %rdx
752 ; CHECK-O3-NEXT: orq %rcx, %rdx
753 ; CHECK-O3-NEXT: shrq $32, %rdx
754 ; CHECK-O3-NEXT: je .LBB39_1
755 ; CHECK-O3-NEXT: # %bb.2:
756 ; CHECK-O3-NEXT: xorl %edx, %edx
757 ; CHECK-O3-NEXT: divq %rcx
758 ; CHECK-O3-NEXT: retq
759 ; CHECK-O3-NEXT: .LBB39_1:
760 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
761 ; CHECK-O3-NEXT: xorl %edx, %edx
762 ; CHECK-O3-NEXT: divl %ecx
763 ; CHECK-O3-NEXT: # kill: def $eax killed $eax def $rax
764 ; CHECK-O3-NEXT: retq
773 ; CHECK-O0-LABEL: load_fold_srem1:
774 ; CHECK-O0: # %bb.0:
775 ; CHECK-O0-NEXT: movq (%rdi), %rax
776 ; CHECK-O0-NEXT: movl $15, %ecx
777 ; CHECK-O0-NEXT: cqto
778 ; CHECK-O0-NEXT: idivq %rcx
779 ; CHECK-O0-NEXT: movq %rdx, %rax
780 ; CHECK-O0-NEXT: retq
782 ; CHECK-O3-LABEL: load_fold_srem1:
783 ; CHECK-O3: # %bb.0:
784 ; CHECK-O3-NEXT: movq (%rdi), %rcx
785 ; CHECK-O3-NEXT: movabsq $-8608480567731124087, %rdx # imm = 0x8888888888888889
786 ; CHECK-O3-NEXT: movq %rcx, %rax
787 ; CHECK-O3-NEXT: imulq %rdx
788 ; CHECK-O3-NEXT: addq %rcx, %rdx
789 ; CHECK-O3-NEXT: movq %rdx, %rax
790 ; CHECK-O3-NEXT: shrq $63, %rax
791 ; CHECK-O3-NEXT: sarq $3, %rdx
792 ; CHECK-O3-NEXT: addq %rax, %rdx
793 ; CHECK-O3-NEXT: leaq (%rdx,%rdx,4), %rax
794 ; CHECK-O3-NEXT: leaq (%rax,%rax,2), %rax
795 ; CHECK-O3-NEXT: subq %rax, %rcx
796 ; CHECK-O3-NEXT: movq %rcx, %rax
797 ; CHECK-O3-NEXT: retq
805 ; CHECK-O0-LABEL: load_fold_srem2:
806 ; CHECK-O0: # %bb.0:
807 ; CHECK-O0-NEXT: movq (%rdi), %rax
808 ; CHECK-O0-NEXT: cqto
809 ; CHECK-O0-NEXT: idivq %rsi
810 ; CHECK-O0-NEXT: movq %rdx, %rax
811 ; CHECK-O0-NEXT: retq
813 ; CHECK-O3-LABEL: load_fold_srem2:
814 ; CHECK-O3: # %bb.0:
815 ; CHECK-O3-NEXT: movq (%rdi), %rax
816 ; CHECK-O3-NEXT: movq %rax, %rcx
817 ; CHECK-O3-NEXT: orq %rsi, %rcx
818 ; CHECK-O3-NEXT: shrq $32, %rcx
819 ; CHECK-O3-NEXT: je .LBB41_1
820 ; CHECK-O3-NEXT: # %bb.2:
821 ; CHECK-O3-NEXT: cqto
822 ; CHECK-O3-NEXT: idivq %rsi
823 ; CHECK-O3-NEXT: movq %rdx, %rax
824 ; CHECK-O3-NEXT: retq
825 ; CHECK-O3-NEXT: .LBB41_1:
826 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
827 ; CHECK-O3-NEXT: xorl %edx, %edx
828 ; CHECK-O3-NEXT: divl %esi
829 ; CHECK-O3-NEXT: movl %edx, %eax
830 ; CHECK-O3-NEXT: retq
837 ; CHECK-O0-LABEL: load_fold_srem3:
838 ; CHECK-O0: # %bb.0:
839 ; CHECK-O0-NEXT: movq (%rdi), %rax
840 ; CHECK-O0-NEXT: cqto
841 ; CHECK-O0-NEXT: idivq (%rsi)
842 ; CHECK-O0-NEXT: movq %rdx, %rax
843 ; CHECK-O0-NEXT: retq
845 ; CHECK-O3-LABEL: load_fold_srem3:
846 ; CHECK-O3: # %bb.0:
847 ; CHECK-O3-NEXT: movq (%rdi), %rax
848 ; CHECK-O3-NEXT: movq (%rsi), %rcx
849 ; CHECK-O3-NEXT: movq %rax, %rdx
850 ; CHECK-O3-NEXT: orq %rcx, %rdx
851 ; CHECK-O3-NEXT: shrq $32, %rdx
852 ; CHECK-O3-NEXT: je .LBB42_1
853 ; CHECK-O3-NEXT: # %bb.2:
854 ; CHECK-O3-NEXT: cqto
855 ; CHECK-O3-NEXT: idivq %rcx
856 ; CHECK-O3-NEXT: movq %rdx, %rax
857 ; CHECK-O3-NEXT: retq
858 ; CHECK-O3-NEXT: .LBB42_1:
859 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
860 ; CHECK-O3-NEXT: xorl %edx, %edx
861 ; CHECK-O3-NEXT: divl %ecx
862 ; CHECK-O3-NEXT: movl %edx, %eax
863 ; CHECK-O3-NEXT: retq
872 ; CHECK-O0-LABEL: load_fold_urem1:
873 ; CHECK-O0: # %bb.0:
874 ; CHECK-O0-NEXT: movq (%rdi), %rax
875 ; CHECK-O0-NEXT: movl $15, %ecx
876 ; CHECK-O0-NEXT: xorl %edx, %edx
877 ; CHECK-O0-NEXT: # kill: def $rdx killed $edx
878 ; CHECK-O0-NEXT: divq %rcx
879 ; CHECK-O0-NEXT: movq %rdx, %rax
880 ; CHECK-O0-NEXT: retq
882 ; CHECK-O3-LABEL: load_fold_urem1:
883 ; CHECK-O3: # %bb.0:
884 ; CHECK-O3-NEXT: movq (%rdi), %rax
885 ; CHECK-O3-NEXT: movabsq $-8608480567731124087, %rcx # imm = 0x8888888888888889
886 ; CHECK-O3-NEXT: movq %rax, %rdx
887 ; CHECK-O3-NEXT: mulxq %rcx, %rcx, %rcx
888 ; CHECK-O3-NEXT: shrq $3, %rcx
889 ; CHECK-O3-NEXT: leaq (%rcx,%rcx,4), %rcx
890 ; CHECK-O3-NEXT: leaq (%rcx,%rcx,2), %rcx
891 ; CHECK-O3-NEXT: subq %rcx, %rax
892 ; CHECK-O3-NEXT: retq
900 ; CHECK-O0-LABEL: load_fold_urem2:
901 ; CHECK-O0: # %bb.0:
902 ; CHECK-O0-NEXT: movq (%rdi), %rax
903 ; CHECK-O0-NEXT: xorl %ecx, %ecx
904 ; CHECK-O0-NEXT: movl %ecx, %edx
905 ; CHECK-O0-NEXT: divq %rsi
906 ; CHECK-O0-NEXT: movq %rdx, %rax
907 ; CHECK-O0-NEXT: retq
909 ; CHECK-O3-LABEL: load_fold_urem2:
910 ; CHECK-O3: # %bb.0:
911 ; CHECK-O3-NEXT: movq (%rdi), %rax
912 ; CHECK-O3-NEXT: movq %rax, %rcx
913 ; CHECK-O3-NEXT: orq %rsi, %rcx
914 ; CHECK-O3-NEXT: shrq $32, %rcx
915 ; CHECK-O3-NEXT: je .LBB44_1
916 ; CHECK-O3-NEXT: # %bb.2:
917 ; CHECK-O3-NEXT: xorl %edx, %edx
918 ; CHECK-O3-NEXT: divq %rsi
919 ; CHECK-O3-NEXT: movq %rdx, %rax
920 ; CHECK-O3-NEXT: retq
921 ; CHECK-O3-NEXT: .LBB44_1:
922 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
923 ; CHECK-O3-NEXT: xorl %edx, %edx
924 ; CHECK-O3-NEXT: divl %esi
925 ; CHECK-O3-NEXT: movl %edx, %eax
926 ; CHECK-O3-NEXT: retq
933 ; CHECK-O0-LABEL: load_fold_urem3:
934 ; CHECK-O0: # %bb.0:
935 ; CHECK-O0-NEXT: movq (%rdi), %rax
936 ; CHECK-O0-NEXT: xorl %ecx, %ecx
937 ; CHECK-O0-NEXT: movl %ecx, %edx
938 ; CHECK-O0-NEXT: divq (%rsi)
939 ; CHECK-O0-NEXT: movq %rdx, %rax
940 ; CHECK-O0-NEXT: retq
942 ; CHECK-O3-LABEL: load_fold_urem3:
943 ; CHECK-O3: # %bb.0:
944 ; CHECK-O3-NEXT: movq (%rdi), %rax
945 ; CHECK-O3-NEXT: movq (%rsi), %rcx
946 ; CHECK-O3-NEXT: movq %rax, %rdx
947 ; CHECK-O3-NEXT: orq %rcx, %rdx
948 ; CHECK-O3-NEXT: shrq $32, %rdx
949 ; CHECK-O3-NEXT: je .LBB45_1
950 ; CHECK-O3-NEXT: # %bb.2:
951 ; CHECK-O3-NEXT: xorl %edx, %edx
952 ; CHECK-O3-NEXT: divq %rcx
953 ; CHECK-O3-NEXT: movq %rdx, %rax
954 ; CHECK-O3-NEXT: retq
955 ; CHECK-O3-NEXT: .LBB45_1:
956 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
957 ; CHECK-O3-NEXT: xorl %edx, %edx
958 ; CHECK-O3-NEXT: divl %ecx
959 ; CHECK-O3-NEXT: movl %edx, %eax
960 ; CHECK-O3-NEXT: retq
969 ; CHECK-LABEL: load_fold_shl1:
971 ; CHECK-NEXT: movq (%rdi), %rax
972 ; CHECK-NEXT: shlq $15, %rax
973 ; CHECK-NEXT: retq
980 ; CHECK-O0-LABEL: load_fold_shl2:
981 ; CHECK-O0: # %bb.0:
982 ; CHECK-O0-NEXT: movq %rsi, %rcx
983 ; CHECK-O0-NEXT: movq (%rdi), %rax
984 ; CHECK-O0-NEXT: # kill: def $cl killed $rcx
985 ; CHECK-O0-NEXT: shlq %cl, %rax
986 ; CHECK-O0-NEXT: retq
988 ; CHECK-O3-LABEL: load_fold_shl2:
989 ; CHECK-O3: # %bb.0:
990 ; CHECK-O3-NEXT: shlxq %rsi, (%rdi), %rax
991 ; CHECK-O3-NEXT: retq
998 ; CHECK-O0-LABEL: load_fold_shl3:
999 ; CHECK-O0: # %bb.0:
1000 ; CHECK-O0-NEXT: movq (%rdi), %rax
1001 ; CHECK-O0-NEXT: movq (%rsi), %rcx
1002 ; CHECK-O0-NEXT: # kill: def $cl killed $rcx
1003 ; CHECK-O0-NEXT: shlq %cl, %rax
1004 ; CHECK-O0-NEXT: retq
1006 ; CHECK-O3-LABEL: load_fold_shl3:
1007 ; CHECK-O3: # %bb.0:
1008 ; CHECK-O3-NEXT: movq (%rsi), %rax
1009 ; CHECK-O3-NEXT: shlxq %rax, (%rdi), %rax
1010 ; CHECK-O3-NEXT: retq
1019 ; CHECK-LABEL: load_fold_lshr1:
1021 ; CHECK-NEXT: movq (%rdi), %rax
1022 ; CHECK-NEXT: shrq $15, %rax
1023 ; CHECK-NEXT: retq
1030 ; CHECK-O0-LABEL: load_fold_lshr2:
1031 ; CHECK-O0: # %bb.0:
1032 ; CHECK-O0-NEXT: movq %rsi, %rcx
1033 ; CHECK-O0-NEXT: movq (%rdi), %rax
1034 ; CHECK-O0-NEXT: # kill: def $cl killed $rcx
1035 ; CHECK-O0-NEXT: shrq %cl, %rax
1036 ; CHECK-O0-NEXT: retq
1038 ; CHECK-O3-LABEL: load_fold_lshr2:
1039 ; CHECK-O3: # %bb.0:
1040 ; CHECK-O3-NEXT: shrxq %rsi, (%rdi), %rax
1041 ; CHECK-O3-NEXT: retq
1048 ; CHECK-O0-LABEL: load_fold_lshr3:
1049 ; CHECK-O0: # %bb.0:
1050 ; CHECK-O0-NEXT: movq (%rdi), %rax
1051 ; CHECK-O0-NEXT: movq (%rsi), %rcx
1052 ; CHECK-O0-NEXT: # kill: def $cl killed $rcx
1053 ; CHECK-O0-NEXT: shrq %cl, %rax
1054 ; CHECK-O0-NEXT: retq
1056 ; CHECK-O3-LABEL: load_fold_lshr3:
1057 ; CHECK-O3: # %bb.0:
1058 ; CHECK-O3-NEXT: movq (%rsi), %rax
1059 ; CHECK-O3-NEXT: shrxq %rax, (%rdi), %rax
1060 ; CHECK-O3-NEXT: retq
1069 ; CHECK-LABEL: load_fold_ashr1:
1071 ; CHECK-NEXT: movq (%rdi), %rax
1072 ; CHECK-NEXT: sarq $15, %rax
1073 ; CHECK-NEXT: retq
1080 ; CHECK-O0-LABEL: load_fold_ashr2:
1081 ; CHECK-O0: # %bb.0:
1082 ; CHECK-O0-NEXT: movq %rsi, %rcx
1083 ; CHECK-O0-NEXT: movq (%rdi), %rax
1084 ; CHECK-O0-NEXT: # kill: def $cl killed $rcx
1085 ; CHECK-O0-NEXT: sarq %cl, %rax
1086 ; CHECK-O0-NEXT: retq
1088 ; CHECK-O3-LABEL: load_fold_ashr2:
1089 ; CHECK-O3: # %bb.0:
1090 ; CHECK-O3-NEXT: sarxq %rsi, (%rdi), %rax
1091 ; CHECK-O3-NEXT: retq
1098 ; CHECK-O0-LABEL: load_fold_ashr3:
1099 ; CHECK-O0: # %bb.0:
1100 ; CHECK-O0-NEXT: movq (%rdi), %rax
1101 ; CHECK-O0-NEXT: movq (%rsi), %rcx
1102 ; CHECK-O0-NEXT: # kill: def $cl killed $rcx
1103 ; CHECK-O0-NEXT: sarq %cl, %rax
1104 ; CHECK-O0-NEXT: retq
1106 ; CHECK-O3-LABEL: load_fold_ashr3:
1107 ; CHECK-O3: # %bb.0:
1108 ; CHECK-O3-NEXT: movq (%rsi), %rax
1109 ; CHECK-O3-NEXT: sarxq %rax, (%rdi), %rax
1110 ; CHECK-O3-NEXT: retq
1119 ; CHECK-O0-LABEL: load_fold_and1:
1120 ; CHECK-O0: # %bb.0:
1121 ; CHECK-O0-NEXT: movq (%rdi), %rax
1122 ; CHECK-O0-NEXT: andq $15, %rax
1123 ; CHECK-O0-NEXT: retq
1125 ; CHECK-O3-LABEL: load_fold_and1:
1126 ; CHECK-O3: # %bb.0:
1127 ; CHECK-O3-NEXT: movq (%rdi), %rax
1128 ; CHECK-O3-NEXT: andl $15, %eax
1129 ; CHECK-O3-NEXT: retq
1136 ; CHECK-LABEL: load_fold_and2:
1138 ; CHECK-NEXT: movq %rsi, %rax
1139 ; CHECK-NEXT: andq (%rdi), %rax
1140 ; CHECK-NEXT: retq
1147 ; CHECK-O0-LABEL: load_fold_and3:
1148 ; CHECK-O0: # %bb.0:
1149 ; CHECK-O0-NEXT: movq (%rdi), %rax
1150 ; CHECK-O0-NEXT: andq (%rsi), %rax
1151 ; CHECK-O0-NEXT: retq
1153 ; CHECK-O3-LABEL: load_fold_and3:
1154 ; CHECK-O3: # %bb.0:
1155 ; CHECK-O3-NEXT: movq (%rsi), %rax
1156 ; CHECK-O3-NEXT: andq (%rdi), %rax
1157 ; CHECK-O3-NEXT: retq
1166 ; CHECK-LABEL: load_fold_or1:
1168 ; CHECK-NEXT: movq (%rdi), %rax
1169 ; CHECK-NEXT: orq $15, %rax
1170 ; CHECK-NEXT: retq
1177 ; CHECK-LABEL: load_fold_or2:
1179 ; CHECK-NEXT: movq %rsi, %rax
1180 ; CHECK-NEXT: orq (%rdi), %rax
1181 ; CHECK-NEXT: retq
1188 ; CHECK-O0-LABEL: load_fold_or3:
1189 ; CHECK-O0: # %bb.0:
1190 ; CHECK-O0-NEXT: movq (%rdi), %rax
1191 ; CHECK-O0-NEXT: orq (%rsi), %rax
1192 ; CHECK-O0-NEXT: retq
1194 ; CHECK-O3-LABEL: load_fold_or3:
1195 ; CHECK-O3: # %bb.0:
1196 ; CHECK-O3-NEXT: movq (%rsi), %rax
1197 ; CHECK-O3-NEXT: orq (%rdi), %rax
1198 ; CHECK-O3-NEXT: retq
1207 ; CHECK-LABEL: load_fold_xor1:
1209 ; CHECK-NEXT: movq (%rdi), %rax
1210 ; CHECK-NEXT: xorq $15, %rax
1211 ; CHECK-NEXT: retq
1218 ; CHECK-LABEL: load_fold_xor2:
1220 ; CHECK-NEXT: movq %rsi, %rax
1221 ; CHECK-NEXT: xorq (%rdi), %rax
1222 ; CHECK-NEXT: retq
1229 ; CHECK-O0-LABEL: load_fold_xor3:
1230 ; CHECK-O0: # %bb.0:
1231 ; CHECK-O0-NEXT: movq (%rdi), %rax
1232 ; CHECK-O0-NEXT: xorq (%rsi), %rax
1233 ; CHECK-O0-NEXT: retq
1235 ; CHECK-O3-LABEL: load_fold_xor3:
1236 ; CHECK-O3: # %bb.0:
1237 ; CHECK-O3-NEXT: movq (%rsi), %rax
1238 ; CHECK-O3-NEXT: xorq (%rdi), %rax
1239 ; CHECK-O3-NEXT: retq
1247 ; CHECK-O0-LABEL: load_fold_icmp1:
1248 ; CHECK-O0: # %bb.0:
1249 ; CHECK-O0-NEXT: movq (%rdi), %rax
1250 ; CHECK-O0-NEXT: subq $15, %rax
1251 ; CHECK-O0-NEXT: sete %al
1252 ; CHECK-O0-NEXT: retq
1254 ; CHECK-O3-LABEL: load_fold_icmp1:
1255 ; CHECK-O3: # %bb.0:
1256 ; CHECK-O3-NEXT: cmpq $15, (%rdi)
1257 ; CHECK-O3-NEXT: sete %al
1258 ; CHECK-O3-NEXT: retq
1265 ; CHECK-O0-LABEL: load_fold_icmp2:
1266 ; CHECK-O0: # %bb.0:
1267 ; CHECK-O0-NEXT: movq (%rdi), %rax
1268 ; CHECK-O0-NEXT: subq %rsi, %rax
1269 ; CHECK-O0-NEXT: sete %al
1270 ; CHECK-O0-NEXT: retq
1272 ; CHECK-O3-LABEL: load_fold_icmp2:
1273 ; CHECK-O3: # %bb.0:
1274 ; CHECK-O3-NEXT: cmpq %rsi, (%rdi)
1275 ; CHECK-O3-NEXT: sete %al
1276 ; CHECK-O3-NEXT: retq
1283 ; CHECK-O0-LABEL: load_fold_icmp3:
1284 ; CHECK-O0: # %bb.0:
1285 ; CHECK-O0-NEXT: movq (%rdi), %rax
1286 ; CHECK-O0-NEXT: movq (%rsi), %rcx
1287 ; CHECK-O0-NEXT: subq %rcx, %rax
1288 ; CHECK-O0-NEXT: sete %al
1289 ; CHECK-O0-NEXT: retq
1291 ; CHECK-O3-LABEL: load_fold_icmp3:
1292 ; CHECK-O3: # %bb.0:
1293 ; CHECK-O3-NEXT: movq (%rsi), %rax
1294 ; CHECK-O3-NEXT: cmpq %rax, (%rdi)
1295 ; CHECK-O3-NEXT: sete %al
1296 ; CHECK-O3-NEXT: retq
1304 ;; The next batch of tests check for read-modify-write patterns
1311 ; CHECK-O0-LABEL: rmw_fold_add1:
1312 ; CHECK-O0: # %bb.0:
1313 ; CHECK-O0-NEXT: movq (%rdi), %rax
1314 ; CHECK-O0-NEXT: addq $15, %rax
1315 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1316 ; CHECK-O0-NEXT: retq
1318 ; CHECK-O3-LABEL: rmw_fold_add1:
1319 ; CHECK-O3: # %bb.0:
1320 ; CHECK-O3-NEXT: addq $15, (%rdi)
1321 ; CHECK-O3-NEXT: retq
1330 ; CHECK-O0-LABEL: rmw_fold_add2:
1331 ; CHECK-O0: # %bb.0:
1332 ; CHECK-O0-NEXT: movq (%rdi), %rax
1333 ; CHECK-O0-NEXT: addq %rsi, %rax
1334 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1335 ; CHECK-O0-NEXT: retq
1337 ; CHECK-O3-LABEL: rmw_fold_add2:
1338 ; CHECK-O3: # %bb.0:
1339 ; CHECK-O3-NEXT: addq %rsi, (%rdi)
1340 ; CHECK-O3-NEXT: retq
1349 ; CHECK-O0-LABEL: rmw_fold_sub1:
1350 ; CHECK-O0: # %bb.0:
1351 ; CHECK-O0-NEXT: movq (%rdi), %rax
1352 ; CHECK-O0-NEXT: addq $-15, %rax
1353 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1354 ; CHECK-O0-NEXT: retq
1356 ; CHECK-O3-LABEL: rmw_fold_sub1:
1357 ; CHECK-O3: # %bb.0:
1358 ; CHECK-O3-NEXT: addq $-15, (%rdi)
1359 ; CHECK-O3-NEXT: retq
1368 ; CHECK-O0-LABEL: rmw_fold_sub2:
1369 ; CHECK-O0: # %bb.0:
1370 ; CHECK-O0-NEXT: movq (%rdi), %rax
1371 ; CHECK-O0-NEXT: subq %rsi, %rax
1372 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1373 ; CHECK-O0-NEXT: retq
1375 ; CHECK-O3-LABEL: rmw_fold_sub2:
1376 ; CHECK-O3: # %bb.0:
1377 ; CHECK-O3-NEXT: subq %rsi, (%rdi)
1378 ; CHECK-O3-NEXT: retq
1387 ; CHECK-LABEL: rmw_fold_mul1:
1389 ; CHECK-NEXT: movq (%rdi), %rax
1390 ; CHECK-NEXT: leaq (%rax,%rax,4), %rax
1391 ; CHECK-NEXT: leaq (%rax,%rax,2), %rax
1392 ; CHECK-NEXT: movq %rax, (%rdi)
1393 ; CHECK-NEXT: retq
1402 ; CHECK-O0-LABEL: rmw_fold_mul2:
1403 ; CHECK-O0: # %bb.0:
1404 ; CHECK-O0-NEXT: movq (%rdi), %rax
1405 ; CHECK-O0-NEXT: imulq %rsi, %rax
1406 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1407 ; CHECK-O0-NEXT: retq
1409 ; CHECK-O3-LABEL: rmw_fold_mul2:
1410 ; CHECK-O3: # %bb.0:
1411 ; CHECK-O3-NEXT: imulq (%rdi), %rsi
1412 ; CHECK-O3-NEXT: movq %rsi, (%rdi)
1413 ; CHECK-O3-NEXT: retq
1422 ; CHECK-O0-LABEL: rmw_fold_sdiv1:
1423 ; CHECK-O0: # %bb.0:
1424 ; CHECK-O0-NEXT: movq (%rdi), %rcx
1425 ; CHECK-O0-NEXT: movabsq $-8608480567731124087, %rdx # imm = 0x8888888888888889
1426 ; CHECK-O0-NEXT: movq %rcx, %rax
1427 ; CHECK-O0-NEXT: imulq %rdx
1428 ; CHECK-O0-NEXT: movq %rdx, %rax
1429 ; CHECK-O0-NEXT: addq %rcx, %rax
1430 ; CHECK-O0-NEXT: movq %rax, %rcx
1431 ; CHECK-O0-NEXT: shrq $63, %rcx
1432 ; CHECK-O0-NEXT: sarq $3, %rax
1433 ; CHECK-O0-NEXT: addq %rcx, %rax
1434 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1435 ; CHECK-O0-NEXT: retq
1437 ; CHECK-O3-LABEL: rmw_fold_sdiv1:
1438 ; CHECK-O3: # %bb.0:
1439 ; CHECK-O3-NEXT: movq (%rdi), %rcx
1440 ; CHECK-O3-NEXT: movabsq $-8608480567731124087, %rdx # imm = 0x8888888888888889
1441 ; CHECK-O3-NEXT: movq %rcx, %rax
1442 ; CHECK-O3-NEXT: imulq %rdx
1443 ; CHECK-O3-NEXT: addq %rcx, %rdx
1444 ; CHECK-O3-NEXT: movq %rdx, %rax
1445 ; CHECK-O3-NEXT: shrq $63, %rax
1446 ; CHECK-O3-NEXT: sarq $3, %rdx
1447 ; CHECK-O3-NEXT: addq %rax, %rdx
1448 ; CHECK-O3-NEXT: movq %rdx, (%rdi)
1449 ; CHECK-O3-NEXT: retq
1458 ; CHECK-O0-LABEL: rmw_fold_sdiv2:
1459 ; CHECK-O0: # %bb.0:
1460 ; CHECK-O0-NEXT: movq (%rdi), %rax
1461 ; CHECK-O0-NEXT: cqto
1462 ; CHECK-O0-NEXT: idivq %rsi
1463 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1464 ; CHECK-O0-NEXT: retq
1466 ; CHECK-O3-LABEL: rmw_fold_sdiv2:
1467 ; CHECK-O3: # %bb.0:
1468 ; CHECK-O3-NEXT: movq (%rdi), %rax
1469 ; CHECK-O3-NEXT: movq %rax, %rcx
1470 ; CHECK-O3-NEXT: orq %rsi, %rcx
1471 ; CHECK-O3-NEXT: shrq $32, %rcx
1472 ; CHECK-O3-NEXT: je .LBB74_1
1473 ; CHECK-O3-NEXT: # %bb.2:
1474 ; CHECK-O3-NEXT: cqto
1475 ; CHECK-O3-NEXT: idivq %rsi
1476 ; CHECK-O3-NEXT: movq %rax, (%rdi)
1477 ; CHECK-O3-NEXT: retq
1478 ; CHECK-O3-NEXT: .LBB74_1:
1479 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
1480 ; CHECK-O3-NEXT: xorl %edx, %edx
1481 ; CHECK-O3-NEXT: divl %esi
1482 ; CHECK-O3-NEXT: # kill: def $eax killed $eax def $rax
1483 ; CHECK-O3-NEXT: movq %rax, (%rdi)
1484 ; CHECK-O3-NEXT: retq
1493 ; CHECK-LABEL: rmw_fold_udiv1:
1495 ; CHECK-NEXT: movq (%rdi), %rdx
1496 ; CHECK-NEXT: movabsq $-8608480567731124087, %rax # imm = 0x8888888888888889
1497 ; CHECK-NEXT: mulxq %rax, %rax, %rax
1498 ; CHECK-NEXT: shrq $3, %rax
1499 ; CHECK-NEXT: movq %rax, (%rdi)
1500 ; CHECK-NEXT: retq
1509 ; CHECK-O0-LABEL: rmw_fold_udiv2:
1510 ; CHECK-O0: # %bb.0:
1511 ; CHECK-O0-NEXT: movq (%rdi), %rax
1512 ; CHECK-O0-NEXT: xorl %ecx, %ecx
1513 ; CHECK-O0-NEXT: movl %ecx, %edx
1514 ; CHECK-O0-NEXT: divq %rsi
1515 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1516 ; CHECK-O0-NEXT: retq
1518 ; CHECK-O3-LABEL: rmw_fold_udiv2:
1519 ; CHECK-O3: # %bb.0:
1520 ; CHECK-O3-NEXT: movq (%rdi), %rax
1521 ; CHECK-O3-NEXT: movq %rax, %rcx
1522 ; CHECK-O3-NEXT: orq %rsi, %rcx
1523 ; CHECK-O3-NEXT: shrq $32, %rcx
1524 ; CHECK-O3-NEXT: je .LBB76_1
1525 ; CHECK-O3-NEXT: # %bb.2:
1526 ; CHECK-O3-NEXT: xorl %edx, %edx
1527 ; CHECK-O3-NEXT: divq %rsi
1528 ; CHECK-O3-NEXT: movq %rax, (%rdi)
1529 ; CHECK-O3-NEXT: retq
1530 ; CHECK-O3-NEXT: .LBB76_1:
1531 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
1532 ; CHECK-O3-NEXT: xorl %edx, %edx
1533 ; CHECK-O3-NEXT: divl %esi
1534 ; CHECK-O3-NEXT: # kill: def $eax killed $eax def $rax
1535 ; CHECK-O3-NEXT: movq %rax, (%rdi)
1536 ; CHECK-O3-NEXT: retq
1545 ; CHECK-O0-LABEL: rmw_fold_srem1:
1546 ; CHECK-O0: # %bb.0:
1547 ; CHECK-O0-NEXT: movq (%rdi), %rax
1548 ; CHECK-O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
1549 ; CHECK-O0-NEXT: movabsq $-8608480567731124087, %rcx # imm = 0x8888888888888889
1550 ; CHECK-O0-NEXT: imulq %rcx
1551 ; CHECK-O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
1552 ; CHECK-O0-NEXT: movq %rdx, %rcx
1553 ; CHECK-O0-NEXT: addq %rax, %rcx
1554 ; CHECK-O0-NEXT: movq %rcx, %rdx
1555 ; CHECK-O0-NEXT: shrq $63, %rdx
1556 ; CHECK-O0-NEXT: sarq $3, %rcx
1557 ; CHECK-O0-NEXT: addq %rdx, %rcx
1558 ; CHECK-O0-NEXT: leaq (%rcx,%rcx,4), %rcx
1559 ; CHECK-O0-NEXT: leaq (%rcx,%rcx,2), %rcx
1560 ; CHECK-O0-NEXT: subq %rcx, %rax
1561 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1562 ; CHECK-O0-NEXT: retq
1564 ; CHECK-O3-LABEL: rmw_fold_srem1:
1565 ; CHECK-O3: # %bb.0:
1566 ; CHECK-O3-NEXT: movq (%rdi), %rcx
1567 ; CHECK-O3-NEXT: movabsq $-8608480567731124087, %rdx # imm = 0x8888888888888889
1568 ; CHECK-O3-NEXT: movq %rcx, %rax
1569 ; CHECK-O3-NEXT: imulq %rdx
1570 ; CHECK-O3-NEXT: addq %rcx, %rdx
1571 ; CHECK-O3-NEXT: movq %rdx, %rax
1572 ; CHECK-O3-NEXT: shrq $63, %rax
1573 ; CHECK-O3-NEXT: sarq $3, %rdx
1574 ; CHECK-O3-NEXT: addq %rax, %rdx
1575 ; CHECK-O3-NEXT: leaq (%rdx,%rdx,4), %rax
1576 ; CHECK-O3-NEXT: leaq (%rax,%rax,2), %rax
1577 ; CHECK-O3-NEXT: subq %rax, %rcx
1578 ; CHECK-O3-NEXT: movq %rcx, (%rdi)
1579 ; CHECK-O3-NEXT: retq
1588 ; CHECK-O0-LABEL: rmw_fold_srem2:
1589 ; CHECK-O0: # %bb.0:
1590 ; CHECK-O0-NEXT: movq (%rdi), %rax
1591 ; CHECK-O0-NEXT: cqto
1592 ; CHECK-O0-NEXT: idivq %rsi
1593 ; CHECK-O0-NEXT: movq %rdx, (%rdi)
1594 ; CHECK-O0-NEXT: retq
1596 ; CHECK-O3-LABEL: rmw_fold_srem2:
1597 ; CHECK-O3: # %bb.0:
1598 ; CHECK-O3-NEXT: movq (%rdi), %rax
1599 ; CHECK-O3-NEXT: movq %rax, %rcx
1600 ; CHECK-O3-NEXT: orq %rsi, %rcx
1601 ; CHECK-O3-NEXT: shrq $32, %rcx
1602 ; CHECK-O3-NEXT: je .LBB78_1
1603 ; CHECK-O3-NEXT: # %bb.2:
1604 ; CHECK-O3-NEXT: cqto
1605 ; CHECK-O3-NEXT: idivq %rsi
1606 ; CHECK-O3-NEXT: movq %rdx, (%rdi)
1607 ; CHECK-O3-NEXT: retq
1608 ; CHECK-O3-NEXT: .LBB78_1:
1609 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
1610 ; CHECK-O3-NEXT: xorl %edx, %edx
1611 ; CHECK-O3-NEXT: divl %esi
1612 ; CHECK-O3-NEXT: # kill: def $edx killed $edx def $rdx
1613 ; CHECK-O3-NEXT: movq %rdx, (%rdi)
1614 ; CHECK-O3-NEXT: retq
1623 ; CHECK-O0-LABEL: rmw_fold_urem1:
1624 ; CHECK-O0: # %bb.0:
1625 ; CHECK-O0-NEXT: movq (%rdi), %rax
1626 ; CHECK-O0-NEXT: movabsq $-8608480567731124087, %rcx # imm = 0x8888888888888889
1627 ; CHECK-O0-NEXT: movq %rax, %rdx
1628 ; CHECK-O0-NEXT: mulxq %rcx, %rcx, %rcx
1629 ; CHECK-O0-NEXT: shrq $3, %rcx
1630 ; CHECK-O0-NEXT: leaq (%rcx,%rcx,4), %rcx
1631 ; CHECK-O0-NEXT: leaq (%rcx,%rcx,2), %rcx
1632 ; CHECK-O0-NEXT: subq %rcx, %rax
1633 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1634 ; CHECK-O0-NEXT: retq
1636 ; CHECK-O3-LABEL: rmw_fold_urem1:
1637 ; CHECK-O3: # %bb.0:
1638 ; CHECK-O3-NEXT: movq (%rdi), %rdx
1639 ; CHECK-O3-NEXT: movabsq $-8608480567731124087, %rax # imm = 0x8888888888888889
1640 ; CHECK-O3-NEXT: mulxq %rax, %rax, %rax
1641 ; CHECK-O3-NEXT: shrq $3, %rax
1642 ; CHECK-O3-NEXT: leaq (%rax,%rax,4), %rax
1643 ; CHECK-O3-NEXT: leaq (%rax,%rax,2), %rax
1644 ; CHECK-O3-NEXT: subq %rax, %rdx
1645 ; CHECK-O3-NEXT: movq %rdx, (%rdi)
1646 ; CHECK-O3-NEXT: retq
1655 ; CHECK-O0-LABEL: rmw_fold_urem2:
1656 ; CHECK-O0: # %bb.0:
1657 ; CHECK-O0-NEXT: movq (%rdi), %rax
1658 ; CHECK-O0-NEXT: xorl %ecx, %ecx
1659 ; CHECK-O0-NEXT: movl %ecx, %edx
1660 ; CHECK-O0-NEXT: divq %rsi
1661 ; CHECK-O0-NEXT: movq %rdx, (%rdi)
1662 ; CHECK-O0-NEXT: retq
1664 ; CHECK-O3-LABEL: rmw_fold_urem2:
1665 ; CHECK-O3: # %bb.0:
1666 ; CHECK-O3-NEXT: movq (%rdi), %rax
1667 ; CHECK-O3-NEXT: movq %rax, %rcx
1668 ; CHECK-O3-NEXT: orq %rsi, %rcx
1669 ; CHECK-O3-NEXT: shrq $32, %rcx
1670 ; CHECK-O3-NEXT: je .LBB80_1
1671 ; CHECK-O3-NEXT: # %bb.2:
1672 ; CHECK-O3-NEXT: xorl %edx, %edx
1673 ; CHECK-O3-NEXT: divq %rsi
1674 ; CHECK-O3-NEXT: movq %rdx, (%rdi)
1675 ; CHECK-O3-NEXT: retq
1676 ; CHECK-O3-NEXT: .LBB80_1:
1677 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
1678 ; CHECK-O3-NEXT: xorl %edx, %edx
1679 ; CHECK-O3-NEXT: divl %esi
1680 ; CHECK-O3-NEXT: # kill: def $edx killed $edx def $rdx
1681 ; CHECK-O3-NEXT: movq %rdx, (%rdi)
1682 ; CHECK-O3-NEXT: retq
1691 ; CHECK-LABEL: rmw_fold_shl1:
1693 ; CHECK-NEXT: movq (%rdi), %rax
1694 ; CHECK-NEXT: shlq $15, %rax
1695 ; CHECK-NEXT: movq %rax, (%rdi)
1696 ; CHECK-NEXT: retq
1705 ; CHECK-O0-LABEL: rmw_fold_shl2:
1706 ; CHECK-O0: # %bb.0:
1707 ; CHECK-O0-NEXT: movq (%rdi), %rax
1708 ; CHECK-O0-NEXT: movb %sil, %dl
1709 ; CHECK-O0-NEXT: # implicit-def: $rcx
1710 ; CHECK-O0-NEXT: movb %dl, %cl
1711 ; CHECK-O0-NEXT: shlxq %rcx, %rax, %rax
1712 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1713 ; CHECK-O0-NEXT: retq
1715 ; CHECK-O3-LABEL: rmw_fold_shl2:
1716 ; CHECK-O3: # %bb.0:
1717 ; CHECK-O3-NEXT: shlxq %rsi, (%rdi), %rax
1718 ; CHECK-O3-NEXT: movq %rax, (%rdi)
1719 ; CHECK-O3-NEXT: retq
1728 ; CHECK-LABEL: rmw_fold_lshr1:
1730 ; CHECK-NEXT: movq (%rdi), %rax
1731 ; CHECK-NEXT: shrq $15, %rax
1732 ; CHECK-NEXT: movq %rax, (%rdi)
1733 ; CHECK-NEXT: retq
1742 ; CHECK-O0-LABEL: rmw_fold_lshr2:
1743 ; CHECK-O0: # %bb.0:
1744 ; CHECK-O0-NEXT: movq (%rdi), %rax
1745 ; CHECK-O0-NEXT: movb %sil, %dl
1746 ; CHECK-O0-NEXT: # implicit-def: $rcx
1747 ; CHECK-O0-NEXT: movb %dl, %cl
1748 ; CHECK-O0-NEXT: shrxq %rcx, %rax, %rax
1749 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1750 ; CHECK-O0-NEXT: retq
1752 ; CHECK-O3-LABEL: rmw_fold_lshr2:
1753 ; CHECK-O3: # %bb.0:
1754 ; CHECK-O3-NEXT: shrxq %rsi, (%rdi), %rax
1755 ; CHECK-O3-NEXT: movq %rax, (%rdi)
1756 ; CHECK-O3-NEXT: retq
1765 ; CHECK-LABEL: rmw_fold_ashr1:
1767 ; CHECK-NEXT: movq (%rdi), %rax
1768 ; CHECK-NEXT: sarq $15, %rax
1769 ; CHECK-NEXT: movq %rax, (%rdi)
1770 ; CHECK-NEXT: retq
1779 ; CHECK-O0-LABEL: rmw_fold_ashr2:
1780 ; CHECK-O0: # %bb.0:
1781 ; CHECK-O0-NEXT: movq (%rdi), %rax
1782 ; CHECK-O0-NEXT: movb %sil, %dl
1783 ; CHECK-O0-NEXT: # implicit-def: $rcx
1784 ; CHECK-O0-NEXT: movb %dl, %cl
1785 ; CHECK-O0-NEXT: sarxq %rcx, %rax, %rax
1786 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1787 ; CHECK-O0-NEXT: retq
1789 ; CHECK-O3-LABEL: rmw_fold_ashr2:
1790 ; CHECK-O3: # %bb.0:
1791 ; CHECK-O3-NEXT: sarxq %rsi, (%rdi), %rax
1792 ; CHECK-O3-NEXT: movq %rax, (%rdi)
1793 ; CHECK-O3-NEXT: retq
1802 ; CHECK-O0-LABEL: rmw_fold_and1:
1803 ; CHECK-O0: # %bb.0:
1804 ; CHECK-O0-NEXT: movq (%rdi), %rax
1805 ; CHECK-O0-NEXT: # kill: def $eax killed $eax killed $rax
1806 ; CHECK-O0-NEXT: andl $15, %eax
1807 ; CHECK-O0-NEXT: # kill: def $rax killed $eax
1808 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1809 ; CHECK-O0-NEXT: retq
1811 ; CHECK-O3-LABEL: rmw_fold_and1:
1812 ; CHECK-O3: # %bb.0:
1813 ; CHECK-O3-NEXT: andq $15, (%rdi)
1814 ; CHECK-O3-NEXT: retq
1823 ; CHECK-O0-LABEL: rmw_fold_and2:
1824 ; CHECK-O0: # %bb.0:
1825 ; CHECK-O0-NEXT: movq (%rdi), %rax
1826 ; CHECK-O0-NEXT: andq %rsi, %rax
1827 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1828 ; CHECK-O0-NEXT: retq
1830 ; CHECK-O3-LABEL: rmw_fold_and2:
1831 ; CHECK-O3: # %bb.0:
1832 ; CHECK-O3-NEXT: andq %rsi, (%rdi)
1833 ; CHECK-O3-NEXT: retq
1842 ; CHECK-O0-LABEL: rmw_fold_or1:
1843 ; CHECK-O0: # %bb.0:
1844 ; CHECK-O0-NEXT: movq (%rdi), %rax
1845 ; CHECK-O0-NEXT: orq $15, %rax
1846 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1847 ; CHECK-O0-NEXT: retq
1849 ; CHECK-O3-LABEL: rmw_fold_or1:
1850 ; CHECK-O3: # %bb.0:
1851 ; CHECK-O3-NEXT: orq $15, (%rdi)
1852 ; CHECK-O3-NEXT: retq
1861 ; CHECK-O0-LABEL: rmw_fold_or2:
1862 ; CHECK-O0: # %bb.0:
1863 ; CHECK-O0-NEXT: movq (%rdi), %rax
1864 ; CHECK-O0-NEXT: orq %rsi, %rax
1865 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1866 ; CHECK-O0-NEXT: retq
1868 ; CHECK-O3-LABEL: rmw_fold_or2:
1869 ; CHECK-O3: # %bb.0:
1870 ; CHECK-O3-NEXT: orq %rsi, (%rdi)
1871 ; CHECK-O3-NEXT: retq
1880 ; CHECK-O0-LABEL: rmw_fold_xor1:
1881 ; CHECK-O0: # %bb.0:
1882 ; CHECK-O0-NEXT: movq (%rdi), %rax
1883 ; CHECK-O0-NEXT: xorq $15, %rax
1884 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1885 ; CHECK-O0-NEXT: retq
1887 ; CHECK-O3-LABEL: rmw_fold_xor1:
1888 ; CHECK-O3: # %bb.0:
1889 ; CHECK-O3-NEXT: xorq $15, (%rdi)
1890 ; CHECK-O3-NEXT: retq
1899 ; CHECK-O0-LABEL: rmw_fold_xor2:
1900 ; CHECK-O0: # %bb.0:
1901 ; CHECK-O0-NEXT: movq (%rdi), %rax
1902 ; CHECK-O0-NEXT: xorq %rsi, %rax
1903 ; CHECK-O0-NEXT: movq %rax, (%rdi)
1904 ; CHECK-O0-NEXT: retq
1906 ; CHECK-O3-LABEL: rmw_fold_xor2:
1907 ; CHECK-O3: # %bb.0:
1908 ; CHECK-O3-NEXT: xorq %rsi, (%rdi)
1909 ; CHECK-O3-NEXT: retq
1916 ;; The next batch test truncations, in combination w/operations which could
1919 ; Legal to reduce the load width (TODO)
1921 ; CHECK-LABEL: fold_trunc:
1923 ; CHECK-NEXT: movq (%rdi), %rax
1924 ; CHECK-NEXT: # kill: def $eax killed $eax killed $rax
1925 ; CHECK-NEXT: retq
1931 ; Legal to reduce the load width and fold the load (TODO)
1933 ; CHECK-O0-LABEL: fold_trunc_add:
1934 ; CHECK-O0: # %bb.0:
1935 ; CHECK-O0-NEXT: movq (%rdi), %rax
1936 ; CHECK-O0-NEXT: # kill: def $eax killed $eax killed $rax
1937 ; CHECK-O0-NEXT: addl %esi, %eax
1938 ; CHECK-O0-NEXT: retq
1940 ; CHECK-O3-LABEL: fold_trunc_add:
1941 ; CHECK-O3: # %bb.0:
1942 ; CHECK-O3-NEXT: movq (%rdi), %rax
1943 ; CHECK-O3-NEXT: addl %esi, %eax
1944 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
1945 ; CHECK-O3-NEXT: retq
1952 ; Legal to reduce the load width and fold the load (TODO)
1954 ; CHECK-O0-LABEL: fold_trunc_and:
1955 ; CHECK-O0: # %bb.0:
1956 ; CHECK-O0-NEXT: movq (%rdi), %rax
1957 ; CHECK-O0-NEXT: # kill: def $eax killed $eax killed $rax
1958 ; CHECK-O0-NEXT: andl %esi, %eax
1959 ; CHECK-O0-NEXT: retq
1961 ; CHECK-O3-LABEL: fold_trunc_and:
1962 ; CHECK-O3: # %bb.0:
1963 ; CHECK-O3-NEXT: movq (%rdi), %rax
1964 ; CHECK-O3-NEXT: andl %esi, %eax
1965 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
1966 ; CHECK-O3-NEXT: retq
1973 ; Legal to reduce the load width and fold the load (TODO)
1975 ; CHECK-O0-LABEL: fold_trunc_or:
1976 ; CHECK-O0: # %bb.0:
1977 ; CHECK-O0-NEXT: movq (%rdi), %rax
1978 ; CHECK-O0-NEXT: # kill: def $eax killed $eax killed $rax
1979 ; CHECK-O0-NEXT: orl %esi, %eax
1980 ; CHECK-O0-NEXT: retq
1982 ; CHECK-O3-LABEL: fold_trunc_or:
1983 ; CHECK-O3: # %bb.0:
1984 ; CHECK-O3-NEXT: movq (%rdi), %rax
1985 ; CHECK-O3-NEXT: orl %esi, %eax
1986 ; CHECK-O3-NEXT: # kill: def $eax killed $eax killed $rax
1987 ; CHECK-O3-NEXT: retq
1995 ; to reduce memory traffic, but this would be illegal for a atomic load
1997 ; CHECK-O0-LABEL: split_load:
1998 ; CHECK-O0: # %bb.0:
1999 ; CHECK-O0-NEXT: movq (%rdi), %rcx
2000 ; CHECK-O0-NEXT: movb %cl, %al
2001 ; CHECK-O0-NEXT: shrq $32, %rcx
2002 ; CHECK-O0-NEXT: # kill: def $cl killed $cl killed $rcx
2003 ; CHECK-O0-NEXT: orb %cl, %al
2004 ; CHECK-O0-NEXT: movzbl %al, %eax
2005 ; CHECK-O0-NEXT: retq
2007 ; CHECK-O3-LABEL: split_load:
2008 ; CHECK-O3: # %bb.0:
2009 ; CHECK-O3-NEXT: movq (%rdi), %rax
2010 ; CHECK-O3-NEXT: movq %rax, %rcx
2011 ; CHECK-O3-NEXT: shrq $32, %rcx
2012 ; CHECK-O3-NEXT: orl %eax, %ecx
2013 ; CHECK-O3-NEXT: movzbl %cl, %eax
2014 ; CHECK-O3-NEXT: retq
2031 ; CHECK-LABEL: constant_folding:
2033 ; CHECK-NEXT: movq (%rdi), %rax
2034 ; CHECK-NEXT: retq
2041 ; CHECK-LABEL: load_forwarding:
2043 ; CHECK-NEXT: movq (%rdi), %rax
2044 ; CHECK-NEXT: orq (%rdi), %rax
2045 ; CHECK-NEXT: retq
2054 ; CHECK-LABEL: store_forward:
2056 ; CHECK-NEXT: movq %rsi, (%rdi)
2057 ; CHECK-NEXT: movq (%rdi), %rax
2058 ; CHECK-NEXT: retq
2066 ; CHECK-LABEL: dead_writeback:
2068 ; CHECK-NEXT: movq (%rdi), %rax
2069 ; CHECK-NEXT: movq %rax, (%rdi)
2070 ; CHECK-NEXT: retq
2078 ; CHECK-LABEL: dead_store:
2080 ; CHECK-NEXT: movq $0, (%rdi)
2081 ; CHECK-NEXT: movq %rsi, (%rdi)
2082 ; CHECK-NEXT: retq
2088 ;; The next batch of tests ensure that we don't try to fold a load into a
2096 ; CHECK-LABEL: nofold_fence:
2098 ; CHECK-NEXT: movq (%rdi), %rax
2099 ; CHECK-NEXT: mfence
2100 ; CHECK-NEXT: addq $15, %rax
2101 ; CHECK-NEXT: retq
2109 ; CHECK-LABEL: nofold_fence_acquire:
2111 ; CHECK-NEXT: movq (%rdi), %rax
2112 ; CHECK-NEXT: #MEMBARRIER
2113 ; CHECK-NEXT: addq $15, %rax
2114 ; CHECK-NEXT: retq
2123 ; CHECK-LABEL: nofold_stfence:
2125 ; CHECK-NEXT: movq (%rdi), %rax
2126 ; CHECK-NEXT: #MEMBARRIER
2127 ; CHECK-NEXT: addq $15, %rax
2128 ; CHECK-NEXT: retq
2140 ; CHECK-O0-LABEL: fold_constant:
2141 ; CHECK-O0: # %bb.0:
2142 ; CHECK-O0-NEXT: movq %rdi, %rax
2143 ; CHECK-O0-NEXT: addq Constant, %rax
2144 ; CHECK-O0-NEXT: retq
2146 ; CHECK-O3-LABEL: fold_constant:
2147 ; CHECK-O3: # %bb.0:
2148 ; CHECK-O3-NEXT: movq %rdi, %rax
2149 ; CHECK-O3-NEXT: addq Constant(%rip), %rax
2150 ; CHECK-O3-NEXT: retq
2157 ; CHECK-LABEL: fold_constant_clobber:
2159 ; CHECK-NEXT: movq Constant(%rip), %rax
2160 ; CHECK-NEXT: movq $5, (%rdi)
2161 ; CHECK-NEXT: addq %rsi, %rax
2162 ; CHECK-NEXT: retq
2170 ; CHECK-LABEL: fold_constant_fence:
2172 ; CHECK-NEXT: movq Constant(%rip), %rax
2173 ; CHECK-NEXT: mfence
2174 ; CHECK-NEXT: addq %rdi, %rax
2175 ; CHECK-NEXT: retq
2183 ; CHECK-LABEL: fold_invariant_clobber:
2185 ; CHECK-NEXT: movq (%rdi), %rax
2186 ; CHECK-NEXT: movq $5, (%rdi)
2187 ; CHECK-NEXT: addq %rsi, %rax
2188 ; CHECK-NEXT: retq
2197 ; CHECK-LABEL: fold_invariant_fence:
2199 ; CHECK-NEXT: movq (%rdi), %rax
2200 ; CHECK-NEXT: mfence
2201 ; CHECK-NEXT: addq %rsi, %rax
2202 ; CHECK-NEXT: retq
2213 ; CHECK-O0-LABEL: load_i8_anyext_i16:
2214 ; CHECK-O0: # %bb.0:
2215 ; CHECK-O0-NEXT: movb (%rdi), %al
2216 ; CHECK-O0-NEXT: movzbl %al, %eax
2217 ; CHECK-O0-NEXT: # kill: def $ax killed $ax killed $eax
2218 ; CHECK-O0-NEXT: retq
2220 ; CHECK-O3-LABEL: load_i8_anyext_i16:
2221 ; CHECK-O3: # %bb.0:
2222 ; CHECK-O3-NEXT: movzbl (%rdi), %eax
2223 ; CHECK-O3-NEXT: # kill: def $ax killed $ax killed $eax
2224 ; CHECK-O3-NEXT: retq
2232 ; CHECK-O0-LABEL: load_i8_anyext_i32:
2233 ; CHECK-O0: # %bb.0:
2234 ; CHECK-O0-NEXT: movb (%rdi), %al
2235 ; CHECK-O0-NEXT: movzbl %al, %eax
2236 ; CHECK-O0-NEXT: retq
2238 ; CHECK-O3-LABEL: load_i8_anyext_i32:
2239 ; CHECK-O3: # %bb.0:
2240 ; CHECK-O3-NEXT: movzbl (%rdi), %eax
2241 ; CHECK-O3-NEXT: retq
2249 ; CHECK-O0-LABEL: load_i16_anyext_i32:
2250 ; CHECK-O0: # %bb.0:
2251 ; CHECK-O0-NEXT: movw (%rdi), %cx
2252 ; CHECK-O0-NEXT: # implicit-def: $eax
2253 ; CHECK-O0-NEXT: movw %cx, %ax
2254 ; CHECK-O0-NEXT: retq
2256 ; CHECK-O3-LABEL: load_i16_anyext_i32:
2257 ; CHECK-O3: # %bb.0:
2258 ; CHECK-O3-NEXT: movzwl (%rdi), %eax
2259 ; CHECK-O3-NEXT: retq
2267 ; CHECK-O0-LABEL: load_i16_anyext_i64:
2268 ; CHECK-O0: # %bb.0:
2269 ; CHECK-O0-NEXT: movw (%rdi), %cx
2270 ; CHECK-O0-NEXT: # implicit-def: $eax
2271 ; CHECK-O0-NEXT: movw %cx, %ax
2272 ; CHECK-O0-NEXT: vmovd %eax, %xmm0
2273 ; CHECK-O0-NEXT: vmovq %xmm0, %rax
2274 ; CHECK-O0-NEXT: retq
2276 ; CHECK-O3-LABEL: load_i16_anyext_i64:
2277 ; CHECK-O3: # %bb.0:
2278 ; CHECK-O3-NEXT: movzwl (%rdi), %eax
2279 ; CHECK-O3-NEXT: vmovd %eax, %xmm0
2280 ; CHECK-O3-NEXT: vmovq %xmm0, %rax
2281 ; CHECK-O3-NEXT: retq
2290 ; CHECK-O0-LABEL: load_combine:
2291 ; CHECK-O0: # %bb.0:
2292 ; CHECK-O0-NEXT: movb (%rdi), %al
2293 ; CHECK-O0-NEXT: movb 1(%rdi), %cl
2294 ; CHECK-O0-NEXT: movzbl %al, %eax
2295 ; CHECK-O0-NEXT: # kill: def $ax killed $ax killed $eax
2296 ; CHECK-O0-NEXT: movzbl %cl, %ecx
2297 ; CHECK-O0-NEXT: # kill: def $cx killed $cx killed $ecx
2298 ; CHECK-O0-NEXT: shlw $8, %cx
2299 ; CHECK-O0-NEXT: orw %cx, %ax
2300 ; CHECK-O0-NEXT: retq
2302 ; CHECK-O3-LABEL: load_combine:
2303 ; CHECK-O3: # %bb.0:
2304 ; CHECK-O3-NEXT: movzbl (%rdi), %ecx
2305 ; CHECK-O3-NEXT: movzbl 1(%rdi), %eax
2306 ; CHECK-O3-NEXT: shll $8, %eax
2307 ; CHECK-O3-NEXT: orl %ecx, %eax
2308 ; CHECK-O3-NEXT: # kill: def $ax killed $ax killed $eax
2309 ; CHECK-O3-NEXT: retq
2321 ; CHECK-O0-LABEL: fold_cmp_over_fence:
2322 ; CHECK-O0: # %bb.0:
2323 ; CHECK-O0-NEXT: movl (%rdi), %eax
2324 ; CHECK-O0-NEXT: mfence
2325 ; CHECK-O0-NEXT: cmpl %eax, %esi
2326 ; CHECK-O0-NEXT: jne .LBB116_2
2327 ; CHECK-O0-NEXT: # %bb.1: # %taken
2328 ; CHECK-O0-NEXT: movb $1, %al
2329 ; CHECK-O0-NEXT: retq
2330 ; CHECK-O0-NEXT: .LBB116_2: # %untaken
2331 ; CHECK-O0-NEXT: xorl %eax, %eax
2332 ; CHECK-O0-NEXT: # kill: def $al killed $al killed $eax
2333 ; CHECK-O0-NEXT: retq
2335 ; CHECK-O3-LABEL: fold_cmp_over_fence:
2336 ; CHECK-O3: # %bb.0:
2337 ; CHECK-O3-NEXT: movl (%rdi), %eax
2338 ; CHECK-O3-NEXT: mfence
2339 ; CHECK-O3-NEXT: cmpl %eax, %esi
2340 ; CHECK-O3-NEXT: jne .LBB116_2
2341 ; CHECK-O3-NEXT: # %bb.1: # %taken
2342 ; CHECK-O3-NEXT: movb $1, %al
2343 ; CHECK-O3-NEXT: retq
2344 ; CHECK-O3-NEXT: .LBB116_2: # %untaken
2345 ; CHECK-O3-NEXT: xorl %eax, %eax
2346 ; CHECK-O3-NEXT: retq