Skip to content

Commit 91af6a7

Browse files
committed
[CVP] Add tests for mask comparisons (NFC)
1 parent f94bbe1 commit 91af6a7

File tree

1 file changed

+132
-0
lines changed
  • llvm/test/Transforms/CorrelatedValuePropagation

1 file changed

+132
-0
lines changed

llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll

+132
Original file line numberDiff line numberDiff line change
@@ -989,4 +989,136 @@ if.false:
989989
ret void
990990
}
991991

992+
define void @test_icmp_mask_two_values(i32 %a) {
993+
; CHECK-LABEL: @test_icmp_mask_two_values(
994+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], -2
995+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 10
996+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
997+
; CHECK: if.true:
998+
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i32 [[A]], 10
999+
; CHECK-NEXT: call void @check1(i1 [[CMP2]])
1000+
; CHECK-NEXT: [[CMP3:%.*]] = icmp ule i32 [[A]], 11
1001+
; CHECK-NEXT: call void @check1(i1 [[CMP3]])
1002+
; CHECK-NEXT: [[CMP4:%.*]] = icmp ult i32 [[A]], 10
1003+
; CHECK-NEXT: call void @check1(i1 [[CMP4]])
1004+
; CHECK-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[A]], 11
1005+
; CHECK-NEXT: call void @check1(i1 [[CMP5]])
1006+
; CHECK-NEXT: ret void
1007+
; CHECK: if.false:
1008+
; CHECK-NEXT: ret void
1009+
;
1010+
%and = and i32 %a, -2
1011+
%cmp = icmp eq i32 %and, 10
1012+
br i1 %cmp, label %if.true, label %if.false
1013+
1014+
if.true:
1015+
%cmp2 = icmp uge i32 %a, 10
1016+
call void @check1(i1 %cmp2)
1017+
%cmp3 = icmp ule i32 %a, 11
1018+
call void @check1(i1 %cmp3)
1019+
%cmp4 = icmp ult i32 %a, 10
1020+
call void @check1(i1 %cmp4)
1021+
%cmp5 = icmp ugt i32 %a, 11
1022+
call void @check1(i1 %cmp5)
1023+
ret void
1024+
1025+
if.false:
1026+
ret void
1027+
}
1028+
1029+
define void @test_icmp_mask_bit_set(i32 %a) {
1030+
; CHECK-LABEL: @test_icmp_mask_bit_set(
1031+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], 32
1032+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 32
1033+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
1034+
; CHECK: if.true:
1035+
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i32 [[A]], 32
1036+
; CHECK-NEXT: call void @check1(i1 [[CMP2]])
1037+
; CHECK-NEXT: [[CMP3:%.*]] = icmp uge i32 [[A]], 33
1038+
; CHECK-NEXT: call void @check1(i1 [[CMP3]])
1039+
; CHECK-NEXT: ret void
1040+
; CHECK: if.false:
1041+
; CHECK-NEXT: ret void
1042+
;
1043+
%and = and i32 %a, 32
1044+
%cmp = icmp eq i32 %and, 32
1045+
br i1 %cmp, label %if.true, label %if.false
1046+
1047+
if.true:
1048+
%cmp2 = icmp uge i32 %a, 32
1049+
call void @check1(i1 %cmp2)
1050+
%cmp3 = icmp uge i32 %a, 33
1051+
call void @check1(i1 %cmp3)
1052+
ret void
1053+
1054+
if.false:
1055+
ret void
1056+
}
1057+
1058+
define void @test_icmp_mask_bit_unset(i32 %a) {
1059+
; CHECK-LABEL: @test_icmp_mask_bit_unset(
1060+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], 32
1061+
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
1062+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
1063+
; CHECK: if.true:
1064+
; CHECK-NEXT: [[CMP2:%.*]] = icmp ule i32 [[A]], -33
1065+
; CHECK-NEXT: call void @check1(i1 [[CMP2]])
1066+
; CHECK-NEXT: [[CMP3:%.*]] = icmp ule i32 [[A]], -34
1067+
; CHECK-NEXT: call void @check1(i1 [[CMP3]])
1068+
; CHECK-NEXT: ret void
1069+
; CHECK: if.false:
1070+
; CHECK-NEXT: ret void
1071+
;
1072+
%and = and i32 %a, 32
1073+
%cmp = icmp eq i32 %and, 0
1074+
br i1 %cmp, label %if.true, label %if.false
1075+
1076+
if.true:
1077+
%cmp2 = icmp ule i32 %a, -33
1078+
call void @check1(i1 %cmp2)
1079+
%cmp3 = icmp ule i32 %a, -34
1080+
call void @check1(i1 %cmp3)
1081+
ret void
1082+
1083+
if.false:
1084+
ret void
1085+
}
1086+
1087+
define void @test_icmp_mask_wrong_predicate(i32 %a) {
1088+
; CHECK-LABEL: @test_icmp_mask_wrong_predicate(
1089+
; CHECK-NEXT: [[AND:%.*]] = and i32 [[A:%.*]], -2
1090+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 10
1091+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
1092+
; CHECK: if.true:
1093+
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i32 [[A]], 10
1094+
; CHECK-NEXT: call void @check1(i1 [[CMP2]])
1095+
; CHECK-NEXT: [[CMP3:%.*]] = icmp ule i32 [[A]], 11
1096+
; CHECK-NEXT: call void @check1(i1 [[CMP3]])
1097+
; CHECK-NEXT: [[CMP4:%.*]] = icmp ult i32 [[A]], 10
1098+
; CHECK-NEXT: call void @check1(i1 [[CMP4]])
1099+
; CHECK-NEXT: [[CMP5:%.*]] = icmp ugt i32 [[A]], 11
1100+
; CHECK-NEXT: call void @check1(i1 [[CMP5]])
1101+
; CHECK-NEXT: ret void
1102+
; CHECK: if.false:
1103+
; CHECK-NEXT: ret void
1104+
;
1105+
%and = and i32 %a, -2
1106+
%cmp = icmp ne i32 %and, 10
1107+
br i1 %cmp, label %if.true, label %if.false
1108+
1109+
if.true:
1110+
%cmp2 = icmp uge i32 %a, 10
1111+
call void @check1(i1 %cmp2)
1112+
%cmp3 = icmp ule i32 %a, 11
1113+
call void @check1(i1 %cmp3)
1114+
%cmp4 = icmp ult i32 %a, 10
1115+
call void @check1(i1 %cmp4)
1116+
%cmp5 = icmp ugt i32 %a, 11
1117+
call void @check1(i1 %cmp5)
1118+
ret void
1119+
1120+
if.false:
1121+
ret void
1122+
}
1123+
9921124
attributes #4 = { noreturn }

0 commit comments

Comments
 (0)