@@ -583,6 +583,144 @@ define i64 @test_neg_shl_sub_extra_use2(i64 %a, i64 %b, i64* %p) {
583
583
ret i64 %neg
584
584
}
585
585
586
+ define i64 @test_neg_shl_div (i64 %a ) {
587
+ ; CHECK-LABEL: @test_neg_shl_div(
588
+ ; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 [[A:%.*]], 3
589
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[DIV]], 2
590
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i64 0, [[SHL]]
591
+ ; CHECK-NEXT: ret i64 [[NEG]]
592
+ ;
593
+ %div = sdiv i64 %a , 3
594
+ %shl = shl i64 %div , 2
595
+ %neg = sub i64 0 , %shl
596
+ ret i64 %neg
597
+ }
598
+
599
+ define i64 @test_neg_shl_zext_i1 (i1 %a , i64 %b ) {
600
+ ; CHECK-LABEL: @test_neg_shl_zext_i1(
601
+ ; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[A:%.*]] to i64
602
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[EXT]], [[B:%.*]]
603
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i64 0, [[SHL]]
604
+ ; CHECK-NEXT: ret i64 [[NEG]]
605
+ ;
606
+ %ext = zext i1 %a to i64
607
+ %shl = shl i64 %ext , %b
608
+ %neg = sub i64 0 , %shl
609
+ ret i64 %neg
610
+ }
611
+
612
+ define i64 @test_neg_shl_sext_i1 (i1 %a , i64 %b ) {
613
+ ; CHECK-LABEL: @test_neg_shl_sext_i1(
614
+ ; CHECK-NEXT: [[EXT:%.*]] = sext i1 [[A:%.*]] to i64
615
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[EXT]], [[B:%.*]]
616
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i64 0, [[SHL]]
617
+ ; CHECK-NEXT: ret i64 [[NEG]]
618
+ ;
619
+ %ext = sext i1 %a to i64
620
+ %shl = shl i64 %ext , %b
621
+ %neg = sub i64 0 , %shl
622
+ ret i64 %neg
623
+ }
624
+
625
+ define i64 @test_neg_zext_i1_extra_use (i1 %a , i64 %b , i64* %p ) {
626
+ ; CHECK-LABEL: @test_neg_zext_i1_extra_use(
627
+ ; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[A:%.*]] to i64
628
+ ; CHECK-NEXT: [[NEG:%.*]] = sext i1 [[A]] to i64
629
+ ; CHECK-NEXT: store i64 [[EXT]], i64* [[P:%.*]], align 8
630
+ ; CHECK-NEXT: ret i64 [[NEG]]
631
+ ;
632
+ %ext = zext i1 %a to i64
633
+ %neg = sub i64 0 , %ext
634
+ store i64 %ext , i64* %p
635
+ ret i64 %neg
636
+ }
637
+
638
+ define i64 @test_neg_sext_i1_extra_use (i1 %a , i64 %b , i64* %p ) {
639
+ ; CHECK-LABEL: @test_neg_sext_i1_extra_use(
640
+ ; CHECK-NEXT: [[EXT:%.*]] = sext i1 [[A:%.*]] to i64
641
+ ; CHECK-NEXT: [[NEG:%.*]] = zext i1 [[A]] to i64
642
+ ; CHECK-NEXT: store i64 [[EXT]], i64* [[P:%.*]], align 8
643
+ ; CHECK-NEXT: ret i64 [[NEG]]
644
+ ;
645
+ %ext = sext i1 %a to i64
646
+ %neg = sub i64 0 , %ext
647
+ store i64 %ext , i64* %p
648
+ ret i64 %neg
649
+ }
650
+
651
+ define i32 @test_neg_trunc_shl_sub (i64 %a , i64 %b ) {
652
+ ; CHECK-LABEL: @test_neg_trunc_shl_sub(
653
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[A:%.*]], [[B:%.*]]
654
+ ; CHECK-NEXT: [[SUB_TR:%.*]] = trunc i64 [[SUB]] to i32
655
+ ; CHECK-NEXT: [[TRUNC:%.*]] = shl i32 [[SUB_TR]], 2
656
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i32 0, [[TRUNC]]
657
+ ; CHECK-NEXT: ret i32 [[NEG]]
658
+ ;
659
+ %sub = sub i64 %a , %b
660
+ %shl = shl i64 %sub , 2
661
+ %trunc = trunc i64 %shl to i32
662
+ %neg = sub i32 0 , %trunc
663
+ ret i32 %neg
664
+ }
665
+
666
+ define i32 @test_neg_trunc_shl_ashr (i64 %a , i64 %b ) {
667
+ ; CHECK-LABEL: @test_neg_trunc_shl_ashr(
668
+ ; CHECK-NEXT: [[SHR:%.*]] = ashr i64 [[A:%.*]], 63
669
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[SHR]], [[B:%.*]]
670
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[SHL]] to i32
671
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i32 0, [[TRUNC]]
672
+ ; CHECK-NEXT: ret i32 [[NEG]]
673
+ ;
674
+ %shr = ashr i64 %a , 63
675
+ %shl = shl i64 %shr , %b
676
+ %trunc = trunc i64 %shl to i32
677
+ %neg = sub i32 0 , %trunc
678
+ ret i32 %neg
679
+ }
680
+
681
+ define i32 @test_neg_trunc_shl_lshr (i64 %a , i64 %b ) {
682
+ ; CHECK-LABEL: @test_neg_trunc_shl_lshr(
683
+ ; CHECK-NEXT: [[SHR:%.*]] = lshr i64 [[A:%.*]], 63
684
+ ; CHECK-NEXT: [[SHL:%.*]] = shl i64 [[SHR]], [[B:%.*]]
685
+ ; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 [[SHL]] to i32
686
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i32 0, [[TRUNC]]
687
+ ; CHECK-NEXT: ret i32 [[NEG]]
688
+ ;
689
+ %shr = lshr i64 %a , 63
690
+ %shl = shl i64 %shr , %b
691
+ %trunc = trunc i64 %shl to i32
692
+ %neg = sub i32 0 , %trunc
693
+ ret i32 %neg
694
+ }
695
+
696
+ define i64 @test_neg_mul_sub (i64 %a , i64 %b , i64 %c ) {
697
+ ; CHECK-LABEL: @test_neg_mul_sub(
698
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[A:%.*]], [[B:%.*]]
699
+ ; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[SUB]], [[C:%.*]]
700
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i64 0, [[MUL]]
701
+ ; CHECK-NEXT: ret i64 [[NEG]]
702
+ ;
703
+ %sub = sub i64 %a , %b
704
+ %mul = mul i64 %sub , %c
705
+ %neg = sub i64 0 , %mul
706
+ ret i64 %neg
707
+ }
708
+
709
+ define i64 @test_neg_mul_sub_communted (i64 %a , i64 %b , i64 %c ) {
710
+ ; CHECK-LABEL: @test_neg_mul_sub_communted(
711
+ ; CHECK-NEXT: [[COMPLEX:%.*]] = mul i64 [[C:%.*]], [[C]]
712
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[A:%.*]], [[B:%.*]]
713
+ ; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[COMPLEX]], [[SUB]]
714
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i64 0, [[MUL]]
715
+ ; CHECK-NEXT: ret i64 [[NEG]]
716
+ ;
717
+ %complex = mul i64 %c , %c
718
+ %sub = sub i64 %a , %b
719
+ %mul = mul i64 %complex , %sub
720
+ %neg = sub i64 0 , %mul
721
+ ret i64 %neg
722
+ }
723
+
586
724
define i32 @test27 (i32 %x , i32 %y ) {
587
725
; CHECK-LABEL: @test27(
588
726
; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[Y:%.*]], 3
0 commit comments