247 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4define void @pointer.to.array.test.ult.true.due.to.first.dimension(ptr %start, ptr %high) {5; CHECK-LABEL: @pointer.to.array.test.ult.true.due.to.first.dimension(6; CHECK-NEXT: entry:7; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 9, i64 38; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_I]], [[HIGH:%.*]]9; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]10; CHECK: if.then:11; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 5, i64 012; CHECK-NEXT: call void @use(i1 true)13; CHECK-NEXT: ret void14; CHECK: if.end:15; CHECK-NEXT: ret void16;17entry:18 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 9, i64 319 %c.1 = icmp ule ptr %add.ptr.i, %high20 br i1 %c.1, label %if.then, label %if.end21 22if.then: ; preds = %entry23 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 024 %c.0 = icmp ult ptr %start.0, %high25 call void @use(i1 %c.0)26 ret void27 28if.end: ; preds = %entry29 ret void30}31 32define void @pointer.to.array.test.ult.unknown.due.to.first.dimension(ptr %start, ptr %high) {33; CHECK-LABEL: @pointer.to.array.test.ult.unknown.due.to.first.dimension(34; CHECK-NEXT: entry:35; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 5, i64 336; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_I]], [[HIGH:%.*]]37; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]38; CHECK: if.then:39; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 10, i64 040; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]]41; CHECK-NEXT: call void @use(i1 [[C_0]])42; CHECK-NEXT: ret void43; CHECK: if.end:44; CHECK-NEXT: ret void45;46entry:47 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 348 %c.1 = icmp ule ptr %add.ptr.i, %high49 br i1 %c.1, label %if.then, label %if.end50 51if.then: ; preds = %entry52 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 10, i64 053 %c.0 = icmp ult ptr %start.0, %high54 call void @use(i1 %c.0)55 ret void56 57if.end: ; preds = %entry58 ret void59}60 61define void @pointer.to.array.test.ult.true.due.to.second.dimension(ptr %start, ptr %high) {62; CHECK-LABEL: @pointer.to.array.test.ult.true.due.to.second.dimension(63; CHECK-NEXT: entry:64; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 5, i64 165; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_I]], [[HIGH:%.*]]66; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]67; CHECK: if.then:68; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 5, i64 069; CHECK-NEXT: call void @use(i1 true)70; CHECK-NEXT: ret void71; CHECK: if.end:72; CHECK-NEXT: ret void73;74entry:75 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 176 %c.1 = icmp ule ptr %add.ptr.i, %high77 br i1 %c.1, label %if.then, label %if.end78 79if.then: ; preds = %entry80 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 081 %c.0 = icmp ult ptr %start.0, %high82 call void @use(i1 %c.0)83 ret void84 85if.end: ; preds = %entry86 ret void87}88 89define void @pointer.to.array.test.ult.unknown.to.second.dimension(ptr %start, ptr %high) {90; CHECK-LABEL: @pointer.to.array.test.ult.unknown.to.second.dimension(91; CHECK-NEXT: entry:92; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 5, i64 093; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[ADD_PTR_I]], [[HIGH:%.*]]94; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]95; CHECK: if.then:96; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 5, i64 197; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]]98; CHECK-NEXT: call void @use(i1 [[C_0]])99; CHECK-NEXT: ret void100; CHECK: if.end:101; CHECK-NEXT: ret void102;103entry:104 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 0105 %c.1 = icmp ule ptr %add.ptr.i, %high106 br i1 %c.1, label %if.then, label %if.end107 108if.then: ; preds = %entry109 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 1110 %c.0 = icmp ult ptr %start.0, %high111 call void @use(i1 %c.0)112 ret void113 114if.end: ; preds = %entry115 ret void116}117 118define void @pointer.to.array.test.not.uge.ult(ptr %start, ptr %high) {119; CHECK-LABEL: @pointer.to.array.test.not.uge.ult(120; CHECK-NEXT: entry:121; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 1, i64 3122; CHECK-NEXT: [[C_1:%.*]] = icmp uge ptr [[ADD_PTR_I]], [[HIGH:%.*]]123; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]124; CHECK: if.then:125; CHECK-NEXT: ret void126; CHECK: if.end:127; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 10, i64 0128; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]]129; CHECK-NEXT: call void @use(i1 [[C_0]])130; CHECK-NEXT: ret void131;132entry:133 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3134 %c.1 = icmp uge ptr %add.ptr.i, %high135 br i1 %c.1, label %if.then, label %if.end136 137if.then: ; preds = %entry138 ret void139 140if.end: ; preds = %entry141 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 10, i64 0142 %c.0 = icmp ult ptr %start.0, %high143 call void @use(i1 %c.0)144 ret void145}146 147define void @pointer.to.array.test.not.uge.ule(ptr %start, ptr %high) {148; CHECK-LABEL: @pointer.to.array.test.not.uge.ule(149; CHECK-NEXT: entry:150; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 1, i64 3151; CHECK-NEXT: [[C:%.*]] = icmp uge ptr [[ADD_PTR_I]], [[HIGH:%.*]]152; CHECK-NEXT: br i1 [[C]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]153; CHECK: if.then:154; CHECK-NEXT: ret void155; CHECK: if.end:156; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 10, i64 0157; CHECK-NEXT: [[C_0:%.*]] = icmp ule ptr [[START_0]], [[HIGH]]158; CHECK-NEXT: call void @use(i1 [[C_0]])159; CHECK-NEXT: [[START_1:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 2, i64 1160; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[START_1]], [[HIGH]]161; CHECK-NEXT: call void @use(i1 [[C_1]])162; CHECK-NEXT: ret void163;164entry:165 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3166 %c = icmp uge ptr %add.ptr.i, %high167 br i1 %c, label %if.then, label %if.end168 169if.then: ; preds = %entry170 ret void171 172if.end: ; preds = %entry173 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 10, i64 0174 %c.0 = icmp ule ptr %start.0, %high175 call void @use(i1 %c.0)176 %start.1 = getelementptr inbounds [10 x i8], ptr %start, i64 2, i64 1177 %c.1 = icmp ule ptr %start.1, %high178 call void @use(i1 %c.1)179 ret void180}181 182define void @pointer.to.array.test.not.uge.ugt(ptr %start, ptr %high) {183; CHECK-LABEL: @pointer.to.array.test.not.uge.ugt(184; CHECK-NEXT: entry:185; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 1, i64 3186; CHECK-NEXT: [[C:%.*]] = icmp uge ptr [[ADD_PTR_I]], [[HIGH:%.*]]187; CHECK-NEXT: br i1 [[C]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]188; CHECK: if.then:189; CHECK-NEXT: ret void190; CHECK: if.end:191; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 3, i64 0192; CHECK-NEXT: [[C_0:%.*]] = icmp ugt ptr [[START_0]], [[HIGH]]193; CHECK-NEXT: call void @use(i1 [[C_0]])194; CHECK-NEXT: [[START_1:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 3, i64 1195; CHECK-NEXT: [[C_1:%.*]] = icmp ugt ptr [[START_1]], [[HIGH]]196; CHECK-NEXT: call void @use(i1 [[C_1]])197; CHECK-NEXT: ret void198;199entry:200 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3201 %c = icmp uge ptr %add.ptr.i, %high202 br i1 %c, label %if.then, label %if.end203 204if.then: ; preds = %entry205 ret void206 207if.end: ; preds = %entry208 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 3, i64 0209 %c.0 = icmp ugt ptr %start.0, %high210 call void @use(i1 %c.0)211 %start.1 = getelementptr inbounds [10 x i8], ptr %start, i64 3, i64 1212 %c.1 = icmp ugt ptr %start.1, %high213 call void @use(i1 %c.1)214 ret void215}216 217define void @pointer.to.array.test.not.uge.uge(ptr %start, ptr %high) {218; CHECK-LABEL: @pointer.to.array.test.not.uge.uge(219; CHECK-NEXT: entry:220; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds [10 x i8], ptr [[START:%.*]], i64 1, i64 3221; CHECK-NEXT: [[C_1:%.*]] = icmp uge ptr [[ADD_PTR_I]], [[HIGH:%.*]]222; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]223; CHECK: if.then:224; CHECK-NEXT: ret void225; CHECK: if.end:226; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 3, i64 0227; CHECK-NEXT: [[C_0:%.*]] = icmp uge ptr [[START_0]], [[HIGH]]228; CHECK-NEXT: call void @use(i1 [[C_0]])229; CHECK-NEXT: ret void230;231entry:232 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3233 %c.1 = icmp uge ptr %add.ptr.i, %high234 br i1 %c.1, label %if.then, label %if.end235 236if.then: ; preds = %entry237 ret void238 239if.end: ; preds = %entry240 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 3, i64 0241 %c.0 = icmp uge ptr %start.0, %high242 call void @use(i1 %c.0)243 ret void244}245 246declare void @use(i1)247