1d0d12fc7SMarina Taylor; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2d0d12fc7SMarina Taylor; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3d0d12fc7SMarina Taylor 4d0d12fc7SMarina Taylordefine i1 @icmp_equality_test(i64 %X, i64 %Y, i64 %Z) { 5d0d12fc7SMarina Taylor; CHECK-LABEL: @icmp_equality_test( 6d0d12fc7SMarina Taylor; CHECK-NEXT: entry: 7d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X:%.*]], [[Y:%.*]] 8d0d12fc7SMarina Taylor; CHECK-NEXT: ret i1 [[XEQY]] 9d0d12fc7SMarina Taylor; 10d0d12fc7SMarina Taylorentry: 11d0d12fc7SMarina Taylor %XeqZ = icmp eq i64 %X, %Z 12d0d12fc7SMarina Taylor %YeqZ = icmp eq i64 %Y, %Z 13d0d12fc7SMarina Taylor %XeqY = icmp eq i64 %X, %Y 14d0d12fc7SMarina Taylor %not.YeqZ = xor i1 %YeqZ, true 15d0d12fc7SMarina Taylor %and = select i1 %not.YeqZ, i1 %XeqY, i1 false 16d0d12fc7SMarina Taylor %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 17d0d12fc7SMarina Taylor ret i1 %equal 18d0d12fc7SMarina Taylor} 19d0d12fc7SMarina Taylor 20d0d12fc7SMarina Taylordefine i1 @icmp_equality_test_constant(i42 %X, i42 %Y) { 21d0d12fc7SMarina Taylor; CHECK-LABEL: @icmp_equality_test_constant( 22d0d12fc7SMarina Taylor; CHECK-NEXT: entry: 23d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i42 [[X:%.*]], [[Y:%.*]] 24d0d12fc7SMarina Taylor; CHECK-NEXT: ret i1 [[XEQY]] 25d0d12fc7SMarina Taylor; 26d0d12fc7SMarina Taylorentry: 27d0d12fc7SMarina Taylor %XeqC = icmp eq i42 %X, -42 28d0d12fc7SMarina Taylor %YeqC = icmp eq i42 %Y, -42 29d0d12fc7SMarina Taylor %XeqY = icmp eq i42 %X, %Y 30d0d12fc7SMarina Taylor %not.YeqC = xor i1 %YeqC, true 31d0d12fc7SMarina Taylor %and = select i1 %not.YeqC, i1 %XeqY, i1 false 32d0d12fc7SMarina Taylor %equal = select i1 %XeqC, i1 %YeqC, i1 %and 33d0d12fc7SMarina Taylor ret i1 %equal 34d0d12fc7SMarina Taylor} 35d0d12fc7SMarina Taylor 36*09361953SYingwei Zhengdefine i1 @icmp_equality_test_constant_samesign(i42 %X, i42 %Y) { 37*09361953SYingwei Zheng; CHECK-LABEL: @icmp_equality_test_constant_samesign( 38*09361953SYingwei Zheng; CHECK-NEXT: entry: 39*09361953SYingwei Zheng; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i42 [[X:%.*]], [[Y:%.*]] 40*09361953SYingwei Zheng; CHECK-NEXT: ret i1 [[XEQY]] 41*09361953SYingwei Zheng; 42*09361953SYingwei Zhengentry: 43*09361953SYingwei Zheng %XeqC = icmp eq i42 %X, -42 44*09361953SYingwei Zheng %YeqC = icmp eq i42 %Y, -42 45*09361953SYingwei Zheng %XeqY = icmp samesign eq i42 %X, %Y 46*09361953SYingwei Zheng %not.YeqC = xor i1 %YeqC, true 47*09361953SYingwei Zheng %and = select i1 %not.YeqC, i1 %XeqY, i1 false 48*09361953SYingwei Zheng %equal = select i1 %XeqC, i1 %YeqC, i1 %and 49*09361953SYingwei Zheng ret i1 %equal 50*09361953SYingwei Zheng} 51*09361953SYingwei Zheng 52d0d12fc7SMarina Taylordefine i1 @icmp_equality_test_swift_optional_pointers(i64 %X, i64 %Y) { 53d0d12fc7SMarina Taylor; CHECK-LABEL: @icmp_equality_test_swift_optional_pointers( 54d0d12fc7SMarina Taylor; CHECK-NEXT: entry: 55d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X:%.*]], [[Y:%.*]] 56d0d12fc7SMarina Taylor; CHECK-NEXT: ret i1 [[XEQY]] 57d0d12fc7SMarina Taylor; 58d0d12fc7SMarina Taylorentry: 59d0d12fc7SMarina Taylor %XeqC = icmp eq i64 %X, 0 60d0d12fc7SMarina Taylor %YeqC = icmp eq i64 %Y, 0 61d0d12fc7SMarina Taylor %either = select i1 %XeqC, i1 true, i1 %YeqC 62d0d12fc7SMarina Taylor %both = select i1 %XeqC, i1 %YeqC, i1 false 63d0d12fc7SMarina Taylor %XeqY = icmp eq i64 %X, %Y 64d0d12fc7SMarina Taylor %equal = select i1 %either, i1 %both, i1 %XeqY 65d0d12fc7SMarina Taylor ret i1 %equal 66d0d12fc7SMarina Taylor} 67d0d12fc7SMarina Taylor 68d0d12fc7SMarina Taylordefine <2 x i1> @icmp_equality_test_vector(<2 x i64> %X, <2 x i64> %Y) { 69d0d12fc7SMarina Taylor; CHECK-LABEL: @icmp_equality_test_vector( 70d0d12fc7SMarina Taylor; CHECK-NEXT: entry: 71d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQY:%.*]] = icmp eq <2 x i64> [[X:%.*]], [[Y:%.*]] 72d0d12fc7SMarina Taylor; CHECK-NEXT: ret <2 x i1> [[XEQY]] 73d0d12fc7SMarina Taylor; 74d0d12fc7SMarina Taylorentry: 75d0d12fc7SMarina Taylor %XeqC = icmp eq <2 x i64> %X, <i64 123, i64 456> 76d0d12fc7SMarina Taylor %YeqC = icmp eq <2 x i64> %Y, <i64 123, i64 456> 77d0d12fc7SMarina Taylor %XeqY = icmp eq <2 x i64> %X, %Y 78d0d12fc7SMarina Taylor %not.YeqC = xor <2 x i1> %YeqC, <i1 true, i1 true> 79d0d12fc7SMarina Taylor %and = select <2 x i1> %not.YeqC, <2 x i1> %XeqY, <2 x i1> <i1 false, i1 false> 80d0d12fc7SMarina Taylor %equal = select <2 x i1> %XeqC, <2 x i1> %YeqC, <2 x i1> %and 81d0d12fc7SMarina Taylor ret <2 x i1> %equal 82d0d12fc7SMarina Taylor} 83d0d12fc7SMarina Taylor 84d0d12fc7SMarina Taylordefine i1 @icmp_equality_test_commute_icmp1(i64 %X, i64 %Y, i64 %Z) { 85d0d12fc7SMarina Taylor; CHECK-LABEL: @icmp_equality_test_commute_icmp1( 86d0d12fc7SMarina Taylor; CHECK-NEXT: entry: 87d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[Y:%.*]], [[X:%.*]] 88d0d12fc7SMarina Taylor; CHECK-NEXT: ret i1 [[XEQY]] 89d0d12fc7SMarina Taylor; 90d0d12fc7SMarina Taylorentry: 91d0d12fc7SMarina Taylor %XeqZ = icmp eq i64 %Z, %X 92d0d12fc7SMarina Taylor %YeqZ = icmp eq i64 %Z, %Y 93d0d12fc7SMarina Taylor %XeqY = icmp eq i64 %Y, %X 94d0d12fc7SMarina Taylor %not.YeqZ = xor i1 %YeqZ, true 95d0d12fc7SMarina Taylor %and = select i1 %not.YeqZ, i1 %XeqY, i1 false 96d0d12fc7SMarina Taylor %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 97d0d12fc7SMarina Taylor ret i1 %equal 98d0d12fc7SMarina Taylor} 99d0d12fc7SMarina Taylor 100d0d12fc7SMarina Taylordefine i1 @icmp_equality_test_commute_icmp2(i64 %X, i64 %Y, i64 %Z) { 101d0d12fc7SMarina Taylor; CHECK-LABEL: @icmp_equality_test_commute_icmp2( 102d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[Y:%.*]], [[X:%.*]] 103d0d12fc7SMarina Taylor; CHECK-NEXT: ret i1 [[XEQY]] 104d0d12fc7SMarina Taylor; 105d0d12fc7SMarina Taylor %XeqZ = icmp eq i64 %Z, %X 106d0d12fc7SMarina Taylor %YeqZ = icmp eq i64 %Y, %Z 107d0d12fc7SMarina Taylor %XeqY = icmp eq i64 %Y, %X 108d0d12fc7SMarina Taylor %not.YeqZ = xor i1 %YeqZ, true 109d0d12fc7SMarina Taylor %and = select i1 %not.YeqZ, i1 %XeqY, i1 false 110d0d12fc7SMarina Taylor %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 111d0d12fc7SMarina Taylor ret i1 %equal 112d0d12fc7SMarina Taylor} 113d0d12fc7SMarina Taylor 114d0d12fc7SMarina Taylordefine i1 @icmp_equality_test_commute_select1(i64 %X, i64 %Y, i64 %Z) { 115d0d12fc7SMarina Taylor; CHECK-LABEL: @icmp_equality_test_commute_select1( 116d0d12fc7SMarina Taylor; CHECK-NEXT: entry: 117d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X:%.*]], [[Y:%.*]] 118d0d12fc7SMarina Taylor; CHECK-NEXT: ret i1 [[XEQY]] 119d0d12fc7SMarina Taylor; 120d0d12fc7SMarina Taylorentry: 121d0d12fc7SMarina Taylor %XeqZ = icmp eq i64 %X, %Z 122d0d12fc7SMarina Taylor %YeqZ = icmp eq i64 %Y, %Z 123d0d12fc7SMarina Taylor %XeqY = icmp eq i64 %X, %Y 124d0d12fc7SMarina Taylor %and = select i1 %YeqZ, i1 false, i1 %XeqY 125d0d12fc7SMarina Taylor %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 126d0d12fc7SMarina Taylor ret i1 %equal 127d0d12fc7SMarina Taylor} 128d0d12fc7SMarina Taylor 129d0d12fc7SMarina Taylordefine i1 @icmp_equality_test_commute_select2(i64 %X, i64 %Y, i64 %Z) { 130d0d12fc7SMarina Taylor; CHECK-LABEL: @icmp_equality_test_commute_select2( 131d0d12fc7SMarina Taylor; CHECK-NEXT: entry: 132d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X:%.*]], [[Y:%.*]] 133d0d12fc7SMarina Taylor; CHECK-NEXT: ret i1 [[XEQY]] 134d0d12fc7SMarina Taylor; 135d0d12fc7SMarina Taylorentry: 136d0d12fc7SMarina Taylor %XeqZ = icmp eq i64 %X, %Z 137d0d12fc7SMarina Taylor %YeqZ = icmp eq i64 %Y, %Z 138d0d12fc7SMarina Taylor %XeqY = icmp eq i64 %X, %Y 139d0d12fc7SMarina Taylor %not.XeqZ = xor i1 %XeqZ, true 140d0d12fc7SMarina Taylor %and = select i1 %YeqZ, i1 false, i1 %XeqY 141d0d12fc7SMarina Taylor %equal = select i1 %not.XeqZ, i1 %and, i1 %YeqZ 142d0d12fc7SMarina Taylor ret i1 %equal 143d0d12fc7SMarina Taylor} 144d0d12fc7SMarina Taylor 145d0d12fc7SMarina Taylor; Negative tests below 146d0d12fc7SMarina Taylor 147d0d12fc7SMarina Taylordefine i1 @icmp_equality_test_wrong_constant(i64 %X, i64 %Y) { 148d0d12fc7SMarina Taylor; CHECK-LABEL: @icmp_equality_test_wrong_constant( 149d0d12fc7SMarina Taylor; CHECK-NEXT: entry: 150d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQC:%.*]] = icmp eq i64 [[X:%.*]], 0 151d0d12fc7SMarina Taylor; CHECK-NEXT: [[YEQC:%.*]] = icmp eq i64 [[Y:%.*]], 999 152d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X]], [[Y]] 153d0d12fc7SMarina Taylor; CHECK-NEXT: [[NOT_YEQC:%.*]] = xor i1 [[YEQC]], true 154d0d12fc7SMarina Taylor; CHECK-NEXT: [[AND:%.*]] = select i1 [[NOT_YEQC]], i1 [[XEQY]], i1 false 155d0d12fc7SMarina Taylor; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQC]], i1 [[YEQC]], i1 [[AND]] 156d0d12fc7SMarina Taylor; CHECK-NEXT: ret i1 [[EQUAL]] 157d0d12fc7SMarina Taylor; 158d0d12fc7SMarina Taylorentry: 159d0d12fc7SMarina Taylor %XeqC = icmp eq i64 %X, 0 160d0d12fc7SMarina Taylor %YeqC = icmp eq i64 %Y, 999 161d0d12fc7SMarina Taylor %XeqY = icmp eq i64 %X, %Y 162d0d12fc7SMarina Taylor %not.YeqC = xor i1 %YeqC, true 163d0d12fc7SMarina Taylor %and = select i1 %not.YeqC, i1 %XeqY, i1 false 164d0d12fc7SMarina Taylor %equal = select i1 %XeqC, i1 %YeqC, i1 %and 165d0d12fc7SMarina Taylor ret i1 %equal 166d0d12fc7SMarina Taylor} 167d0d12fc7SMarina Taylor 168d0d12fc7SMarina Taylordefine i1 @icmp_equality_test_missing_not(i64 %X, i64 %Y, i64 %Z) { 169d0d12fc7SMarina Taylor; CHECK-LABEL: @icmp_equality_test_missing_not( 170d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQZ:%.*]] = icmp eq i64 [[X:%.*]], [[Z:%.*]] 171d0d12fc7SMarina Taylor; CHECK-NEXT: [[YEQZ:%.*]] = icmp eq i64 [[Y:%.*]], [[Z]] 172d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X]], [[Y]] 173d0d12fc7SMarina Taylor; CHECK-NEXT: [[AND:%.*]] = select i1 [[YEQZ]], i1 [[XEQY]], i1 false 174d0d12fc7SMarina Taylor; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[YEQZ]], i1 [[AND]] 175d0d12fc7SMarina Taylor; CHECK-NEXT: ret i1 [[EQUAL]] 176d0d12fc7SMarina Taylor; 177d0d12fc7SMarina Taylor %XeqZ = icmp eq i64 %X, %Z 178d0d12fc7SMarina Taylor %YeqZ = icmp eq i64 %Y, %Z 179d0d12fc7SMarina Taylor %XeqY = icmp eq i64 %X, %Y 180d0d12fc7SMarina Taylor %and = select i1 %YeqZ, i1 %XeqY, i1 false 181d0d12fc7SMarina Taylor %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 182d0d12fc7SMarina Taylor ret i1 %equal 183d0d12fc7SMarina Taylor} 184d0d12fc7SMarina Taylor 185d0d12fc7SMarina Taylordefine i1 @icmp_equality_test_wrong_and(i64 %X, i64 %Y, i64 %Z) { 186d0d12fc7SMarina Taylor; CHECK-LABEL: @icmp_equality_test_wrong_and( 187d0d12fc7SMarina Taylor; CHECK-NEXT: entry: 188d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQZ:%.*]] = icmp eq i64 [[X:%.*]], [[Z:%.*]] 189d0d12fc7SMarina Taylor; CHECK-NEXT: [[YEQZ:%.*]] = icmp eq i64 [[Y:%.*]], [[Z]] 190d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X]], [[Y]] 191d0d12fc7SMarina Taylor; CHECK-NEXT: [[AND:%.*]] = select i1 [[YEQZ]], i1 [[XEQY]], i1 false 192d0d12fc7SMarina Taylor; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[YEQZ]], i1 [[AND]] 193d0d12fc7SMarina Taylor; CHECK-NEXT: ret i1 [[EQUAL]] 194d0d12fc7SMarina Taylor; 195d0d12fc7SMarina Taylorentry: 196d0d12fc7SMarina Taylor %XeqZ = icmp eq i64 %X, %Z 197d0d12fc7SMarina Taylor %YeqZ = icmp eq i64 %Y, %Z 198d0d12fc7SMarina Taylor %XeqY = icmp eq i64 %X, %Y 199d0d12fc7SMarina Taylor %not.YeqZ = xor i1 %YeqZ, true 200d0d12fc7SMarina Taylor %and = select i1 %not.YeqZ, i1 false, i1 %XeqY 201d0d12fc7SMarina Taylor %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 202d0d12fc7SMarina Taylor ret i1 %equal 203d0d12fc7SMarina Taylor} 204d0d12fc7SMarina Taylor 205d0d12fc7SMarina Taylordefine i1 @icmp_equality_test_wrong_cmp(i64 %X, i64 %Y, i64 %Z) { 206d0d12fc7SMarina Taylor; CHECK-LABEL: @icmp_equality_test_wrong_cmp( 207d0d12fc7SMarina Taylor; CHECK-NEXT: entry: 208d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQZ:%.*]] = icmp eq i64 [[X:%.*]], [[Z:%.*]] 209d0d12fc7SMarina Taylor; CHECK-NEXT: [[YEQZ:%.*]] = icmp eq i64 [[Y:%.*]], [[Z]] 210d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X]], 999 211d0d12fc7SMarina Taylor; CHECK-NEXT: [[NOT_YEQZ:%.*]] = xor i1 [[YEQZ]], true 212d0d12fc7SMarina Taylor; CHECK-NEXT: [[AND:%.*]] = select i1 [[NOT_YEQZ]], i1 [[XEQY]], i1 false 213d0d12fc7SMarina Taylor; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[YEQZ]], i1 [[AND]] 214d0d12fc7SMarina Taylor; CHECK-NEXT: ret i1 [[EQUAL]] 215d0d12fc7SMarina Taylor; 216d0d12fc7SMarina Taylorentry: 217d0d12fc7SMarina Taylor %XeqZ = icmp eq i64 %X, %Z 218d0d12fc7SMarina Taylor %YeqZ = icmp eq i64 %Y, %Z 219d0d12fc7SMarina Taylor %XeqY = icmp eq i64 %X, 999 220d0d12fc7SMarina Taylor %not.YeqZ = xor i1 %YeqZ, true 221d0d12fc7SMarina Taylor %and = select i1 %not.YeqZ, i1 %XeqY, i1 false 222d0d12fc7SMarina Taylor %equal = select i1 %XeqZ, i1 %YeqZ, i1 %and 223d0d12fc7SMarina Taylor ret i1 %equal 224d0d12fc7SMarina Taylor} 225d0d12fc7SMarina Taylor 226d0d12fc7SMarina Taylordefine i1 @icmp_equality_test_wrong_equal(i64 %X, i64 %Y, i64 %Z) { 227d0d12fc7SMarina Taylor; CHECK-LABEL: @icmp_equality_test_wrong_equal( 228d0d12fc7SMarina Taylor; CHECK-NEXT: entry: 229d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQZ:%.*]] = icmp eq i64 [[X:%.*]], [[Z:%.*]] 230d0d12fc7SMarina Taylor; CHECK-NEXT: [[YEQZ:%.*]] = icmp eq i64 [[Y:%.*]], [[Z]] 231d0d12fc7SMarina Taylor; CHECK-NEXT: [[XEQY:%.*]] = icmp eq i64 [[X]], [[Y]] 232d0d12fc7SMarina Taylor; CHECK-NEXT: [[NOT_YEQZ:%.*]] = xor i1 [[YEQZ]], true 233d0d12fc7SMarina Taylor; CHECK-NEXT: [[AND:%.*]] = select i1 [[NOT_YEQZ]], i1 [[XEQY]], i1 false 234d0d12fc7SMarina Taylor; CHECK-NEXT: [[EQUAL:%.*]] = select i1 [[XEQZ]], i1 [[AND]], i1 [[YEQZ]] 235d0d12fc7SMarina Taylor; CHECK-NEXT: ret i1 [[EQUAL]] 236d0d12fc7SMarina Taylor; 237d0d12fc7SMarina Taylorentry: 238d0d12fc7SMarina Taylor %XeqZ = icmp eq i64 %X, %Z 239d0d12fc7SMarina Taylor %YeqZ = icmp eq i64 %Y, %Z 240d0d12fc7SMarina Taylor %XeqY = icmp eq i64 %X, %Y 241d0d12fc7SMarina Taylor %not.YeqZ = xor i1 %YeqZ, true 242d0d12fc7SMarina Taylor %and = select i1 %not.YeqZ, i1 %XeqY, i1 false 243d0d12fc7SMarina Taylor %equal = select i1 %XeqZ, i1 %and, i1 %YeqZ 244d0d12fc7SMarina Taylor ret i1 %equal 245d0d12fc7SMarina Taylor} 246