@@ -541,6 +541,49 @@ define i32 @test26(i32 %x) {
541
541
ret i32 %neg
542
542
}
543
543
544
+ define i64 @test_neg_shl_sub (i64 %a , i64 %b ) {
545
+ ; CHECK-LABEL: @test_neg_shl_sub(
546
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[A:%.*]], [[B:%.*]]
547
+ ; CHECK-NEXT: [[MUL:%.*]] = shl i64 [[SUB]], 2
548
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i64 0, [[MUL]]
549
+ ; CHECK-NEXT: ret i64 [[NEG]]
550
+ ;
551
+ %sub = sub i64 %a , %b
552
+ %mul = shl i64 %sub , 2
553
+ %neg = sub i64 0 , %mul
554
+ ret i64 %neg
555
+ }
556
+
557
+ define i64 @test_neg_shl_sub_extra_use1 (i64 %a , i64 %b , i64* %p ) {
558
+ ; CHECK-LABEL: @test_neg_shl_sub_extra_use1(
559
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[A:%.*]], [[B:%.*]]
560
+ ; CHECK-NEXT: store i64 [[SUB]], i64* [[P:%.*]], align 8
561
+ ; CHECK-NEXT: [[MUL:%.*]] = shl i64 [[SUB]], 2
562
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i64 0, [[MUL]]
563
+ ; CHECK-NEXT: ret i64 [[NEG]]
564
+ ;
565
+ %sub = sub i64 %a , %b
566
+ store i64 %sub , i64* %p
567
+ %mul = shl i64 %sub , 2
568
+ %neg = sub i64 0 , %mul
569
+ ret i64 %neg
570
+ }
571
+
572
+ define i64 @test_neg_shl_sub_extra_use2 (i64 %a , i64 %b , i64* %p ) {
573
+ ; CHECK-LABEL: @test_neg_shl_sub_extra_use2(
574
+ ; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[A:%.*]], [[B:%.*]]
575
+ ; CHECK-NEXT: [[MUL:%.*]] = shl i64 [[SUB]], 2
576
+ ; CHECK-NEXT: store i64 [[MUL]], i64* [[P:%.*]], align 8
577
+ ; CHECK-NEXT: [[NEG:%.*]] = sub i64 0, [[MUL]]
578
+ ; CHECK-NEXT: ret i64 [[NEG]]
579
+ ;
580
+ %sub = sub i64 %a , %b
581
+ %mul = shl i64 %sub , 2
582
+ store i64 %mul , i64* %p
583
+ %neg = sub i64 0 , %mul
584
+ ret i64 %neg
585
+ }
586
+
544
587
define i32 @test27 (i32 %x , i32 %y ) {
545
588
; CHECK-LABEL: @test27(
546
589
; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[Y:%.*]], 3
0 commit comments