brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.2 KiB · b9d8f2d Raw
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