1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 3 4; The system for the function below grows quite large. Check to make sure 5; we can handle that scenario. 6define void @test(i64 %x, ptr %y, ptr %z, ptr %w) { 7; CHECK-LABEL: @test( 8; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds i8, ptr [[Y:%.*]], i64 [[X:%.*]] 9; CHECK-NEXT: [[TMP26:%.*]] = icmp ult ptr [[TMP22]], [[Z:%.*]] 10; CHECK-NEXT: br i1 [[TMP26]], label [[BB28:%.*]], label [[EARLY_EXIT:%.*]] 11; CHECK: early.exit: 12; CHECK-NEXT: unreachable 13; CHECK: bb28: 14; CHECK-NEXT: [[TMP29:%.*]] = getelementptr inbounds i8, ptr [[Y]], i64 [[X]] 15; CHECK-NEXT: [[TMP30:%.*]] = icmp ult ptr [[TMP29]], [[Z]] 16; CHECK-NEXT: br i1 [[TMP30]], label [[EARLY_EXIT]], label [[BB32:%.*]] 17; CHECK: bb32: 18; CHECK-NEXT: [[TMP33:%.*]] = icmp ult ptr [[TMP29]], [[Z]] 19; CHECK-NEXT: br i1 [[TMP33]], label [[BB35:%.*]], label [[EARLY_EXIT]] 20; CHECK: bb35: 21; CHECK-NEXT: [[TMP36:%.*]] = icmp ult ptr [[Y]], [[Z]] 22; CHECK-NEXT: br i1 [[TMP36]], label [[EARLY_EXIT]], label [[BB38:%.*]] 23; CHECK: bb38: 24; CHECK-NEXT: br i1 false, label [[EARLY_EXIT]], label [[BB43:%.*]] 25; CHECK: bb43: 26; CHECK-NEXT: [[TMP47:%.*]] = getelementptr inbounds i8, ptr [[W:%.*]], i64 [[X]] 27; CHECK-NEXT: [[TMP48:%.*]] = icmp ult ptr [[TMP47]], [[Y]] 28; CHECK-NEXT: br i1 [[TMP48]], label [[EARLY_EXIT]], label [[BB50:%.*]] 29; CHECK: bb50: 30; CHECK-NEXT: [[TMP52:%.*]] = getelementptr inbounds i8, ptr [[W]], i64 [[X]] 31; CHECK-NEXT: [[TMP53:%.*]] = icmp ult ptr [[TMP52]], [[Y]] 32; CHECK-NEXT: br i1 [[TMP53]], label [[EARLY_EXIT]], label [[BB55:%.*]] 33; CHECK: bb55: 34; CHECK-NEXT: [[TMP57:%.*]] = icmp ult ptr [[W]], [[Y]] 35; CHECK-NEXT: br i1 [[TMP57]], label [[BB59:%.*]], label [[EARLY_EXIT]] 36; CHECK: bb59: 37; CHECK-NEXT: call void @use(i1 true) 38; CHECK-NEXT: ret void 39; 40 %tmp22 = getelementptr inbounds i8, ptr %y, i64 %x 41 %tmp26 = icmp ult ptr %tmp22, %z 42 br i1 %tmp26, label %bb28, label %early.exit 43 44early.exit: 45 unreachable 46 47bb28: 48 %tmp29 = getelementptr inbounds i8, ptr %y, i64 %x 49 %tmp30 = icmp ult ptr %tmp29, %z 50 br i1 %tmp30, label %early.exit, label %bb32 51 52bb32: 53 %tmp33 = icmp ult ptr %tmp29, %z 54 br i1 %tmp33, label %bb35, label %early.exit 55 56bb35: 57 %tmp36 = icmp ult ptr %y, %z 58 br i1 %tmp36, label %early.exit, label %bb38 59 60bb38: 61 %tmp41 = icmp ult ptr %y, %z 62 br i1 %tmp41, label %early.exit, label %bb43 63 64bb43: 65 %tmp47 = getelementptr inbounds i8, ptr %w, i64 %x 66 %tmp48 = icmp ult ptr %tmp47, %y 67 br i1 %tmp48, label %early.exit, label %bb50 68 69bb50: 70 %tmp52 = getelementptr inbounds i8, ptr %w, i64 %x 71 %tmp53 = icmp ult ptr %tmp52, %y 72 br i1 %tmp53, label %early.exit, label %bb55 73 74bb55: 75 %tmp57 = icmp ult ptr %w, %y 76 br i1 %tmp57, label %bb59, label %early.exit 77 78bb59: 79 %tmp60 = icmp ult ptr %w, %y 80 call void @use(i1 %tmp60) 81 ret void 82} 83 84declare void @use(i1) 85