1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 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, %Z 12 %YeqZ = icmp eq i64 %Y, %Z 13 %XeqY = icmp eq i64 %X, %Y 14 %not.YeqZ = xor i1 %YeqZ, true 15 %and = select i1 %not.YeqZ, i1 %XeqY, i1 false 16 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 17 ret i1 %equal 18} 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, -42 28 %YeqC = icmp eq i42 %Y, -42 29 %XeqY = icmp eq i42 %X, %Y 30 %not.YeqC = xor i1 %YeqC, true 31 %and = select i1 %not.YeqC, i1 %XeqY, i1 false 32 %equal = select i1 %XeqC, i1 %YeqC, i1 %and 33 ret i1 %equal 34} 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, -42 44 %YeqC = icmp eq i42 %Y, -42 45 %XeqY = icmp samesign eq i42 %X, %Y 46 %not.YeqC = xor i1 %YeqC, true 47 %and = select i1 %not.YeqC, i1 %XeqY, i1 false 48 %equal = select i1 %XeqC, i1 %YeqC, i1 %and 49 ret i1 %equal 50} 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, 0 60 %YeqC = icmp eq i64 %Y, 0 61 %either = select i1 %XeqC, i1 true, i1 %YeqC 62 %both = select i1 %XeqC, i1 %YeqC, i1 false 63 %XeqY = icmp eq i64 %X, %Y 64 %equal = select i1 %either, i1 %both, i1 %XeqY 65 ret i1 %equal 66} 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, %Y 78 %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> %and 81 ret <2 x i1> %equal 82} 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, %X 92 %YeqZ = icmp eq i64 %Z, %Y 93 %XeqY = icmp eq i64 %Y, %X 94 %not.YeqZ = xor i1 %YeqZ, true 95 %and = select i1 %not.YeqZ, i1 %XeqY, i1 false 96 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 97 ret i1 %equal 98} 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, %X 106 %YeqZ = icmp eq i64 %Y, %Z 107 %XeqY = icmp eq i64 %Y, %X 108 %not.YeqZ = xor i1 %YeqZ, true 109 %and = select i1 %not.YeqZ, i1 %XeqY, i1 false 110 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 111 ret i1 %equal 112} 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, %Z 122 %YeqZ = icmp eq i64 %Y, %Z 123 %XeqY = icmp eq i64 %X, %Y 124 %and = select i1 %YeqZ, i1 false, i1 %XeqY 125 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 126 ret i1 %equal 127} 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, %Z 137 %YeqZ = icmp eq i64 %Y, %Z 138 %XeqY = icmp eq i64 %X, %Y 139 %not.XeqZ = xor i1 %XeqZ, true 140 %and = select i1 %YeqZ, i1 false, i1 %XeqY 141 %equal = select i1 %not.XeqZ, i1 %and, i1 %YeqZ 142 ret i1 %equal 143} 144 145; Negative tests below 146 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:%.*]], 0 151; CHECK-NEXT: [[YEQC:%.*]] = icmp eq i64 [[Y:%.*]], 999 152; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X]], [[Y]] 153; CHECK-NEXT: [[NOT_YEQC:%.*]] = xor i1 [[YEQC]], true 154; CHECK-NEXT: [[AND:%.*]] = select i1 [[NOT_YEQC]], i1 [[XEQY]], i1 false 155; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQC]], i1 [[YEQC]], i1 [[AND]] 156; CHECK-NEXT: ret i1 [[EQUAL]] 157; 158entry: 159 %XeqC = icmp eq i64 %X, 0 160 %YeqC = icmp eq i64 %Y, 999 161 %XeqY = icmp eq i64 %X, %Y 162 %not.YeqC = xor i1 %YeqC, true 163 %and = select i1 %not.YeqC, i1 %XeqY, i1 false 164 %equal = select i1 %XeqC, i1 %YeqC, i1 %and 165 ret i1 %equal 166} 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 false 174; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[YEQZ]], i1 [[AND]] 175; CHECK-NEXT: ret i1 [[EQUAL]] 176; 177 %XeqZ = icmp eq i64 %X, %Z 178 %YeqZ = icmp eq i64 %Y, %Z 179 %XeqY = icmp eq i64 %X, %Y 180 %and = select i1 %YeqZ, i1 %XeqY, i1 false 181 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 182 ret i1 %equal 183} 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 false 192; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[YEQZ]], i1 [[AND]] 193; CHECK-NEXT: ret i1 [[EQUAL]] 194; 195entry: 196 %XeqZ = icmp eq i64 %X, %Z 197 %YeqZ = icmp eq i64 %Y, %Z 198 %XeqY = icmp eq i64 %X, %Y 199 %not.YeqZ = xor i1 %YeqZ, true 200 %and = select i1 %not.YeqZ, i1 false, i1 %XeqY 201 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 202 ret i1 %equal 203} 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]], 999 211; CHECK-NEXT: [[NOT_YEQZ:%.*]] = xor i1 [[YEQZ]], true 212; CHECK-NEXT: [[AND:%.*]] = select i1 [[NOT_YEQZ]], i1 [[XEQY]], i1 false 213; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[YEQZ]], i1 [[AND]] 214; CHECK-NEXT: ret i1 [[EQUAL]] 215; 216entry: 217 %XeqZ = icmp eq i64 %X, %Z 218 %YeqZ = icmp eq i64 %Y, %Z 219 %XeqY = icmp eq i64 %X, 999 220 %not.YeqZ = xor i1 %YeqZ, true 221 %and = select i1 %not.YeqZ, i1 %XeqY, i1 false 222 %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 223 ret i1 %equal 224} 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]], true 233; CHECK-NEXT: [[AND:%.*]] = select i1 [[NOT_YEQZ]], i1 [[XEQY]], i1 false 234; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[AND]], i1 [[YEQZ]] 235; CHECK-NEXT: ret i1 [[EQUAL]] 236; 237entry: 238 %XeqZ = icmp eq i64 %X, %Z 239 %YeqZ = icmp eq i64 %Y, %Z 240 %XeqY = icmp eq i64 %X, %Y 241 %not.YeqZ = xor i1 %YeqZ, true 242 %and = select i1 %not.YeqZ, i1 %XeqY, i1 false 243 %equal = select i1 %XeqZ, i1 %and, i1 %YeqZ 244 ret i1 %equal 245} 246