1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3 4declare void @llvm.assume(i1) 5 6define i1 @test_eq_1(i8 %a, i8 %b) { 7; CHECK-LABEL: @test_eq_1( 8; CHECK-NEXT: entry: 9; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[A:%.*]], [[B:%.*]] 10; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] 11; CHECK: then: 12; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true 13; CHECK-NEXT: [[RES_2:%.*]] = xor i1 [[RES_1]], true 14; CHECK-NEXT: [[RES_3:%.*]] = xor i1 [[RES_2]], true 15; CHECK-NEXT: [[RES_4:%.*]] = xor i1 [[RES_3]], false 16; CHECK-NEXT: [[RES_5:%.*]] = xor i1 [[RES_4]], false 17; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[B]], 99 18; CHECK-NEXT: [[RES_6:%.*]] = xor i1 [[RES_5]], [[C_1]] 19; CHECK-NEXT: ret i1 [[RES_6]] 20; CHECK: else: 21; CHECK-NEXT: [[F_3:%.*]] = icmp eq i8 [[A]], [[B]] 22; CHECK-NEXT: [[F_4:%.*]] = icmp eq i8 [[B]], [[A]] 23; CHECK-NEXT: [[RES_7:%.*]] = xor i1 [[F_3]], [[F_4]] 24; CHECK-NEXT: [[C_2:%.*]] = icmp ult i8 [[B]], 99 25; CHECK-NEXT: [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_2]] 26; CHECK-NEXT: [[C_3:%.*]] = icmp uge i8 [[A]], [[B]] 27; CHECK-NEXT: [[RES_9:%.*]] = xor i1 [[RES_8]], [[C_3]] 28; CHECK-NEXT: [[C_4:%.*]] = icmp ule i8 [[A]], [[B]] 29; CHECK-NEXT: [[RES_10:%.*]] = xor i1 [[RES_9]], [[C_4]] 30; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8 [[B]], [[A]] 31; CHECK-NEXT: [[RES_11:%.*]] = xor i1 [[RES_10]], [[C_5]] 32; CHECK-NEXT: [[C_6:%.*]] = icmp ult i8 [[B]], [[A]] 33; CHECK-NEXT: [[RES_12:%.*]] = xor i1 [[RES_11]], [[C_6]] 34; CHECK-NEXT: ret i1 [[RES_12]] 35; 36entry: 37 %cmp = icmp eq i8 %a, %b 38 br i1 %cmp, label %then, label %else 39 40then: 41 %t.1 = icmp uge i8 %a, %b 42 %t.2 = icmp ule i8 %a, %b 43 %res.1 = xor i1 %t.1, %t.2 44 45 %t.3 = icmp eq i8 %a, %b 46 %res.2 = xor i1 %res.1, %t.3 47 48 %t.4 = icmp eq i8 %b, %a 49 %res.3 = xor i1 %res.2, %t.4 50 51 %f.1 = icmp ugt i8 %b, %a 52 %res.4 = xor i1 %res.3, %f.1 53 54 %f.2 = icmp ult i8 %b, %a 55 %res.5 = xor i1 %res.4, %f.2 56 57 %c.1 = icmp ult i8 %b, 99 58 %res.6 = xor i1 %res.5, %c.1 59 ret i1 %res.6 60 61else: 62 %f.3 = icmp eq i8 %a, %b 63 %f.4 = icmp eq i8 %b, %a 64 %res.7 = xor i1 %f.3, %f.4 65 66 %c.2 = icmp ult i8 %b, 99 67 %res.8 = xor i1 %res.7, %c.2 68 69 %c.3 = icmp uge i8 %a, %b 70 %res.9 = xor i1 %res.8, %c.3 71 72 %c.4 = icmp ule i8 %a, %b 73 %res.10 = xor i1 %res.9, %c.4 74 75 %c.5 = icmp ugt i8 %b, %a 76 %res.11 = xor i1 %res.10, %c.5 77 78 %c.6 = icmp ult i8 %b, %a 79 %res.12 = xor i1 %res.11, %c.6 80 ret i1 %res.12 81} 82 83define i1 @test_eq_2(i8 %a, i8 %b) { 84; CHECK-LABEL: @test_eq_2( 85; CHECK-NEXT: entry: 86; CHECK-NEXT: [[PRE_1:%.*]] = icmp eq i8 [[A:%.*]], [[B:%.*]] 87; CHECK-NEXT: br i1 [[PRE_1]], label [[THEN:%.*]], label [[ELSE:%.*]] 88; CHECK: then: 89; CHECK-NEXT: [[PRE_3:%.*]] = icmp ult i8 [[B]], 100 90; CHECK-NEXT: br i1 [[PRE_3]], label [[THEN_THEN:%.*]], label [[THEN_ELSE:%.*]] 91; CHECK: then.then: 92; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 true, true 93; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[XOR_1]], false 94; CHECK-NEXT: [[XOR_3:%.*]] = xor i1 [[XOR_2]], false 95; CHECK-NEXT: [[XOR_4:%.*]] = xor i1 [[XOR_3]], false 96; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[A]], 99 97; CHECK-NEXT: [[XOR_5:%.*]] = xor i1 [[XOR_4]], [[C_1]] 98; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[A]], 98 99; CHECK-NEXT: [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_1]] 100; CHECK-NEXT: ret i1 [[XOR_6]] 101; CHECK: then.else: 102; CHECK-NEXT: [[XOR_7:%.*]] = xor i1 false, false 103; CHECK-NEXT: [[XOR_8:%.*]] = xor i1 [[XOR_7]], true 104; CHECK-NEXT: [[XOR_9:%.*]] = xor i1 [[XOR_8]], true 105; CHECK-NEXT: [[XOR_10:%.*]] = xor i1 [[XOR_9]], true 106; CHECK-NEXT: [[XOR_11:%.*]] = xor i1 [[XOR_10]], false 107; CHECK-NEXT: [[XOR_12:%.*]] = xor i1 [[XOR_11]], true 108; CHECK-NEXT: ret i1 [[XOR_12]] 109; CHECK: else: 110; CHECK-NEXT: [[CMP_2:%.*]] = icmp ult i8 [[A]], 100 111; CHECK-NEXT: ret i1 [[CMP_2]] 112; 113entry: 114 %pre.1 = icmp eq i8 %a, %b 115 br i1 %pre.1, label %then, label %else 116 117then: 118 %pre.3 = icmp ult i8 %b, 100 119 br i1 %pre.3, label %then.then, label %then.else 120 121then.then: 122 %t.1 = icmp ult i8 %a, 100 123 %t.2 = icmp ult i8 %b, 100 124 %xor.1 = xor i1 %t.1, %t.2 125 126 %f.1 = icmp uge i8 %a, 100 127 %xor.2 = xor i1 %xor.1, %f.1 128 129 %f.2 = icmp uge i8 %b, 100 130 %xor.3 = xor i1 %xor.2, %f.2 131 132 %f.3.1 = icmp ugt i8 %a, 99 133 %xor.4 = xor i1 %xor.3, %f.3.1 134 135 %c.1 = icmp ult i8 %a, 99 136 %xor.5 = xor i1 %xor.4, %c.1 137 138 %c.2 = icmp ugt i8 %a, 98 139 %xor.6 = xor i1 %xor.5, %c.1 140 141 ret i1 %xor.6 142 143then.else: 144 %f.4 = icmp ult i8 %a, 100 145 %f.5 = icmp ult i8 %b, 100 146 %xor.7 = xor i1 %f.4, %f.5 147 148 %t.3 = icmp uge i8 %a, 100 149 %xor.8 = xor i1 %xor.7, %t.3 150 151 %t.4 = icmp uge i8 %b, 100 152 %xor.9 = xor i1 %xor.8, %t.4 153 154 %t.5 = icmp ugt i8 %a, 99 155 %xor.10 = xor i1 %xor.9, %t.5 156 157 %c.3 = icmp ult i8 %a, 99 158 %xor.11 = xor i1 %xor.10, %c.3 159 160 %c.4 = icmp ugt i8 %a, 98 161 %xor.12 = xor i1 %xor.11, %c.4 162 163 ret i1 %xor.12 164 165else: 166 %cmp.2 = icmp ult i8 %a, 100 167 ret i1 %cmp.2 168} 169 170; Test of explicitly using uge & ule instead of eq. 171define i1 @test_eq_as_uge_ule_(i8 %a, i8 %b) { 172; CHECK-LABEL: @test_eq_as_uge_ule_( 173; CHECK-NEXT: entry: 174; CHECK-NEXT: [[PRE_1:%.*]] = icmp uge i8 [[A:%.*]], [[B:%.*]] 175; CHECK-NEXT: [[PRE_2:%.*]] = icmp ule i8 [[A]], [[B]] 176; CHECK-NEXT: [[PRE_AND:%.*]] = and i1 [[PRE_1]], [[PRE_2]] 177; CHECK-NEXT: br i1 [[PRE_AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 178; CHECK: then: 179; CHECK-NEXT: [[PRE_3:%.*]] = icmp ult i8 [[B]], 100 180; CHECK-NEXT: br i1 [[PRE_3]], label [[THEN_THEN:%.*]], label [[THEN_ELSE:%.*]] 181; CHECK: then.then: 182; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 true, true 183; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[XOR_1]], false 184; CHECK-NEXT: [[XOR_3:%.*]] = xor i1 [[XOR_2]], false 185; CHECK-NEXT: [[XOR_4:%.*]] = xor i1 [[XOR_3]], false 186; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[A]], 99 187; CHECK-NEXT: [[XOR_5:%.*]] = xor i1 [[XOR_4]], [[C_1]] 188; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[A]], 98 189; CHECK-NEXT: [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_1]] 190; CHECK-NEXT: ret i1 [[XOR_6]] 191; CHECK: then.else: 192; CHECK-NEXT: [[XOR_7:%.*]] = xor i1 false, false 193; CHECK-NEXT: [[XOR_8:%.*]] = xor i1 [[XOR_7]], true 194; CHECK-NEXT: [[XOR_9:%.*]] = xor i1 [[XOR_8]], true 195; CHECK-NEXT: [[XOR_10:%.*]] = xor i1 [[XOR_9]], true 196; CHECK-NEXT: [[XOR_11:%.*]] = xor i1 [[XOR_10]], false 197; CHECK-NEXT: [[XOR_12:%.*]] = xor i1 [[XOR_11]], true 198; CHECK-NEXT: ret i1 [[XOR_12]] 199; CHECK: else: 200; CHECK-NEXT: [[CMP_2:%.*]] = icmp ult i8 [[A]], 100 201; CHECK-NEXT: ret i1 [[CMP_2]] 202; 203entry: 204 %pre.1 = icmp uge i8 %a, %b 205 %pre.2 = icmp ule i8 %a, %b 206 %pre.and = and i1 %pre.1, %pre.2 207 br i1 %pre.and, label %then, label %else 208 209then: 210 %pre.3 = icmp ult i8 %b, 100 211 br i1 %pre.3, label %then.then, label %then.else 212 213then.then: 214 %t.1 = icmp ult i8 %a, 100 215 %t.2 = icmp ult i8 %b, 100 216 %xor.1 = xor i1 %t.1, %t.2 217 218 %f.1 = icmp uge i8 %a, 100 219 %xor.2 = xor i1 %xor.1, %f.1 220 221 %f.2 = icmp uge i8 %b, 100 222 %xor.3 = xor i1 %xor.2, %f.2 223 224 %f.3.1 = icmp ugt i8 %a, 99 225 %xor.4 = xor i1 %xor.3, %f.3.1 226 227 %c.1 = icmp ult i8 %a, 99 228 %xor.5 = xor i1 %xor.4, %c.1 229 230 %c.2 = icmp ugt i8 %a, 98 231 %xor.6 = xor i1 %xor.5, %c.1 232 233 ret i1 %xor.6 234 235then.else: 236 %f.4 = icmp ult i8 %a, 100 237 %f.5 = icmp ult i8 %b, 100 238 %xor.7 = xor i1 %f.4, %f.5 239 240 %t.3 = icmp uge i8 %a, 100 241 %xor.8 = xor i1 %xor.7, %t.3 242 243 %t.4 = icmp uge i8 %b, 100 244 %xor.9 = xor i1 %xor.8, %t.4 245 246 %t.5 = icmp ugt i8 %a, 99 247 %xor.10 = xor i1 %xor.9, %t.5 248 249 %c.3 = icmp ult i8 %a, 99 250 %xor.11 = xor i1 %xor.10, %c.3 251 252 %c.4 = icmp ugt i8 %a, 98 253 %xor.12 = xor i1 %xor.11, %c.4 254 255 ret i1 %xor.12 256 257else: 258 %cmp.2 = icmp ult i8 %a, 100 259 ret i1 %cmp.2 260} 261 262 263define i1 @test_eq_ult_and(i8 %a, i8 %b) { 264; CHECK-LABEL: @test_eq_ult_and( 265; CHECK-NEXT: entry: 266; CHECK-NEXT: [[PRE_1:%.*]] = icmp eq i8 [[A:%.*]], [[B:%.*]] 267; CHECK-NEXT: [[PRE_2:%.*]] = icmp ult i8 [[B]], 100 268; CHECK-NEXT: [[PRE_AND:%.*]] = and i1 [[PRE_1]], [[PRE_2]] 269; CHECK-NEXT: br i1 [[PRE_AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 270; CHECK: then: 271; CHECK-NEXT: [[XOR_1:%.*]] = xor i1 true, true 272; CHECK-NEXT: [[XOR_2:%.*]] = xor i1 [[XOR_1]], false 273; CHECK-NEXT: [[XOR_3:%.*]] = xor i1 [[XOR_2]], false 274; CHECK-NEXT: [[XOR_4:%.*]] = xor i1 [[XOR_3]], false 275; CHECK-NEXT: [[C_1:%.*]] = icmp ult i8 [[A]], 99 276; CHECK-NEXT: [[XOR_5:%.*]] = xor i1 [[XOR_4]], [[C_1]] 277; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i8 [[A]], 98 278; CHECK-NEXT: [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_1]] 279; CHECK-NEXT: ret i1 [[XOR_6]] 280; CHECK: else: 281; CHECK-NEXT: [[F_4:%.*]] = icmp ult i8 [[A]], 100 282; CHECK-NEXT: [[F_5:%.*]] = icmp ult i8 [[B]], 100 283; CHECK-NEXT: [[XOR_7:%.*]] = xor i1 [[F_4]], [[F_5]] 284; CHECK-NEXT: [[T_3:%.*]] = icmp uge i8 [[A]], 100 285; CHECK-NEXT: [[XOR_8:%.*]] = xor i1 [[XOR_7]], [[T_3]] 286; CHECK-NEXT: [[T_4:%.*]] = icmp uge i8 [[B]], 100 287; CHECK-NEXT: [[XOR_9:%.*]] = xor i1 [[XOR_8]], [[T_4]] 288; CHECK-NEXT: [[T_5:%.*]] = icmp ugt i8 [[A]], 99 289; CHECK-NEXT: [[XOR_10:%.*]] = xor i1 [[XOR_9]], [[T_5]] 290; CHECK-NEXT: [[C_3:%.*]] = icmp ult i8 [[A]], 99 291; CHECK-NEXT: [[XOR_11:%.*]] = xor i1 [[XOR_10]], [[C_3]] 292; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i8 [[A]], 98 293; CHECK-NEXT: [[XOR_12:%.*]] = xor i1 [[XOR_11]], [[C_4]] 294; CHECK-NEXT: ret i1 [[XOR_12]] 295; 296entry: 297 %pre.1 = icmp eq i8 %a, %b 298 %pre.2 = icmp ult i8 %b, 100 299 %pre.and = and i1 %pre.1, %pre.2 300 br i1 %pre.and, label %then, label %else 301 302then: 303 %t.1 = icmp ult i8 %a, 100 304 %t.2 = icmp ult i8 %b, 100 305 %xor.1 = xor i1 %t.1, %t.2 306 307 %f.1 = icmp uge i8 %a, 100 308 %xor.2 = xor i1 %xor.1, %f.1 309 310 %f.2 = icmp uge i8 %b, 100 311 %xor.3 = xor i1 %xor.2, %f.2 312 313 %f.3.1 = icmp ugt i8 %a, 99 314 %xor.4 = xor i1 %xor.3, %f.3.1 315 316 %c.1 = icmp ult i8 %a, 99 317 %xor.5 = xor i1 %xor.4, %c.1 318 319 %c.2 = icmp ugt i8 %a, 98 320 %xor.6 = xor i1 %xor.5, %c.1 321 322 ret i1 %xor.6 323 324else: 325 %f.4 = icmp ult i8 %a, 100 326 %f.5 = icmp ult i8 %b, 100 327 %xor.7 = xor i1 %f.4, %f.5 328 329 %t.3 = icmp uge i8 %a, 100 330 %xor.8 = xor i1 %xor.7, %t.3 331 332 %t.4 = icmp uge i8 %b, 100 333 %xor.9 = xor i1 %xor.8, %t.4 334 335 %t.5 = icmp ugt i8 %a, 99 336 %xor.10 = xor i1 %xor.9, %t.5 337 338 %c.3 = icmp ult i8 %a, 99 339 %xor.11 = xor i1 %xor.10, %c.3 340 341 %c.4 = icmp ugt i8 %a, 98 342 %xor.12 = xor i1 %xor.11, %c.4 343 344 ret i1 %xor.12 345} 346 347define i1 @assume_b_plus_1_ult_a(i64 %a, i64 %b) { 348; CHECK-LABEL: @assume_b_plus_1_ult_a( 349; CHECK-NEXT: [[TMP1:%.*]] = add nuw i64 [[B:%.*]], 1 350; CHECK-NEXT: [[TMP2:%.*]] = icmp ult i64 [[TMP1]], [[A:%.*]] 351; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP2]]) 352; CHECK-NEXT: ret i1 false 353; 354 %1 = add nuw i64 %b, 1 355 %2 = icmp ult i64 %1, %a 356 tail call void @llvm.assume(i1 %2) 357 %3 = icmp eq i64 %a, %b 358 ret i1 %3 359} 360 361define i1 @assume_a_plus_1_eq_b(i64 %a, i64 %b) { 362; CHECK-LABEL: @assume_a_plus_1_eq_b( 363; CHECK-NEXT: [[TMP1:%.*]] = add nuw i64 [[A:%.*]], 1 364; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], [[B:%.*]] 365; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP2]]) 366; CHECK-NEXT: ret i1 false 367; 368 %1 = add nuw i64 %a, 1 369 %2 = icmp eq i64 %1, %b 370 tail call void @llvm.assume(i1 %2) 371 %3 = icmp eq i64 %a, %b 372 ret i1 %3 373} 374 375define i1 @assume_a_ge_b_and_b_ge_c(i64 %a, i64 %b, i64 %c) { 376; CHECK-LABEL: @assume_a_ge_b_and_b_ge_c( 377; CHECK-NEXT: [[TMP1:%.*]] = icmp uge i64 [[A:%.*]], [[B:%.*]] 378; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP1]]) 379; CHECK-NEXT: [[TMP2:%.*]] = icmp uge i64 [[B]], [[C:%.*]] 380; CHECK-NEXT: tail call void @llvm.assume(i1 [[TMP2]]) 381; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i64 [[A]], [[C]] 382; CHECK-NEXT: ret i1 [[TMP3]] 383; 384 %1 = icmp uge i64 %a, %b 385 tail call void @llvm.assume(i1 %1) 386 %2 = icmp uge i64 %b, %c 387 tail call void @llvm.assume(i1 %2) 388 %3 = icmp eq i64 %a, %c 389 ret i1 %3 390} 391 392define i1 @test_transitivity_of_equality_and_plus_1(i64 %a, i64 %b, i64 %c) { 393; CHECK-LABEL: @test_transitivity_of_equality_and_plus_1( 394; CHECK-NEXT: entry: 395; CHECK-NEXT: [[PRE_1:%.*]] = icmp eq i64 [[A:%.*]], [[B:%.*]] 396; CHECK-NEXT: br i1 [[PRE_1]], label [[AB_EQUAL:%.*]], label [[NOT_EQ:%.*]] 397; CHECK: ab_equal: 398; CHECK-NEXT: [[BC_EQ:%.*]] = icmp eq i64 [[B]], [[C:%.*]] 399; CHECK-NEXT: br i1 [[BC_EQ]], label [[BC_EQUAL:%.*]], label [[NOT_EQ]] 400; CHECK: bc_equal: 401; CHECK-NEXT: [[A_PLUS_1:%.*]] = add nuw i64 [[A]], 1 402; CHECK-NEXT: [[C_PLUS_1:%.*]] = add nuw i64 [[C]], 1 403; CHECK-NEXT: [[RESULT:%.*]] = and i1 true, true 404; CHECK-NEXT: ret i1 [[RESULT]] 405; CHECK: not_eq: 406; CHECK-NEXT: ret i1 false 407; 408entry: 409 %pre.1 = icmp eq i64 %a, %b 410 br i1 %pre.1, label %ab_equal, label %not_eq 411 412ab_equal: 413 %bc_eq = icmp eq i64 %b, %c 414 br i1 %bc_eq, label %bc_equal, label %not_eq 415 416bc_equal: 417 %ac_eq = icmp eq i64 %a, %c 418 %a_plus_1 = add nuw i64 %a, 1 419 %c_plus_1 = add nuw i64 %c, 1 420 %ac_plus_1_eq = icmp eq i64 %a_plus_1, %c_plus_1 421 %result = and i1 %ac_eq, %ac_plus_1_eq 422 ret i1 %result 423 424not_eq: 425 ret i1 false 426} 427 428define i1 @test_eq_for_signed_cmp(i32 noundef %v0, i32 noundef %v1, i32 noundef %v2) { 429; CHECK-LABEL: @test_eq_for_signed_cmp( 430; CHECK-NEXT: entry: 431; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[V2:%.*]], [[V0:%.*]] 432; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[V0]], [[V1:%.*]] 433; CHECK-NEXT: [[AND0:%.*]] = and i1 [[CMP1]], [[CMP]] 434; CHECK-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[V1]], [[V2]] 435; CHECK-NEXT: [[AND1:%.*]] = and i1 false, [[AND0]] 436; CHECK-NEXT: ret i1 [[AND1]] 437; 438entry: 439 %cmp = icmp eq i32 %v2, %v0 440 %cmp1 = icmp sge i32 %v0, %v1 441 %and0 = and i1 %cmp1, %cmp 442 %cmp4 = icmp sgt i32 %v1, %v2 443 %and1 = and i1 %cmp4, %and0 444 ret i1 %and1 445} 446 447define i1 @test_eq_for_signed_cmp_with_decompsition(i32 noundef %v0, i32 noundef %v1, i32 noundef %v2, i32 noundef %addend0, i32 noundef %addend1) { 448; CHECK-LABEL: @test_eq_for_signed_cmp_with_decompsition( 449; CHECK-NEXT: entry: 450; CHECK-NEXT: [[V0ADD:%.*]] = add nsw i32 [[V0:%.*]], [[ADDEND0:%.*]] 451; CHECK-NEXT: [[V1ADD:%.*]] = add nsw i32 [[V1:%.*]], [[ADDEND1:%.*]] 452; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[V2:%.*]], [[V0ADD]] 453; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[V0ADD]], [[V1ADD]] 454; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i32 [[ADDEND0]], 0 455; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i32 [[ADDEND0]], [[ADDEND1]] 456; CHECK-NEXT: [[AND0:%.*]] = and i1 [[CMP1]], [[CMP]] 457; CHECK-NEXT: [[AND1:%.*]] = and i1 [[AND0]], [[CMP2]] 458; CHECK-NEXT: [[AND2:%.*]] = and i1 [[AND1]], [[CMP3]] 459; CHECK-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[V1]], [[V2]] 460; CHECK-NEXT: [[AND3:%.*]] = and i1 false, [[AND2]] 461; CHECK-NEXT: ret i1 [[AND3]] 462; 463entry: 464 %v0add = add nsw i32 %v0, %addend0 465 %v1add = add nsw i32 %v1, %addend1 466 %cmp = icmp eq i32 %v2, %v0add 467 %cmp1 = icmp sge i32 %v0add, %v1add 468 %cmp2 = icmp sge i32 %addend0, 0 469 %cmp3 = icmp slt i32 %addend0, %addend1 470 %and0 = and i1 %cmp1, %cmp 471 %and1 = and i1 %and0, %cmp2 472 %and2 = and i1 %and1, %cmp3 473 %cmp4 = icmp sgt i32 %v1, %v2 474 %and3 = and i1 %cmp4, %and2 475 ret i1 %and3 476} 477