Skip to content

Commit c697d80

Browse files
committed
[InstCombine] Add pre-commit tests. NFC.
1 parent eb21ee4 commit c697d80

File tree

1 file changed

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

1 file changed

+211
-0
lines changed

llvm/test/Transforms/InstCombine/not.ll

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
declare void @use1(i1)
55
declare void @use8(i8)
6+
declare void @f1()
7+
declare void @f2()
68

79
define i32 @test1(i32 %A) {
810
; CHECK-LABEL: @test1(
@@ -858,3 +860,212 @@ define i32 @test_zext(i32 %a, i32 %b){
858860
%not = xor i32 %add, -1
859861
ret i32 %not
860862
}
863+
864+
define void @test_invert_demorgan_or(i32 %a, i32 %b, i1 %cond) {
865+
; CHECK-LABEL: @test_invert_demorgan_or(
866+
; CHECK-NEXT: entry:
867+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i32 [[B1:%.*]], 0
868+
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[B:%.*]], 0
869+
; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP3]], [[CMP2]]
870+
; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[COND:%.*]], true
871+
; CHECK-NEXT: [[MERGE:%.*]] = or i1 [[OR]], [[NOT]]
872+
; CHECK-NEXT: br i1 [[MERGE]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
873+
; CHECK: if.then:
874+
; CHECK-NEXT: call void @f1()
875+
; CHECK-NEXT: unreachable
876+
; CHECK: if.else:
877+
; CHECK-NEXT: call void @f2()
878+
; CHECK-NEXT: unreachable
879+
;
880+
entry:
881+
%cmp1 = icmp eq i32 %a, 0
882+
%cmp2 = icmp ne i32 %b, 0
883+
%or = or i1 %cmp1, %cmp2
884+
%not = xor i1 %cond, true
885+
%merge = or i1 %not, %or
886+
br i1 %merge, label %if.then, label %if.else
887+
if.then:
888+
call void @f1()
889+
unreachable
890+
if.else:
891+
call void @f2()
892+
unreachable
893+
}
894+
895+
define i1 @test_invert_demorgan_or2(i64 %a, i64 %b, i64 %c) {
896+
; CHECK-LABEL: @test_invert_demorgan_or2(
897+
; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i64 [[A:%.*]], 23
898+
; CHECK-NEXT: [[CMP2:%.*]] = icmp ugt i64 [[B:%.*]], 59
899+
; CHECK-NEXT: [[OR1:%.*]] = or i1 [[CMP1]], [[CMP2]]
900+
; CHECK-NEXT: [[CMP3:%.*]] = icmp ugt i64 [[C:%.*]], 59
901+
; CHECK-NEXT: [[OR2:%.*]] = or i1 [[OR1]], [[CMP3]]
902+
; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[OR2]], true
903+
; CHECK-NEXT: ret i1 [[NOT]]
904+
;
905+
%cmp1 = icmp ugt i64 %a, 23
906+
%cmp2 = icmp ugt i64 %b, 59
907+
%or1 = or i1 %cmp1, %cmp2
908+
%cmp3 = icmp ugt i64 %c, 59
909+
%or2 = or i1 %or1, %cmp3
910+
%not = xor i1 %or2, true
911+
ret i1 %not
912+
}
913+
914+
define i1 @test_invert_demorgan_or3(i32 %a, i32 %b) {
915+
; CHECK-LABEL: @test_invert_demorgan_or3(
916+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[A:%.*]], 178206
917+
; CHECK-NEXT: [[V1:%.*]] = add i32 [[B:%.*]], -195102
918+
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[V1]], 1506
919+
; CHECK-NEXT: [[V2:%.*]] = add i32 [[B]], -201547
920+
; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[V2]], 716213
921+
; CHECK-NEXT: [[V3:%.*]] = add i32 [[B]], -918000
922+
; CHECK-NEXT: [[CMP4:%.*]] = icmp ult i32 [[V3]], 196112
923+
; CHECK-NEXT: [[OR1:%.*]] = or i1 [[CMP1]], [[CMP2]]
924+
; CHECK-NEXT: [[OR2:%.*]] = or i1 [[OR1]], [[CMP3]]
925+
; CHECK-NEXT: [[OR3:%.*]] = or i1 [[OR2]], [[CMP4]]
926+
; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[OR3]], true
927+
; CHECK-NEXT: ret i1 [[NOT]]
928+
;
929+
%cmp1 = icmp eq i32 %a, 178206
930+
%v1 = add i32 %b, -195102
931+
%cmp2 = icmp ult i32 %v1, 1506
932+
%v2 = add i32 %b, -201547
933+
%cmp3 = icmp ult i32 %v2, 716213
934+
%v3 = add i32 %b, -918000
935+
%cmp4 = icmp ult i32 %v3, 196112
936+
%or1 = or i1 %cmp1, %cmp2
937+
%or2 = or i1 %or1, %cmp3
938+
%or3 = or i1 %or2, %cmp4
939+
%not = xor i1 %or3, true
940+
ret i1 %not
941+
}
942+
943+
define i1 @test_invert_demorgan_logical_or(i64 %x, i64 %y) {
944+
; CHECK-LABEL: @test_invert_demorgan_logical_or(
945+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i64 [[X:%.*]], 27
946+
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i64 [[Y:%.*]], 0
947+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP1]], i1 true, i1 [[CMP2]]
948+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i64 [[X]], 0
949+
; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP3]], [[SEL]]
950+
; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[OR]], true
951+
; CHECK-NEXT: ret i1 [[NOT]]
952+
;
953+
%cmp1 = icmp eq i64 %x, 27
954+
%cmp2 = icmp eq i64 %y, 0
955+
%sel = select i1 %cmp1, i1 true, i1 %cmp2
956+
%cmp3 = icmp eq i64 %x, 0
957+
%or = or i1 %cmp3, %sel
958+
%not = xor i1 %or, true
959+
ret i1 %not
960+
}
961+
962+
define i1 @test_invert_demorgan_and(i32 %a, i32 %b, i1 %cond) {
963+
; CHECK-LABEL: @test_invert_demorgan_and(
964+
; CHECK-NEXT: entry:
965+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i32 [[B1:%.*]], 0
966+
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[B:%.*]], 0
967+
; CHECK-NEXT: [[AND:%.*]] = and i1 [[CMP3]], [[CMP2]]
968+
; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[COND:%.*]], true
969+
; CHECK-NEXT: [[MERGE:%.*]] = and i1 [[AND]], [[NOT]]
970+
; CHECK-NEXT: br i1 [[MERGE]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
971+
; CHECK: if.then:
972+
; CHECK-NEXT: call void @f1()
973+
; CHECK-NEXT: unreachable
974+
; CHECK: if.else:
975+
; CHECK-NEXT: call void @f2()
976+
; CHECK-NEXT: unreachable
977+
;
978+
entry:
979+
%cmp1 = icmp eq i32 %a, 0
980+
%cmp2 = icmp ne i32 %b, 0
981+
%and = and i1 %cmp1, %cmp2
982+
%not = xor i1 %cond, true
983+
%merge = and i1 %not, %and
984+
br i1 %merge, label %if.then, label %if.else
985+
if.then:
986+
call void @f1()
987+
unreachable
988+
if.else:
989+
call void @f2()
990+
unreachable
991+
}
992+
993+
define i64 @test_invert_demorgan_and2(i64 %x) {
994+
; CHECK-LABEL: @test_invert_demorgan_and2(
995+
; CHECK-NEXT: [[ADD:%.*]] = add i64 [[X:%.*]], 9223372036854775807
996+
; CHECK-NEXT: [[AND:%.*]] = and i64 [[ADD]], 9223372036854775807
997+
; CHECK-NEXT: [[SUB:%.*]] = xor i64 [[AND]], -1
998+
; CHECK-NEXT: ret i64 [[SUB]]
999+
;
1000+
%add = add i64 %x, 9223372036854775807
1001+
%and = and i64 %add, 9223372036854775807
1002+
%sub = xor i64 %and, -1
1003+
ret i64 %sub
1004+
}
1005+
1006+
define i1 @test_invert_demorgan_and3(i32 %a, i32 %b) {
1007+
; CHECK-LABEL: @test_invert_demorgan_and3(
1008+
; CHECK-NEXT: [[NOT:%.*]] = xor i32 [[A:%.*]], -1
1009+
; CHECK-NEXT: [[ADD:%.*]] = add i32 [[NOT]], [[B:%.*]]
1010+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[ADD]], 4095
1011+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
1012+
; CHECK-NEXT: ret i1 [[CMP]]
1013+
;
1014+
%not = xor i32 %a, -1
1015+
%add = add i32 %b, %not
1016+
%and = and i32 %add, 4095
1017+
%cmp = icmp eq i32 %and, 0
1018+
ret i1 %cmp
1019+
}
1020+
1021+
define i1 @test_invert_demorgan_logical_and(i64 %x, i64 %y) {
1022+
; CHECK-LABEL: @test_invert_demorgan_logical_and(
1023+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i64 [[X:%.*]], 27
1024+
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i64 [[Y:%.*]], 0
1025+
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP1]], i1 [[CMP2]], i1 false
1026+
; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i64 [[X]], 0
1027+
; CHECK-NEXT: [[OR:%.*]] = or i1 [[CMP3]], [[SEL]]
1028+
; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[OR]], true
1029+
; CHECK-NEXT: ret i1 [[NOT]]
1030+
;
1031+
%cmp1 = icmp eq i64 %x, 27
1032+
%cmp2 = icmp eq i64 %y, 0
1033+
%sel = select i1 %cmp1, i1 %cmp2, i1 false
1034+
%cmp3 = icmp eq i64 %x, 0
1035+
%or = or i1 %cmp3, %sel
1036+
%not = xor i1 %or, true
1037+
ret i1 %not
1038+
}
1039+
1040+
define i1 @test_invert_demorgan_and_multiuse(i32 %a, i32 %b, i1 %cond) {
1041+
; CHECK-LABEL: @test_invert_demorgan_and_multiuse(
1042+
; CHECK-NEXT: entry:
1043+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[A:%.*]], 0
1044+
; CHECK-NEXT: call void @use1(i1 [[CMP1]])
1045+
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i32 [[B:%.*]], 0
1046+
; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[COND:%.*]], true
1047+
; CHECK-NEXT: [[TMP0:%.*]] = and i1 [[CMP2]], [[NOT]]
1048+
; CHECK-NEXT: [[MERGE:%.*]] = and i1 [[TMP0]], [[CMP1]]
1049+
; CHECK-NEXT: br i1 [[MERGE]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1050+
; CHECK: if.then:
1051+
; CHECK-NEXT: call void @f1()
1052+
; CHECK-NEXT: unreachable
1053+
; CHECK: if.else:
1054+
; CHECK-NEXT: call void @f2()
1055+
; CHECK-NEXT: unreachable
1056+
;
1057+
entry:
1058+
%cmp1 = icmp eq i32 %a, 0
1059+
call void @use1(i1 %cmp1)
1060+
%cmp2 = icmp ne i32 %b, 0
1061+
%and = and i1 %cmp1, %cmp2
1062+
%not = xor i1 %cond, true
1063+
%merge = and i1 %not, %and
1064+
br i1 %merge, label %if.then, label %if.else
1065+
if.then:
1066+
call void @f1()
1067+
unreachable
1068+
if.else:
1069+
call void @f2()
1070+
unreachable
1071+
}

0 commit comments

Comments
 (0)