Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 2 | ; RUN: opt -constraint-elimination -S %s | FileCheck %s |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 3 | |
| 4 | define i32 @test.ult(i32* readonly %src, i32* readnone %min, i32* readnone %max) { |
| 5 | ; CHECK-LABEL: @test.ult( |
| 6 | ; CHECK-NEXT: check.0.min: |
| 7 | ; CHECK-NEXT: [[C_MIN_0:%.*]] = icmp ult i32* [[SRC:%.*]], [[MIN:%.*]] |
| 8 | ; CHECK-NEXT: br i1 [[C_MIN_0]], label [[TRAP:%.*]], label [[CHECK_0_MAX:%.*]] |
| 9 | ; CHECK: trap: |
| 10 | ; CHECK-NEXT: ret i32 10 |
| 11 | ; CHECK: check.0.max: |
| 12 | ; CHECK-NEXT: [[C_MAX_0:%.*]] = icmp ult i32* [[SRC]], [[MAX:%.*]] |
| 13 | ; CHECK-NEXT: br i1 [[C_MAX_0]], label [[CHECK_3_MIN:%.*]], label [[TRAP]] |
| 14 | ; CHECK: check.3.min: |
| 15 | ; CHECK-NEXT: [[L0:%.*]] = load i32, i32* [[SRC]], align 4 |
| 16 | ; CHECK-NEXT: [[ADD_PTR_I36:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 3 |
| 17 | ; CHECK-NEXT: [[C_3_MIN:%.*]] = icmp ult i32* [[ADD_PTR_I36]], [[MIN]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 18 | ; CHECK-NEXT: br i1 false, label [[TRAP]], label [[CHECK_3_MAX:%.*]] |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 19 | ; CHECK: check.3.max: |
| 20 | ; CHECK-NEXT: [[C_3_MAX:%.*]] = icmp ult i32* [[ADD_PTR_I36]], [[MAX]] |
| 21 | ; CHECK-NEXT: br i1 [[C_3_MAX]], label [[CHECK_1_MIN:%.*]], label [[TRAP]] |
| 22 | ; CHECK: check.1.min: |
| 23 | ; CHECK-NEXT: [[L1:%.*]] = load i32, i32* [[ADD_PTR_I36]], align 4 |
| 24 | ; CHECK-NEXT: [[ADD_PTR_I29:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 1 |
| 25 | ; CHECK-NEXT: [[C_1_MIN:%.*]] = icmp ult i32* [[ADD_PTR_I29]], [[MIN]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 26 | ; CHECK-NEXT: br i1 false, label [[TRAP]], label [[CHECK_1_MAX:%.*]] |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 27 | ; CHECK: check.1.max: |
| 28 | ; CHECK-NEXT: [[C_1_MAX:%.*]] = icmp ult i32* [[ADD_PTR_I29]], [[MAX]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 29 | ; CHECK-NEXT: br i1 true, label [[CHECK_2_MIN:%.*]], label [[TRAP]] |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 30 | ; CHECK: check.2.min: |
| 31 | ; CHECK-NEXT: [[L2:%.*]] = load i32, i32* [[ADD_PTR_I29]], align 4 |
| 32 | ; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds i32, i32* [[SRC]], i64 2 |
| 33 | ; CHECK-NEXT: [[C_2_MIN:%.*]] = icmp ult i32* [[ADD_PTR_I]], [[MIN]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 34 | ; CHECK-NEXT: br i1 false, label [[TRAP]], label [[CHECK_2_MAX:%.*]] |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 35 | ; CHECK: check.2.max: |
| 36 | ; CHECK-NEXT: [[C_2_MAX:%.*]] = icmp ult i32* [[ADD_PTR_I]], [[MAX]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 37 | ; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[TRAP]] |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 38 | ; CHECK: exit: |
| 39 | ; CHECK-NEXT: [[L3:%.*]] = load i32, i32* [[ADD_PTR_I]], align 4 |
| 40 | ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[L1]], [[L0]] |
| 41 | ; CHECK-NEXT: [[ADD8:%.*]] = add nsw i32 [[ADD]], [[L2]] |
| 42 | ; CHECK-NEXT: [[ADD9:%.*]] = add nsw i32 [[ADD8]], [[L3]] |
| 43 | ; CHECK-NEXT: ret i32 [[ADD9]] |
| 44 | ; |
| 45 | check.0.min: |
| 46 | %c.min.0 = icmp ult i32* %src, %min |
| 47 | br i1 %c.min.0, label %trap, label %check.0.max |
| 48 | |
| 49 | trap: ; preds = %check.2.max, %check.2.min, %check.1.max, %check.1.min, %check.3.max, %check.3.min, %check.0.max, %check.0.min |
| 50 | ret i32 10 |
| 51 | |
| 52 | check.0.max: ; preds = %check.0.min |
| 53 | %c.max.0 = icmp ult i32* %src, %max |
| 54 | br i1 %c.max.0, label %check.3.min, label %trap |
| 55 | |
| 56 | check.3.min: ; preds = %check.0.max |
| 57 | %l0 = load i32, i32* %src, align 4 |
| 58 | %add.ptr.i36 = getelementptr inbounds i32, i32* %src, i64 3 |
| 59 | %c.3.min = icmp ult i32* %add.ptr.i36, %min |
| 60 | br i1 %c.3.min, label %trap, label %check.3.max |
| 61 | |
| 62 | check.3.max: ; preds = %check.3.min |
| 63 | %c.3.max = icmp ult i32* %add.ptr.i36, %max |
| 64 | br i1 %c.3.max, label %check.1.min, label %trap |
| 65 | |
| 66 | check.1.min: ; preds = %check.3.max |
| 67 | %l1 = load i32, i32* %add.ptr.i36, align 4 |
| 68 | %add.ptr.i29 = getelementptr inbounds i32, i32* %src, i64 1 |
| 69 | %c.1.min = icmp ult i32* %add.ptr.i29, %min |
| 70 | br i1 %c.1.min, label %trap, label %check.1.max |
| 71 | |
| 72 | check.1.max: ; preds = %check.1.min |
| 73 | %c.1.max = icmp ult i32* %add.ptr.i29, %max |
| 74 | br i1 %c.1.max, label %check.2.min, label %trap |
| 75 | |
| 76 | check.2.min: ; preds = %check.1.max |
| 77 | %l2 = load i32, i32* %add.ptr.i29, align 4 |
| 78 | %add.ptr.i = getelementptr inbounds i32, i32* %src, i64 2 |
| 79 | %c.2.min = icmp ult i32* %add.ptr.i, %min |
| 80 | br i1 %c.2.min, label %trap, label %check.2.max |
| 81 | |
| 82 | check.2.max: ; preds = %check.2.min |
| 83 | %c.2.max = icmp ult i32* %add.ptr.i, %max |
| 84 | br i1 %c.2.max, label %exit, label %trap |
| 85 | |
| 86 | exit: ; preds = %check.2.max |
| 87 | %l3 = load i32, i32* %add.ptr.i, align 4 |
| 88 | %add = add nsw i32 %l1, %l0 |
| 89 | %add8 = add nsw i32 %add, %l2 |
| 90 | %add9 = add nsw i32 %add8, %l3 |
| 91 | ret i32 %add9 |
| 92 | } |
| 93 | |
| 94 | define void @test.not.uge.ult(i8* %start, i8* %low, i8* %high) { |
| 95 | ; CHECK-LABEL: @test.not.uge.ult( |
| 96 | ; CHECK-NEXT: entry: |
| 97 | ; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds i8, i8* [[START:%.*]], i64 3 |
| 98 | ; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8* [[ADD_PTR_I]], [[HIGH:%.*]] |
| 99 | ; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] |
| 100 | ; CHECK: if.then: |
| 101 | ; CHECK-NEXT: ret void |
| 102 | ; CHECK: if.end: |
| 103 | ; CHECK-NEXT: [[T_0:%.*]] = icmp ult i8* [[START]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 104 | ; CHECK-NEXT: call void @use(i1 true) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 105 | ; CHECK-NEXT: [[START_1:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 1 |
| 106 | ; CHECK-NEXT: [[T_1:%.*]] = icmp ult i8* [[START_1]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 107 | ; CHECK-NEXT: call void @use(i1 true) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 108 | ; CHECK-NEXT: [[START_2:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 2 |
| 109 | ; CHECK-NEXT: [[T_2:%.*]] = icmp ult i8* [[START_2]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 110 | ; CHECK-NEXT: call void @use(i1 true) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 111 | ; CHECK-NEXT: [[START_3:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 3 |
| 112 | ; CHECK-NEXT: [[T_3:%.*]] = icmp ult i8* [[START_3]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 113 | ; CHECK-NEXT: call void @use(i1 true) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 114 | ; CHECK-NEXT: [[START_4:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 4 |
| 115 | ; CHECK-NEXT: [[C_4:%.*]] = icmp ult i8* [[START_4]], [[HIGH]] |
| 116 | ; CHECK-NEXT: call void @use(i1 [[C_4]]) |
| 117 | ; CHECK-NEXT: ret void |
| 118 | ; |
| 119 | entry: |
| 120 | %add.ptr.i = getelementptr inbounds i8, i8* %start, i64 3 |
| 121 | %c.1 = icmp uge i8* %add.ptr.i, %high |
| 122 | br i1 %c.1, label %if.then, label %if.end |
| 123 | |
| 124 | if.then: ; preds = %entry |
| 125 | ret void |
| 126 | |
| 127 | if.end: ; preds = %entry |
| 128 | %t.0 = icmp ult i8* %start, %high |
| 129 | call void @use(i1 %t.0) |
| 130 | %start.1 = getelementptr inbounds i8, i8* %start, i64 1 |
| 131 | %t.1 = icmp ult i8* %start.1, %high |
| 132 | call void @use(i1 %t.1) |
| 133 | %start.2 = getelementptr inbounds i8, i8* %start, i64 2 |
| 134 | %t.2 = icmp ult i8* %start.2, %high |
| 135 | call void @use(i1 %t.2) |
| 136 | %start.3 = getelementptr inbounds i8, i8* %start, i64 3 |
| 137 | %t.3 = icmp ult i8* %start.3, %high |
| 138 | call void @use(i1 %t.3) |
| 139 | %start.4 = getelementptr inbounds i8, i8* %start, i64 4 |
| 140 | %c.4 = icmp ult i8* %start.4, %high |
| 141 | call void @use(i1 %c.4) |
| 142 | ret void |
| 143 | } |
| 144 | |
| 145 | define void @test.not.uge.ule(i8* %start, i8* %low, i8* %high) { |
| 146 | ; CHECK-LABEL: @test.not.uge.ule( |
| 147 | ; CHECK-NEXT: entry: |
| 148 | ; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds i8, i8* [[START:%.*]], i64 3 |
| 149 | ; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8* [[ADD_PTR_I]], [[HIGH:%.*]] |
| 150 | ; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] |
| 151 | ; CHECK: if.then: |
| 152 | ; CHECK-NEXT: ret void |
| 153 | ; CHECK: if.end: |
| 154 | ; CHECK-NEXT: [[T_0:%.*]] = icmp ule i8* [[START]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 155 | ; CHECK-NEXT: call void @use(i1 true) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 156 | ; CHECK-NEXT: [[START_1:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 1 |
| 157 | ; CHECK-NEXT: [[T_1:%.*]] = icmp ule i8* [[START_1]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 158 | ; CHECK-NEXT: call void @use(i1 true) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 159 | ; CHECK-NEXT: [[START_2:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 2 |
| 160 | ; CHECK-NEXT: [[T_2:%.*]] = icmp ule i8* [[START_2]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 161 | ; CHECK-NEXT: call void @use(i1 true) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 162 | ; CHECK-NEXT: [[START_3:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 3 |
| 163 | ; CHECK-NEXT: [[T_3:%.*]] = icmp ule i8* [[START_3]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 164 | ; CHECK-NEXT: call void @use(i1 true) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 165 | ; CHECK-NEXT: [[START_4:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 4 |
| 166 | ; CHECK-NEXT: [[T_4:%.*]] = icmp ule i8* [[START_4]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 167 | ; CHECK-NEXT: call void @use(i1 true) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 168 | ; CHECK-NEXT: [[START_5:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 5 |
| 169 | ; CHECK-NEXT: [[C_5:%.*]] = icmp ule i8* [[START_5]], [[HIGH]] |
| 170 | ; CHECK-NEXT: call void @use(i1 [[C_5]]) |
| 171 | ; CHECK-NEXT: ret void |
| 172 | ; |
| 173 | entry: |
| 174 | %add.ptr.i = getelementptr inbounds i8, i8* %start, i64 3 |
| 175 | %c.1 = icmp uge i8* %add.ptr.i, %high |
| 176 | br i1 %c.1, label %if.then, label %if.end |
| 177 | |
| 178 | if.then: ; preds = %entry |
| 179 | ret void |
| 180 | |
| 181 | if.end: ; preds = %entry |
| 182 | %t.0 = icmp ule i8* %start, %high |
| 183 | call void @use(i1 %t.0) |
| 184 | %start.1 = getelementptr inbounds i8, i8* %start, i64 1 |
| 185 | %t.1 = icmp ule i8* %start.1, %high |
| 186 | call void @use(i1 %t.1) |
| 187 | %start.2 = getelementptr inbounds i8, i8* %start, i64 2 |
| 188 | %t.2 = icmp ule i8* %start.2, %high |
| 189 | call void @use(i1 %t.2) |
| 190 | %start.3 = getelementptr inbounds i8, i8* %start, i64 3 |
| 191 | %t.3 = icmp ule i8* %start.3, %high |
| 192 | call void @use(i1 %t.3) |
| 193 | %start.4 = getelementptr inbounds i8, i8* %start, i64 4 |
| 194 | %t.4 = icmp ule i8* %start.4, %high |
| 195 | call void @use(i1 %t.4) |
| 196 | |
| 197 | %start.5 = getelementptr inbounds i8, i8* %start, i64 5 |
| 198 | %c.5 = icmp ule i8* %start.5, %high |
| 199 | call void @use(i1 %c.5) |
| 200 | |
| 201 | ret void |
| 202 | } |
| 203 | |
| 204 | define void @test.not.uge.ugt(i8* %start, i8* %low, i8* %high) { |
| 205 | ; CHECK-LABEL: @test.not.uge.ugt( |
| 206 | ; CHECK-NEXT: entry: |
| 207 | ; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds i8, i8* [[START:%.*]], i64 3 |
| 208 | ; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8* [[ADD_PTR_I]], [[HIGH:%.*]] |
| 209 | ; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] |
| 210 | ; CHECK: if.then: |
| 211 | ; CHECK-NEXT: ret void |
| 212 | ; CHECK: if.end: |
| 213 | ; CHECK-NEXT: [[F_0:%.*]] = icmp ugt i8* [[START]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 214 | ; CHECK-NEXT: call void @use(i1 false) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 215 | ; CHECK-NEXT: [[START_1:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 1 |
| 216 | ; CHECK-NEXT: [[F_1:%.*]] = icmp ugt i8* [[START_1]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 217 | ; CHECK-NEXT: call void @use(i1 false) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 218 | ; CHECK-NEXT: [[START_2:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 2 |
| 219 | ; CHECK-NEXT: [[F_2:%.*]] = icmp ugt i8* [[START_2]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 220 | ; CHECK-NEXT: call void @use(i1 false) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 221 | ; CHECK-NEXT: [[START_3:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 3 |
| 222 | ; CHECK-NEXT: [[F_3:%.*]] = icmp ugt i8* [[START_3]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 223 | ; CHECK-NEXT: call void @use(i1 false) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 224 | ; CHECK-NEXT: [[START_4:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 4 |
| 225 | ; CHECK-NEXT: [[F_4:%.*]] = icmp ugt i8* [[START_4]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 226 | ; CHECK-NEXT: call void @use(i1 false) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 227 | ; CHECK-NEXT: [[START_5:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 5 |
| 228 | ; CHECK-NEXT: [[C_5:%.*]] = icmp ugt i8* [[START_5]], [[HIGH]] |
| 229 | ; CHECK-NEXT: call void @use(i1 [[C_5]]) |
| 230 | ; CHECK-NEXT: ret void |
| 231 | ; |
| 232 | entry: |
| 233 | %add.ptr.i = getelementptr inbounds i8, i8* %start, i64 3 |
| 234 | %c.1 = icmp uge i8* %add.ptr.i, %high |
| 235 | br i1 %c.1, label %if.then, label %if.end |
| 236 | |
| 237 | if.then: ; preds = %entry |
| 238 | ret void |
| 239 | |
| 240 | if.end: ; preds = %entry |
| 241 | %f.0 = icmp ugt i8* %start, %high |
| 242 | call void @use(i1 %f.0) |
| 243 | |
| 244 | %start.1 = getelementptr inbounds i8, i8* %start, i64 1 |
| 245 | %f.1 = icmp ugt i8* %start.1, %high |
| 246 | call void @use(i1 %f.1) |
| 247 | |
| 248 | %start.2 = getelementptr inbounds i8, i8* %start, i64 2 |
| 249 | %f.2 = icmp ugt i8* %start.2, %high |
| 250 | call void @use(i1 %f.2) |
| 251 | |
| 252 | %start.3 = getelementptr inbounds i8, i8* %start, i64 3 |
| 253 | %f.3 = icmp ugt i8* %start.3, %high |
| 254 | call void @use(i1 %f.3) |
| 255 | |
| 256 | %start.4 = getelementptr inbounds i8, i8* %start, i64 4 |
| 257 | %f.4 = icmp ugt i8* %start.4, %high |
| 258 | call void @use(i1 %f.4) |
| 259 | |
| 260 | %start.5 = getelementptr inbounds i8, i8* %start, i64 5 |
| 261 | %c.5 = icmp ugt i8* %start.5, %high |
| 262 | call void @use(i1 %c.5) |
| 263 | |
| 264 | ret void |
| 265 | } |
| 266 | |
| 267 | define void @test.not.uge.uge(i8* %start, i8* %low, i8* %high) { |
| 268 | ; CHECK-LABEL: @test.not.uge.uge( |
| 269 | ; CHECK-NEXT: entry: |
| 270 | ; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds i8, i8* [[START:%.*]], i64 3 |
| 271 | ; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8* [[ADD_PTR_I]], [[HIGH:%.*]] |
| 272 | ; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] |
| 273 | ; CHECK: if.then: |
| 274 | ; CHECK-NEXT: ret void |
| 275 | ; CHECK: if.end: |
| 276 | ; CHECK-NEXT: [[F_0:%.*]] = icmp ugt i8* [[START]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 277 | ; CHECK-NEXT: call void @use(i1 false) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 278 | ; CHECK-NEXT: [[START_1:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 1 |
| 279 | ; CHECK-NEXT: [[F_1:%.*]] = icmp uge i8* [[START_1]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 280 | ; CHECK-NEXT: call void @use(i1 false) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 281 | ; CHECK-NEXT: [[START_2:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 2 |
| 282 | ; CHECK-NEXT: [[F_2:%.*]] = icmp uge i8* [[START_2]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 283 | ; CHECK-NEXT: call void @use(i1 false) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 284 | ; CHECK-NEXT: [[START_3:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 3 |
| 285 | ; CHECK-NEXT: [[F_3:%.*]] = icmp uge i8* [[START_3]], [[HIGH]] |
Florian Hahn | 3d42d54 | 2020-09-15 14:47:23 +0100 | [diff] [blame] | 286 | ; CHECK-NEXT: call void @use(i1 false) |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 287 | ; CHECK-NEXT: [[START_4:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 4 |
| 288 | ; CHECK-NEXT: [[C_4:%.*]] = icmp uge i8* [[START_4]], [[HIGH]] |
| 289 | ; CHECK-NEXT: call void @use(i1 [[C_4]]) |
| 290 | ; CHECK-NEXT: [[START_5:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 5 |
| 291 | ; CHECK-NEXT: [[C_5:%.*]] = icmp uge i8* [[START_5]], [[HIGH]] |
| 292 | ; CHECK-NEXT: call void @use(i1 [[C_5]]) |
| 293 | ; CHECK-NEXT: ret void |
| 294 | ; |
| 295 | entry: |
| 296 | %add.ptr.i = getelementptr inbounds i8, i8* %start, i64 3 |
| 297 | %c.1 = icmp uge i8* %add.ptr.i, %high |
| 298 | br i1 %c.1, label %if.then, label %if.end |
| 299 | |
| 300 | if.then: ; preds = %entry |
| 301 | ret void |
| 302 | |
| 303 | if.end: ; preds = %entry |
| 304 | %f.0 = icmp ugt i8* %start, %high |
| 305 | call void @use(i1 %f.0) |
| 306 | |
| 307 | %start.1 = getelementptr inbounds i8, i8* %start, i64 1 |
| 308 | %f.1 = icmp uge i8* %start.1, %high |
| 309 | call void @use(i1 %f.1) |
| 310 | |
| 311 | %start.2 = getelementptr inbounds i8, i8* %start, i64 2 |
| 312 | %f.2 = icmp uge i8* %start.2, %high |
| 313 | call void @use(i1 %f.2) |
| 314 | |
| 315 | %start.3 = getelementptr inbounds i8, i8* %start, i64 3 |
| 316 | %f.3 = icmp uge i8* %start.3, %high |
| 317 | call void @use(i1 %f.3) |
| 318 | |
| 319 | %start.4 = getelementptr inbounds i8, i8* %start, i64 4 |
| 320 | %c.4 = icmp uge i8* %start.4, %high |
| 321 | call void @use(i1 %c.4) |
| 322 | |
| 323 | %start.5 = getelementptr inbounds i8, i8* %start, i64 5 |
| 324 | %c.5 = icmp uge i8* %start.5, %high |
| 325 | call void @use(i1 %c.5) |
| 326 | |
| 327 | ret void |
| 328 | } |
| 329 | |
Florian Hahn | 7f4d88a | 2020-11-19 14:04:05 +0000 | [diff] [blame^] | 330 | define void @test.not.uge.uge.nonconst(i8* %start, i8* %low, i8* %high, i64 %off) { |
| 331 | ; CHECK-LABEL: @test.not.uge.uge.nonconst( |
| 332 | ; CHECK-NEXT: entry: |
| 333 | ; CHECK-NEXT: [[ADD_PTR_I:%.*]] = getelementptr inbounds i8, i8* [[START:%.*]], i64 [[OFF:%.*]] |
| 334 | ; CHECK-NEXT: [[C_1:%.*]] = icmp uge i8* [[ADD_PTR_I]], [[HIGH:%.*]] |
| 335 | ; CHECK-NEXT: br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]] |
| 336 | ; CHECK: if.then: |
| 337 | ; CHECK-NEXT: [[START_OFF_2:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 [[OFF]] |
| 338 | ; CHECK-NEXT: [[T_0:%.*]] = icmp uge i8* [[START_OFF_2]], [[HIGH]] |
| 339 | ; CHECK-NEXT: call void @use(i1 [[T_0]]) |
| 340 | ; CHECK-NEXT: ret void |
| 341 | ; CHECK: if.end: |
| 342 | ; CHECK-NEXT: [[START_1:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 1 |
| 343 | ; CHECK-NEXT: [[C_0:%.*]] = icmp uge i8* [[START_1]], [[HIGH]] |
| 344 | ; CHECK-NEXT: call void @use(i1 [[C_0]]) |
| 345 | ; CHECK-NEXT: [[START_OFF:%.*]] = getelementptr inbounds i8, i8* [[START]], i64 [[OFF]] |
| 346 | ; CHECK-NEXT: [[F_0:%.*]] = icmp uge i8* [[START_OFF]], [[HIGH]] |
| 347 | ; CHECK-NEXT: call void @use(i1 [[F_0]]) |
| 348 | ; CHECK-NEXT: ret void |
| 349 | ; |
| 350 | entry: |
| 351 | %add.ptr.i = getelementptr inbounds i8, i8* %start, i64 %off |
| 352 | %c.1 = icmp uge i8* %add.ptr.i, %high |
| 353 | br i1 %c.1, label %if.then, label %if.end |
| 354 | |
| 355 | if.then: ; preds = %entry |
| 356 | %start.off.2 = getelementptr inbounds i8, i8* %start, i64 %off |
| 357 | %t.0 = icmp uge i8* %start.off.2, %high |
| 358 | call void @use(i1 %t.0) |
| 359 | |
| 360 | ret void |
| 361 | |
| 362 | if.end: ; preds = %entry |
| 363 | %start.1 = getelementptr inbounds i8, i8* %start, i64 1 |
| 364 | %c.0 = icmp uge i8* %start.1, %high |
| 365 | call void @use(i1 %c.0) |
| 366 | |
| 367 | %start.off = getelementptr inbounds i8, i8* %start, i64 %off |
| 368 | %f.0 = icmp uge i8* %start.off, %high |
| 369 | call void @use(i1 %f.0) |
| 370 | |
| 371 | ret void |
| 372 | } |
Florian Hahn | 802d21c | 2020-07-24 19:36:48 +0100 | [diff] [blame] | 373 | |
| 374 | declare void @use(i1) |
| 375 | declare void @llvm.trap() |