@@ -488,6 +488,30 @@ define i32 @freeze_ashr_exact(i32 %a0) nounwind {
488
488
ret i32 %z
489
489
}
490
490
491
+ define i32 @freeze_ashr_exact_extra_use (i32 %a0 , ptr %escape ) nounwind {
492
+ ; X86-LABEL: freeze_ashr_exact_extra_use:
493
+ ; X86: # %bb.0:
494
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
495
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
496
+ ; X86-NEXT: sarl $3, %eax
497
+ ; X86-NEXT: movl %eax, (%ecx)
498
+ ; X86-NEXT: sarl $6, %eax
499
+ ; X86-NEXT: retl
500
+ ;
501
+ ; X64-LABEL: freeze_ashr_exact_extra_use:
502
+ ; X64: # %bb.0:
503
+ ; X64-NEXT: movl %edi, %eax
504
+ ; X64-NEXT: sarl $3, %eax
505
+ ; X64-NEXT: movl %eax, (%rsi)
506
+ ; X64-NEXT: sarl $6, %eax
507
+ ; X64-NEXT: retq
508
+ %x = ashr exact i32 %a0 , 3
509
+ %y = freeze i32 %x
510
+ %z = ashr i32 %y , 6
511
+ store i32 %x , ptr %escape
512
+ ret i32 %z
513
+ }
514
+
491
515
define i32 @freeze_ashr_outofrange (i32 %a0 ) nounwind {
492
516
; X86-LABEL: freeze_ashr_outofrange:
493
517
; X86: # %bb.0:
@@ -597,6 +621,30 @@ define i32 @freeze_lshr_exact(i32 %a0) nounwind {
597
621
ret i32 %z
598
622
}
599
623
624
+ define i32 @freeze_lshr_exact_extra_use (i32 %a0 , ptr %escape ) nounwind {
625
+ ; X86-LABEL: freeze_lshr_exact_extra_use:
626
+ ; X86: # %bb.0:
627
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
628
+ ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
629
+ ; X86-NEXT: shrl $3, %eax
630
+ ; X86-NEXT: movl %eax, (%ecx)
631
+ ; X86-NEXT: shrl $5, %eax
632
+ ; X86-NEXT: retl
633
+ ;
634
+ ; X64-LABEL: freeze_lshr_exact_extra_use:
635
+ ; X64: # %bb.0:
636
+ ; X64-NEXT: movl %edi, %eax
637
+ ; X64-NEXT: shrl $3, %eax
638
+ ; X64-NEXT: movl %eax, (%rsi)
639
+ ; X64-NEXT: shrl $5, %eax
640
+ ; X64-NEXT: retq
641
+ %x = lshr exact i32 %a0 , 3
642
+ %y = freeze i32 %x
643
+ %z = lshr i32 %y , 5
644
+ store i32 %x , ptr %escape
645
+ ret i32 %z
646
+ }
647
+
600
648
define i32 @freeze_lshr_outofrange (i32 %a0 ) nounwind {
601
649
; X86-LABEL: freeze_lshr_outofrange:
602
650
; X86: # %bb.0:
0 commit comments