246 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3 4define i1 @icmp_equality_test(i64 %X, i64 %Y, i64 %Z) {5; CHECK-LABEL: @icmp_equality_test(6; CHECK-NEXT: entry:7; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X:%.*]], [[Y:%.*]]8; CHECK-NEXT: ret i1 [[XEQY]]9;10entry:11 %XeqZ = icmp eq i64 %X, %Z12 %YeqZ = icmp eq i64 %Y, %Z13 %XeqY = icmp eq i64 %X, %Y14 %not.YeqZ = xor i1 %YeqZ, true15 %and = select i1 %not.YeqZ, i1 %XeqY, i1 false16 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and17 ret i1 %equal18}19 20define i1 @icmp_equality_test_constant(i42 %X, i42 %Y) {21; CHECK-LABEL: @icmp_equality_test_constant(22; CHECK-NEXT: entry:23; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i42 [[X:%.*]], [[Y:%.*]]24; CHECK-NEXT: ret i1 [[XEQY]]25;26entry:27 %XeqC = icmp eq i42 %X, -4228 %YeqC = icmp eq i42 %Y, -4229 %XeqY = icmp eq i42 %X, %Y30 %not.YeqC = xor i1 %YeqC, true31 %and = select i1 %not.YeqC, i1 %XeqY, i1 false32 %equal = select i1 %XeqC, i1 %YeqC, i1 %and33 ret i1 %equal34}35 36define i1 @icmp_equality_test_constant_samesign(i42 %X, i42 %Y) {37; CHECK-LABEL: @icmp_equality_test_constant_samesign(38; CHECK-NEXT: entry:39; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i42 [[X:%.*]], [[Y:%.*]]40; CHECK-NEXT: ret i1 [[XEQY]]41;42entry:43 %XeqC = icmp eq i42 %X, -4244 %YeqC = icmp eq i42 %Y, -4245 %XeqY = icmp samesign eq i42 %X, %Y46 %not.YeqC = xor i1 %YeqC, true47 %and = select i1 %not.YeqC, i1 %XeqY, i1 false48 %equal = select i1 %XeqC, i1 %YeqC, i1 %and49 ret i1 %equal50}51 52define i1 @icmp_equality_test_swift_optional_pointers(i64 %X, i64 %Y) {53; CHECK-LABEL: @icmp_equality_test_swift_optional_pointers(54; CHECK-NEXT: entry:55; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X:%.*]], [[Y:%.*]]56; CHECK-NEXT: ret i1 [[XEQY]]57;58entry:59 %XeqC = icmp eq i64 %X, 060 %YeqC = icmp eq i64 %Y, 061 %either = select i1 %XeqC, i1 true, i1 %YeqC62 %both = select i1 %XeqC, i1 %YeqC, i1 false63 %XeqY = icmp eq i64 %X, %Y64 %equal = select i1 %either, i1 %both, i1 %XeqY65 ret i1 %equal66}67 68define <2 x i1> @icmp_equality_test_vector(<2 x i64> %X, <2 x i64> %Y) {69; CHECK-LABEL: @icmp_equality_test_vector(70; CHECK-NEXT: entry:71; CHECK-NEXT: [[XEQY:%.*]] = icmp eq <2 x i64> [[X:%.*]], [[Y:%.*]]72; CHECK-NEXT: ret <2 x i1> [[XEQY]]73;74entry:75 %XeqC = icmp eq <2 x i64> %X, <i64 123, i64 456>76 %YeqC = icmp eq <2 x i64> %Y, <i64 123, i64 456>77 %XeqY = icmp eq <2 x i64> %X, %Y78 %not.YeqC = xor <2 x i1> %YeqC, <i1 true, i1 true>79 %and = select <2 x i1> %not.YeqC, <2 x i1> %XeqY, <2 x i1> <i1 false, i1 false>80 %equal = select <2 x i1> %XeqC, <2 x i1> %YeqC, <2 x i1> %and81 ret <2 x i1> %equal82}83 84define i1 @icmp_equality_test_commute_icmp1(i64 %X, i64 %Y, i64 %Z) {85; CHECK-LABEL: @icmp_equality_test_commute_icmp1(86; CHECK-NEXT: entry:87; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[Y:%.*]], [[X:%.*]]88; CHECK-NEXT: ret i1 [[XEQY]]89;90entry:91 %XeqZ = icmp eq i64 %Z, %X92 %YeqZ = icmp eq i64 %Z, %Y93 %XeqY = icmp eq i64 %Y, %X94 %not.YeqZ = xor i1 %YeqZ, true95 %and = select i1 %not.YeqZ, i1 %XeqY, i1 false96 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and97 ret i1 %equal98}99 100define i1 @icmp_equality_test_commute_icmp2(i64 %X, i64 %Y, i64 %Z) {101; CHECK-LABEL: @icmp_equality_test_commute_icmp2(102; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[Y:%.*]], [[X:%.*]]103; CHECK-NEXT: ret i1 [[XEQY]]104;105 %XeqZ = icmp eq i64 %Z, %X106 %YeqZ = icmp eq i64 %Y, %Z107 %XeqY = icmp eq i64 %Y, %X108 %not.YeqZ = xor i1 %YeqZ, true109 %and = select i1 %not.YeqZ, i1 %XeqY, i1 false110 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and111 ret i1 %equal112}113 114define i1 @icmp_equality_test_commute_select1(i64 %X, i64 %Y, i64 %Z) {115; CHECK-LABEL: @icmp_equality_test_commute_select1(116; CHECK-NEXT: entry:117; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X:%.*]], [[Y:%.*]]118; CHECK-NEXT: ret i1 [[XEQY]]119;120entry:121 %XeqZ = icmp eq i64 %X, %Z122 %YeqZ = icmp eq i64 %Y, %Z123 %XeqY = icmp eq i64 %X, %Y124 %and = select i1 %YeqZ, i1 false, i1 %XeqY125 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and126 ret i1 %equal127}128 129define i1 @icmp_equality_test_commute_select2(i64 %X, i64 %Y, i64 %Z) {130; CHECK-LABEL: @icmp_equality_test_commute_select2(131; CHECK-NEXT: entry:132; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X:%.*]], [[Y:%.*]]133; CHECK-NEXT: ret i1 [[XEQY]]134;135entry:136 %XeqZ = icmp eq i64 %X, %Z137 %YeqZ = icmp eq i64 %Y, %Z138 %XeqY = icmp eq i64 %X, %Y139 %not.XeqZ = xor i1 %XeqZ, true140 %and = select i1 %YeqZ, i1 false, i1 %XeqY141 %equal = select i1 %not.XeqZ, i1 %and, i1 %YeqZ142 ret i1 %equal143}144 145; Negative tests below146 147define i1 @icmp_equality_test_wrong_constant(i64 %X, i64 %Y) {148; CHECK-LABEL: @icmp_equality_test_wrong_constant(149; CHECK-NEXT: entry:150; CHECK-NEXT: [[XEQC:%.*]] = icmp eq i64 [[X:%.*]], 0151; CHECK-NEXT: [[YEQC:%.*]] = icmp eq i64 [[Y:%.*]], 999152; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X]], [[Y]]153; CHECK-NEXT: [[NOT_YEQC:%.*]] = xor i1 [[YEQC]], true154; CHECK-NEXT: [[AND:%.*]] = select i1 [[NOT_YEQC]], i1 [[XEQY]], i1 false155; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQC]], i1 [[YEQC]], i1 [[AND]]156; CHECK-NEXT: ret i1 [[EQUAL]]157;158entry:159 %XeqC = icmp eq i64 %X, 0160 %YeqC = icmp eq i64 %Y, 999161 %XeqY = icmp eq i64 %X, %Y162 %not.YeqC = xor i1 %YeqC, true163 %and = select i1 %not.YeqC, i1 %XeqY, i1 false164 %equal = select i1 %XeqC, i1 %YeqC, i1 %and165 ret i1 %equal166}167 168define i1 @icmp_equality_test_missing_not(i64 %X, i64 %Y, i64 %Z) {169; CHECK-LABEL: @icmp_equality_test_missing_not(170; CHECK-NEXT: [[XEQZ:%.*]] = icmp eq i64 [[X:%.*]], [[Z:%.*]]171; CHECK-NEXT: [[YEQZ:%.*]] = icmp eq i64 [[Y:%.*]], [[Z]]172; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X]], [[Y]]173; CHECK-NEXT: [[AND:%.*]] = select i1 [[YEQZ]], i1 [[XEQY]], i1 false174; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[YEQZ]], i1 [[AND]]175; CHECK-NEXT: ret i1 [[EQUAL]]176;177 %XeqZ = icmp eq i64 %X, %Z178 %YeqZ = icmp eq i64 %Y, %Z179 %XeqY = icmp eq i64 %X, %Y180 %and = select i1 %YeqZ, i1 %XeqY, i1 false181 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and182 ret i1 %equal183}184 185define i1 @icmp_equality_test_wrong_and(i64 %X, i64 %Y, i64 %Z) {186; CHECK-LABEL: @icmp_equality_test_wrong_and(187; CHECK-NEXT: entry:188; CHECK-NEXT: [[XEQZ:%.*]] = icmp eq i64 [[X:%.*]], [[Z:%.*]]189; CHECK-NEXT: [[YEQZ:%.*]] = icmp eq i64 [[Y:%.*]], [[Z]]190; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X]], [[Y]]191; CHECK-NEXT: [[AND:%.*]] = select i1 [[YEQZ]], i1 [[XEQY]], i1 false192; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[YEQZ]], i1 [[AND]]193; CHECK-NEXT: ret i1 [[EQUAL]]194;195entry:196 %XeqZ = icmp eq i64 %X, %Z197 %YeqZ = icmp eq i64 %Y, %Z198 %XeqY = icmp eq i64 %X, %Y199 %not.YeqZ = xor i1 %YeqZ, true200 %and = select i1 %not.YeqZ, i1 false, i1 %XeqY201 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and202 ret i1 %equal203}204 205define i1 @icmp_equality_test_wrong_cmp(i64 %X, i64 %Y, i64 %Z) {206; CHECK-LABEL: @icmp_equality_test_wrong_cmp(207; CHECK-NEXT: entry:208; CHECK-NEXT: [[XEQZ:%.*]] = icmp eq i64 [[X:%.*]], [[Z:%.*]]209; CHECK-NEXT: [[YEQZ:%.*]] = icmp eq i64 [[Y:%.*]], [[Z]]210; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X]], 999211; CHECK-NEXT: [[NOT_YEQZ:%.*]] = xor i1 [[YEQZ]], true212; CHECK-NEXT: [[AND:%.*]] = select i1 [[NOT_YEQZ]], i1 [[XEQY]], i1 false213; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[YEQZ]], i1 [[AND]]214; CHECK-NEXT: ret i1 [[EQUAL]]215;216entry:217 %XeqZ = icmp eq i64 %X, %Z218 %YeqZ = icmp eq i64 %Y, %Z219 %XeqY = icmp eq i64 %X, 999220 %not.YeqZ = xor i1 %YeqZ, true221 %and = select i1 %not.YeqZ, i1 %XeqY, i1 false222 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and223 ret i1 %equal224}225 226define i1 @icmp_equality_test_wrong_equal(i64 %X, i64 %Y, i64 %Z) {227; CHECK-LABEL: @icmp_equality_test_wrong_equal(228; CHECK-NEXT: entry:229; CHECK-NEXT: [[XEQZ:%.*]] = icmp eq i64 [[X:%.*]], [[Z:%.*]]230; CHECK-NEXT: [[YEQZ:%.*]] = icmp eq i64 [[Y:%.*]], [[Z]]231; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X]], [[Y]]232; CHECK-NEXT: [[NOT_YEQZ:%.*]] = xor i1 [[YEQZ]], true233; CHECK-NEXT: [[AND:%.*]] = select i1 [[NOT_YEQZ]], i1 [[XEQY]], i1 false234; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[AND]], i1 [[YEQZ]]235; CHECK-NEXT: ret i1 [[EQUAL]]236;237entry:238 %XeqZ = icmp eq i64 %X, %Z239 %YeqZ = icmp eq i64 %Y, %Z240 %XeqY = icmp eq i64 %X, %Y241 %not.YeqZ = xor i1 %YeqZ, true242 %and = select i1 %not.YeqZ, i1 %XeqY, i1 false243 %equal = select i1 %XeqZ, i1 %and, i1 %YeqZ244 ret i1 %equal245}246