Skip to content

Commit 0957748

Browse files
committed
[InstCombine] Add more negation tests; NFC
Additional test cases for pushing negations through various instructions.
1 parent d2a9b87 commit 0957748

File tree

1 file changed

+138
-0
lines changed
  • llvm/test/Transforms/InstCombine

1 file changed

+138
-0
lines changed

llvm/test/Transforms/InstCombine/sub.ll

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,144 @@ define i64 @test_neg_shl_sub_extra_use2(i64 %a, i64 %b, i64* %p) {
583583
ret i64 %neg
584584
}
585585

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+
586724
define i32 @test27(i32 %x, i32 %y) {
587725
; CHECK-LABEL: @test27(
588726
; CHECK-NEXT: [[TMP1:%.*]] = shl i32 [[Y:%.*]], 3

0 commit comments

Comments
 (0)