1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3 4define void @test.not.uge.ult(i8 %start, i8 %low, i8 %high) { 5; CHECK-LABEL: @test.not.uge.ult( 6; CHECK-NEXT: entry: 7; CHECK-NEXT: [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3 8; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]] 9; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 10; CHECK: if.then: 11; CHECK-NEXT: ret void 12; CHECK: if.end: 13; CHECK-NEXT: [[T_0:%.*]] = icmp ult i8 [[START]], [[HIGH]] 14; CHECK-NEXT: call void @use(i1 [[T_0]]) 15; CHECK-NEXT: [[START_1:%.*]] = sub nuw i8 [[START]], 1 16; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8 [[START_1]], [[HIGH]] 17; CHECK-NEXT: call void @use(i1 [[T_1]]) 18; CHECK-NEXT: [[START_2:%.*]] = sub nuw i8 [[START]], 2 19; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8 [[START_2]], [[HIGH]] 20; CHECK-NEXT: call void @use(i1 [[T_2]]) 21; CHECK-NEXT: [[START_3:%.*]] = sub nuw i8 [[START]], 3 22; CHECK-NEXT: call void @use(i1 true) 23; CHECK-NEXT: [[START_4:%.*]] = sub nuw i8 [[START]], 4 24; CHECK-NEXT: call void @use(i1 true) 25; CHECK-NEXT: ret void 26; 27entry: 28 %sub.ptr.i = sub nuw i8 %start, 3 29 %c.1 = icmp uge i8 %sub.ptr.i, %high 30 br i1 %c.1, label %if.then, label %if.end 31 32if.then: ; preds = %entry 33 ret void 34 35if.end: ; preds = %entry 36 %t.0 = icmp ult i8 %start, %high 37 call void @use(i1 %t.0) 38 %start.1 = sub nuw i8 %start, 1 39 %t.1 = icmp ult i8 %start.1, %high 40 call void @use(i1 %t.1) 41 %start.2 = sub nuw i8 %start, 2 42 %t.2 = icmp ult i8 %start.2, %high 43 call void @use(i1 %t.2) 44 %start.3 = sub nuw i8 %start, 3 45 %t.3 = icmp ult i8 %start.3, %high 46 call void @use(i1 %t.3) 47 %start.4 = sub nuw i8 %start, 4 48 %c.4 = icmp ult i8 %start.4, %high 49 call void @use(i1 %c.4) 50 ret void 51} 52 53define void @test.not.uge.ule(i8 %start, i8 %low, i8 %high) { 54; CHECK-LABEL: @test.not.uge.ule( 55; CHECK-NEXT: entry: 56; CHECK-NEXT: [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3 57; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]] 58; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 59; CHECK: if.then: 60; CHECK-NEXT: ret void 61; CHECK: if.end: 62; CHECK-NEXT: [[T_0:%.*]] = icmp ule i8 [[START]], [[HIGH]] 63; CHECK-NEXT: call void @use(i1 [[T_0]]) 64; CHECK-NEXT: [[START_1:%.*]] = sub nuw i8 [[START]], 1 65; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8 [[START_1]], [[HIGH]] 66; CHECK-NEXT: call void @use(i1 [[T_1]]) 67; CHECK-NEXT: [[START_2:%.*]] = sub nuw i8 [[START]], 2 68; CHECK-NEXT: call void @use(i1 true) 69; CHECK-NEXT: [[START_3:%.*]] = sub nuw i8 [[START]], 3 70; CHECK-NEXT: call void @use(i1 true) 71; CHECK-NEXT: [[START_4:%.*]] = sub nuw i8 [[START]], 4 72; CHECK-NEXT: call void @use(i1 true) 73; CHECK-NEXT: [[START_5:%.*]] = sub nuw i8 [[START]], 5 74; CHECK-NEXT: call void @use(i1 true) 75; CHECK-NEXT: ret void 76; 77entry: 78 %sub.ptr.i = sub nuw i8 %start, 3 79 %c.1 = icmp uge i8 %sub.ptr.i, %high 80 br i1 %c.1, label %if.then, label %if.end 81 82if.then: ; preds = %entry 83 ret void 84 85if.end: ; preds = %entry 86 %t.0 = icmp ule i8 %start, %high 87 call void @use(i1 %t.0) 88 %start.1 = sub nuw i8 %start, 1 89 %t.1 = icmp ule i8 %start.1, %high 90 call void @use(i1 %t.1) 91 %start.2 = sub nuw i8 %start, 2 92 %t.2 = icmp ule i8 %start.2, %high 93 call void @use(i1 %t.2) 94 %start.3 = sub nuw i8 %start, 3 95 %t.3 = icmp ule i8 %start.3, %high 96 call void @use(i1 %t.3) 97 %start.4 = sub nuw i8 %start, 4 98 %t.4 = icmp ule i8 %start.4, %high 99 call void @use(i1 %t.4) 100 101 %start.5 = sub nuw i8 %start, 5 102 %c.5 = icmp ule i8 %start.5, %high 103 call void @use(i1 %c.5) 104 105 ret void 106} 107 108define void @test.not.uge.ugt(i8 %start, i8 %low, i8 %high) { 109; CHECK-LABEL: @test.not.uge.ugt( 110; CHECK-NEXT: entry: 111; CHECK-NEXT: [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3 112; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]] 113; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 114; CHECK: if.then: 115; CHECK-NEXT: ret void 116; CHECK: if.end: 117; CHECK-NEXT: [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]] 118; CHECK-NEXT: call void @use(i1 [[F_0]]) 119; CHECK-NEXT: [[START_1:%.*]] = sub nuw i8 [[START]], 1 120; CHECK-NEXT: [[F_1:%.*]] = icmp ugt i8 [[START_1]], [[HIGH]] 121; CHECK-NEXT: call void @use(i1 [[F_1]]) 122; CHECK-NEXT: [[START_2:%.*]] = sub nuw i8 [[START]], 2 123; CHECK-NEXT: call void @use(i1 false) 124; CHECK-NEXT: [[START_3:%.*]] = sub nuw i8 [[START]], 3 125; CHECK-NEXT: call void @use(i1 false) 126; CHECK-NEXT: [[START_4:%.*]] = sub nuw i8 [[START]], 4 127; CHECK-NEXT: call void @use(i1 false) 128; CHECK-NEXT: [[START_5:%.*]] = sub nuw i8 [[START]], 5 129; CHECK-NEXT: call void @use(i1 false) 130; CHECK-NEXT: ret void 131; 132entry: 133 %sub.ptr.i = sub nuw i8 %start, 3 134 %c.1 = icmp uge i8 %sub.ptr.i, %high 135 br i1 %c.1, label %if.then, label %if.end 136 137if.then: ; preds = %entry 138 ret void 139 140if.end: ; preds = %entry 141 %f.0 = icmp ugt i8 %start, %high 142 call void @use(i1 %f.0) 143 144 %start.1 = sub nuw i8 %start, 1 145 %f.1 = icmp ugt i8 %start.1, %high 146 call void @use(i1 %f.1) 147 148 %start.2 = sub nuw i8 %start, 2 149 %f.2 = icmp ugt i8 %start.2, %high 150 call void @use(i1 %f.2) 151 152 %start.3 = sub nuw i8 %start, 3 153 %f.3 = icmp ugt i8 %start.3, %high 154 call void @use(i1 %f.3) 155 156 %start.4 = sub nuw i8 %start, 4 157 %f.4 = icmp ugt i8 %start.4, %high 158 call void @use(i1 %f.4) 159 160 %start.5 = sub nuw i8 %start, 5 161 %c.5 = icmp ugt i8 %start.5, %high 162 call void @use(i1 %c.5) 163 164 ret void 165} 166 167define void @test.not.uge.uge(i8 %start, i8 %low, i8 %high) { 168; CHECK-LABEL: @test.not.uge.uge( 169; CHECK-NEXT: entry: 170; CHECK-NEXT: [[SUB_PTR_I:%.*]] = sub nuw i8 [[START:%.*]], 3 171; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8 [[SUB_PTR_I]], [[HIGH:%.*]] 172; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] 173; CHECK: if.then: 174; CHECK-NEXT: ret void 175; CHECK: if.end: 176; CHECK-NEXT: [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]] 177; CHECK-NEXT: call void @use(i1 [[F_0]]) 178; CHECK-NEXT: [[START_1:%.*]] = sub nuw i8 [[START]], 1 179; CHECK-NEXT: [[F_1:%.*]] = icmp uge i8 [[START_1]], [[HIGH]] 180; CHECK-NEXT: call void @use(i1 [[F_1]]) 181; CHECK-NEXT: [[START_2:%.*]] = sub nuw i8 [[START]], 2 182; CHECK-NEXT: [[F_2:%.*]] = icmp uge i8 [[START_2]], [[HIGH]] 183; CHECK-NEXT: call void @use(i1 [[F_2]]) 184; CHECK-NEXT: [[START_3:%.*]] = sub nuw i8 [[START]], 3 185; CHECK-NEXT: call void @use(i1 false) 186; CHECK-NEXT: [[START_4:%.*]] = sub nuw i8 [[START]], 4 187; CHECK-NEXT: call void @use(i1 false) 188; CHECK-NEXT: [[START_5:%.*]] = sub nuw i8 [[START]], 5 189; CHECK-NEXT: call void @use(i1 false) 190; CHECK-NEXT: ret void 191; 192entry: 193 %sub.ptr.i = sub nuw i8 %start, 3 194 %c.1 = icmp uge i8 %sub.ptr.i, %high 195 br i1 %c.1, label %if.then, label %if.end 196 197if.then: ; preds = %entry 198 ret void 199 200if.end: ; preds = %entry 201 %f.0 = icmp ugt i8 %start, %high 202 call void @use(i1 %f.0) 203 204 %start.1 = sub nuw i8 %start, 1 205 %f.1 = icmp uge i8 %start.1, %high 206 call void @use(i1 %f.1) 207 208 %start.2 = sub nuw i8 %start, 2 209 %f.2 = icmp uge i8 %start.2, %high 210 call void @use(i1 %f.2) 211 212 %start.3 = sub nuw i8 %start, 3 213 %f.3 = icmp uge i8 %start.3, %high 214 call void @use(i1 %f.3) 215 216 %start.4 = sub nuw i8 %start, 4 217 %c.4 = icmp uge i8 %start.4, %high 218 call void @use(i1 %c.4) 219 220 %start.5 = sub nuw i8 %start, 5 221 %c.5 = icmp uge i8 %start.5, %high 222 call void @use(i1 %c.5) 223 224 ret void 225} 226 227define i16 @test_pr53123_sub_constraint_sign(i16 %v) { 228; CHECK-LABEL: @test_pr53123_sub_constraint_sign( 229; CHECK-NEXT: bb.0: 230; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i16 32767, [[V:%.*]] 231; CHECK-NEXT: [[CMP1:%.*]] = icmp ugt i16 [[V]], [[SUB]] 232; CHECK-NEXT: br i1 [[CMP1]], label [[BB_2:%.*]], label [[BB_1:%.*]] 233; CHECK: bb.1: 234; CHECK-NEXT: [[ADD:%.*]] = shl nuw nsw i16 [[V]], 1 235; CHECK-NEXT: [[SUB9:%.*]] = sub nuw nsw i16 32767, [[ADD]] 236; CHECK-NEXT: [[CMP11:%.*]] = icmp ugt i16 [[ADD]], [[SUB9]] 237; CHECK-NEXT: br i1 [[CMP11]], label [[BB_3:%.*]], label [[BB_2]] 238; CHECK: bb.2: 239; CHECK-NEXT: ret i16 1 240; CHECK: bb.3: 241; CHECK-NEXT: ret i16 0 242; 243bb.0: 244 %sub = sub nuw nsw i16 32767, %v 245 %cmp1 = icmp ugt i16 %v, %sub 246 br i1 %cmp1, label %bb.2, label %bb.1 247 248bb.1: 249 %add = shl nuw nsw i16 %v, 1 250 %sub9 = sub nuw nsw i16 32767, %add 251 %cmp11 = icmp ugt i16 %add, %sub9 252 br i1 %cmp11, label %bb.3, label %bb.2 253 254bb.2: 255 ret i16 1 256 257bb.3: 258 ret i16 0 259} 260 261declare void @use(i1) 262 263define i1 @sub_nuw_i16_simp(i16 %a) { 264; CHECK-LABEL: @sub_nuw_i16_simp( 265; CHECK-NEXT: entry: 266; CHECK-NEXT: [[NEG2:%.*]] = sub nuw i16 [[A:%.*]], 305 267; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i16 0, [[NEG2]] 268; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]] 269; CHECK: exit.1: 270; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i16 [[A]], 0 271; CHECK-NEXT: ret i1 [[C_2]] 272; CHECK: exit.2: 273; CHECK-NEXT: ret i1 true 274; 275entry: 276 %neg2 = sub nuw i16 %a, 305 277 %c.1 = icmp ugt i16 0, %neg2 278 br i1 %c.1, label %exit.1, label %exit.2 279 280exit.1: 281 %c.2 = icmp ugt i16 %a, 0 282 ret i1 %c.2 283 284exit.2: 285 %c.3 = icmp ugt i16 %a, 0 286 ret i1 %c.3 287} 288 289define i1 @sub_nuw_i64_simp(i64 %a) { 290; CHECK-LABEL: @sub_nuw_i64_simp( 291; CHECK-NEXT: entry: 292; CHECK-NEXT: [[NEG2:%.*]] = sub nuw i64 [[A:%.*]], 305 293; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i64 0, [[NEG2]] 294; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]] 295; CHECK: exit.1: 296; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i64 [[A]], 0 297; CHECK-NEXT: ret i1 [[C_2]] 298; CHECK: exit.2: 299; CHECK-NEXT: ret i1 true 300; 301entry: 302 %neg2 = sub nuw i64 %a, 305 303 %c.1 = icmp ugt i64 0, %neg2 304 br i1 %c.1, label %exit.1, label %exit.2 305 306exit.1: 307 %c.2 = icmp ugt i64 %a, 0 308 ret i1 %c.2 309 310exit.2: 311 %c.3 = icmp ugt i64 %a, 0 312 ret i1 %c.3 313} 314 315define i1 @sub_nuw_neg_i16(i16 %a) { 316; CHECK-LABEL: @sub_nuw_neg_i16( 317; CHECK-NEXT: entry: 318; CHECK-NEXT: [[NEG2:%.*]] = sub nuw i16 [[A:%.*]], -305 319; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i16 0, [[NEG2]] 320; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]] 321; CHECK: exit.1: 322; CHECK-NEXT: [[C_2:%.*]] = icmp ugt i16 [[A]], 0 323; CHECK-NEXT: ret i1 [[C_2]] 324; CHECK: exit.2: 325; CHECK-NEXT: ret i1 true 326; 327entry: 328 %neg2 = sub nuw i16 %a, -305 329 %c.1 = icmp ugt i16 0, %neg2 330 br i1 %c.1, label %exit.1, label %exit.2 331 332exit.1: 333 %c.2 = icmp ugt i16 %a, 0 334 ret i1 %c.2 335 336exit.2: 337 %c.3 = icmp ugt i16 %a, 0 338 ret i1 %c.3 339} 340 341declare void @llvm.assume(i1) 342 343define i1 @wrapping_offset_sum(i64 %x) { 344; CHECK-LABEL: @wrapping_offset_sum( 345; CHECK-NEXT: [[NON_ZERO:%.*]] = icmp ugt i64 [[X:%.*]], 0 346; CHECK-NEXT: call void @llvm.assume(i1 [[NON_ZERO]]) 347; CHECK-NEXT: [[ADD:%.*]] = sub nuw i64 [[X]], 9223372036854775802 348; CHECK-NEXT: [[ULT:%.*]] = icmp ugt i64 200, [[ADD]] 349; CHECK-NEXT: ret i1 [[ULT]] 350; 351 %non.zero = icmp ugt i64 %x, 0 352 call void @llvm.assume(i1 %non.zero) 353 %add = sub nuw i64 %x, 9223372036854775802 354 %ult = icmp ugt i64 200, %add 355 ret i1 %ult 356} 357 358define i1 @sub_nuw_i64_signed_min(i64 %a) { 359; CHECK-LABEL: @sub_nuw_i64_signed_min( 360; CHECK-NEXT: entry: 361; CHECK-NEXT: [[SUB:%.*]] = sub nuw i64 [[A:%.*]], -9223372036854775808 362; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i64 [[A]], [[SUB]] 363; CHECK-NEXT: ret i1 [[C_1]] 364; 365entry: 366 %sub = sub nuw i64 %a, -9223372036854775808 367 %c.1 = icmp ugt i64 %a, %sub 368 ret i1 %c.1 369} 370 371define i1 @sub_nuw_i64_signed_min_const(i64 %a) { 372; CHECK-LABEL: @sub_nuw_i64_signed_min_const( 373; CHECK-NEXT: entry: 374; CHECK-NEXT: [[NEG2:%.*]] = sub nuw i64 0, -9223372036854775808 375; CHECK-NEXT: [[C:%.*]] = icmp ugt i64 [[NEG2]], 0 376; CHECK-NEXT: ret i1 [[C]] 377; 378entry: 379 %neg2 = sub nuw i64 0, -9223372036854775808 380 %c = icmp ugt i64 %neg2, 0 381 ret i1 %c 382} 383 384define i1 @pr76713(i16 %i1, i16 %i3) { 385; CHECK-LABEL: @pr76713( 386; CHECK-NEXT: entry: 387; CHECK-NEXT: [[C1:%.*]] = icmp ult i16 [[I1:%.*]], -1 388; CHECK-NEXT: [[C2:%.*]] = icmp uge i16 [[I1]], -3 389; CHECK-NEXT: [[C3:%.*]] = icmp ult i16 [[I3:%.*]], 2 390; CHECK-NEXT: [[AND:%.*]] = and i1 [[C1]], [[C2]] 391; CHECK-NEXT: [[AND_2:%.*]] = and i1 [[AND]], [[C3]] 392; CHECK-NEXT: br i1 [[AND]], label [[THEN:%.*]], label [[ELSE:%.*]] 393; CHECK: then: 394; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i16 [[I1]], -3 395; CHECK-NEXT: [[ARRAYIDX_IDX:%.*]] = mul nuw nsw i16 [[I3]], 4 396; CHECK-NEXT: [[I6:%.*]] = add nuw nsw i16 [[ARRAYIDX_IDX]], [[SUB]] 397; CHECK-NEXT: [[C4:%.*]] = icmp ult i16 12, [[I6]] 398; CHECK-NEXT: ret i1 [[C4]] 399; CHECK: else: 400; CHECK-NEXT: ret i1 false 401; 402entry: 403 %c1 = icmp ult i16 %i1, -1 404 %c2 = icmp uge i16 %i1, -3 405 %c3 = icmp ult i16 %i3, 2 406 %and = and i1 %c1, %c2 407 %and.2 = and i1 %and, %c3 408 br i1 %and, label %then, label %else 409 410then: 411 %sub = sub nuw nsw i16 %i1, -3 412 %arrayidx.idx = mul nuw nsw i16 %i3, 4 413 %i6 = add nuw nsw i16 %arrayidx.idx, %sub 414 %c4 = icmp ult i16 12, %i6 415 ret i1 %c4 416 417else: 418 ret i1 0 419} 420 421define void @sub_nuw_chained_positive_constants(i16 %a) { 422; CHECK-LABEL: @sub_nuw_chained_positive_constants( 423; CHECK-NEXT: entry: 424; CHECK-NEXT: [[SUB1:%.*]] = sub nuw i16 [[A:%.*]], 10 425; CHECK-NEXT: [[SUB2:%.*]] = sub nuw i16 [[SUB1]], 20 426; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i16 [[SUB2]], 90 427; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]] 428; CHECK: exit.1: 429; CHECK-NEXT: call void @use(i1 true) 430; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i16 [[A]], 121 431; CHECK-NEXT: call void @use(i1 [[C_3]]) 432; CHECK-NEXT: ret void 433; CHECK: exit.2: 434; CHECK-NEXT: call void @use(i1 false) 435; CHECK-NEXT: call void @use(i1 false) 436; CHECK-NEXT: ret void 437; 438entry: 439 %sub1 = sub nuw i16 %a, 10 440 %sub2 = sub nuw i16 %sub1, 20 441 %c.1 = icmp ugt i16 %sub2, 90 442 br i1 %c.1, label %exit.1, label %exit.2 443 444exit.1: 445 %c.2 = icmp ugt i16 %a, 120 446 call void @use(i1 %c.2) 447 %c.3 = icmp ugt i16 %a, 121 448 call void @use(i1 %c.3) 449 ret void 450 451exit.2: 452 %c.4 = icmp ugt i16 %a, 120 453 call void @use(i1 %c.4) 454 %c.5 = icmp ugt i16 %a, 121 455 call void @use(i1 %c.5) 456 ret void 457} 458 459define void @sub_nuw_chained_negative_constants(i8 %a) { 460; CHECK-LABEL: @sub_nuw_chained_negative_constants( 461; CHECK-NEXT: entry: 462; CHECK-NEXT: [[SUB1:%.*]] = sub nuw i8 [[A:%.*]], 10 463; CHECK-NEXT: [[SUB2:%.*]] = sub nuw i8 [[SUB1]], -126 464; CHECK-NEXT: [[C_1:%.*]] = icmp ugt i8 [[SUB2]], 20 465; CHECK-NEXT: br i1 [[C_1]], label [[EXIT_1:%.*]], label [[EXIT_2:%.*]] 466; CHECK: exit.1: 467; CHECK-NEXT: call void @use(i1 true) 468; CHECK-NEXT: [[C_3:%.*]] = icmp ugt i8 [[A]], -95 469; CHECK-NEXT: call void @use(i1 [[C_3]]) 470; CHECK-NEXT: ret void 471; CHECK: exit.2: 472; CHECK-NEXT: call void @use(i1 false) 473; CHECK-NEXT: call void @use(i1 false) 474; CHECK-NEXT: ret void 475; 476entry: 477 %sub1 = sub nuw i8 %a, 10 478 %sub2 = sub nuw i8 %sub1, 130 479 %c.1 = icmp ugt i8 %sub2, 20 480 br i1 %c.1, label %exit.1, label %exit.2 481 482exit.1: 483 %c.2 = icmp ugt i8 %a, 160 484 call void @use(i1 %c.2) 485 %c.3 = icmp ugt i8 %a, 161 486 call void @use(i1 %c.3) 487 ret void 488 489 490exit.2: 491 %c.4 = icmp ugt i8 %a, 160 492 call void @use(i1 %c.4) 493 %c.5 = icmp ugt i8 %a, 161 494 call void @use(i1 %c.5) 495 ret void 496} 497