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 @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 3 8; 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 0 12; CHECK-NEXT: call void @use(i1 true) 13; CHECK-NEXT: ret void 14; CHECK: if.end: 15; CHECK-NEXT: ret void 16; 17entry: 18 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 9, i64 3 19 %c.1 = icmp ule ptr %add.ptr.i, %high 20 br i1 %c.1, label %if.then, label %if.end 21 22if.then: ; preds = %entry 23 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 0 24 %c.0 = icmp ult ptr %start.0, %high 25 call void @use(i1 %c.0) 26 ret void 27 28if.end: ; preds = %entry 29 ret void 30} 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 3 36; 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 0 40; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]] 41; CHECK-NEXT: call void @use(i1 [[C_0]]) 42; CHECK-NEXT: ret void 43; CHECK: if.end: 44; CHECK-NEXT: ret void 45; 46entry: 47 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 3 48 %c.1 = icmp ule ptr %add.ptr.i, %high 49 br i1 %c.1, label %if.then, label %if.end 50 51if.then: ; preds = %entry 52 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 10, i64 0 53 %c.0 = icmp ult ptr %start.0, %high 54 call void @use(i1 %c.0) 55 ret void 56 57if.end: ; preds = %entry 58 ret void 59} 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 1 65; 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 0 69; CHECK-NEXT: call void @use(i1 true) 70; CHECK-NEXT: ret void 71; CHECK: if.end: 72; CHECK-NEXT: ret void 73; 74entry: 75 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 1 76 %c.1 = icmp ule ptr %add.ptr.i, %high 77 br i1 %c.1, label %if.then, label %if.end 78 79if.then: ; preds = %entry 80 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 0 81 %c.0 = icmp ult ptr %start.0, %high 82 call void @use(i1 %c.0) 83 ret void 84 85if.end: ; preds = %entry 86 ret void 87} 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 0 93; 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 1 97; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]] 98; CHECK-NEXT: call void @use(i1 [[C_0]]) 99; CHECK-NEXT: ret void 100; CHECK: if.end: 101; CHECK-NEXT: ret void 102; 103entry: 104 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 0 105 %c.1 = icmp ule ptr %add.ptr.i, %high 106 br i1 %c.1, label %if.then, label %if.end 107 108if.then: ; preds = %entry 109 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 5, i64 1 110 %c.0 = icmp ult ptr %start.0, %high 111 call void @use(i1 %c.0) 112 ret void 113 114if.end: ; preds = %entry 115 ret void 116} 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 3 122; 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 void 126; CHECK: if.end: 127; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 10, i64 0 128; CHECK-NEXT: [[C_0:%.*]] = icmp ult ptr [[START_0]], [[HIGH]] 129; CHECK-NEXT: call void @use(i1 [[C_0]]) 130; CHECK-NEXT: ret void 131; 132entry: 133 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3 134 %c.1 = icmp uge ptr %add.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 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 10, i64 0 142 %c.0 = icmp ult ptr %start.0, %high 143 call void @use(i1 %c.0) 144 ret void 145} 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 3 151; 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 void 155; CHECK: if.end: 156; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 10, i64 0 157; 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 1 160; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[START_1]], [[HIGH]] 161; CHECK-NEXT: call void @use(i1 [[C_1]]) 162; CHECK-NEXT: ret void 163; 164entry: 165 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3 166 %c = icmp uge ptr %add.ptr.i, %high 167 br i1 %c, label %if.then, label %if.end 168 169if.then: ; preds = %entry 170 ret void 171 172if.end: ; preds = %entry 173 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 10, i64 0 174 %c.0 = icmp ule ptr %start.0, %high 175 call void @use(i1 %c.0) 176 %start.1 = getelementptr inbounds [10 x i8], ptr %start, i64 2, i64 1 177 %c.1 = icmp ule ptr %start.1, %high 178 call void @use(i1 %c.1) 179 ret void 180} 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 3 186; 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 void 190; CHECK: if.end: 191; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 3, i64 0 192; 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 1 195; CHECK-NEXT: [[C_1:%.*]] = icmp ugt ptr [[START_1]], [[HIGH]] 196; CHECK-NEXT: call void @use(i1 [[C_1]]) 197; CHECK-NEXT: ret void 198; 199entry: 200 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3 201 %c = icmp uge ptr %add.ptr.i, %high 202 br i1 %c, label %if.then, label %if.end 203 204if.then: ; preds = %entry 205 ret void 206 207if.end: ; preds = %entry 208 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 3, i64 0 209 %c.0 = icmp ugt ptr %start.0, %high 210 call void @use(i1 %c.0) 211 %start.1 = getelementptr inbounds [10 x i8], ptr %start, i64 3, i64 1 212 %c.1 = icmp ugt ptr %start.1, %high 213 call void @use(i1 %c.1) 214 ret void 215} 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 3 221; 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 void 225; CHECK: if.end: 226; CHECK-NEXT: [[START_0:%.*]] = getelementptr inbounds [10 x i8], ptr [[START]], i64 3, i64 0 227; CHECK-NEXT: [[C_0:%.*]] = icmp uge ptr [[START_0]], [[HIGH]] 228; CHECK-NEXT: call void @use(i1 [[C_0]]) 229; CHECK-NEXT: ret void 230; 231entry: 232 %add.ptr.i = getelementptr inbounds [10 x i8], ptr %start, i64 1, i64 3 233 %c.1 = icmp uge ptr %add.ptr.i, %high 234 br i1 %c.1, label %if.then, label %if.end 235 236if.then: ; preds = %entry 237 ret void 238 239if.end: ; preds = %entry 240 %start.0 = getelementptr inbounds [10 x i8], ptr %start, i64 3, i64 0 241 %c.0 = icmp uge ptr %start.0, %high 242 call void @use(i1 %c.0) 243 ret void 244} 245 246declare void @use(i1) 247