|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
2 | 2 | ; RUN: opt -p loop-idiom -S %s | FileCheck %s |
3 | 3 |
|
| 4 | +target datalayout = "e-m:e-i64:64-i128:128-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2" |
| 5 | + |
4 | 6 | declare void @foo() |
5 | 7 | declare void @bar() |
6 | 8 |
|
@@ -160,3 +162,63 @@ loop.0.latch: |
160 | 162 | exit: |
161 | 163 | ret ptr %res |
162 | 164 | } |
| 165 | + |
| 166 | +; Test case for https://github.com/llvm/llvm-project/issues/155287. |
| 167 | +; Make sure we don't crash when trying to construct a PtrToInt SCEV expression |
| 168 | +; results in SCEVCouldNotCompute. |
| 169 | +define void @phi_ptr_addressspace_ptrtoint_fail(ptr addrspace(1) %arg) { |
| 170 | +; CHECK-LABEL: define void @phi_ptr_addressspace_ptrtoint_fail( |
| 171 | +; CHECK-SAME: ptr addrspace(1) [[ARG:%.*]]) { |
| 172 | +; CHECK-NEXT: [[BB:.*]]: |
| 173 | +; CHECK-NEXT: br label %[[LOOP_1:.*]] |
| 174 | +; CHECK: [[LOOP_1]]: |
| 175 | +; CHECK-NEXT: [[IV_1:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[ADD5:%.*]], %[[LOOP_1]] ] |
| 176 | +; CHECK-NEXT: [[ADD5]] = add i64 [[IV_1]], 1 |
| 177 | +; CHECK-NEXT: [[GETELEMENTPTR:%.*]] = getelementptr i16, ptr addrspace(1) [[ARG]], i64 [[ADD5]] |
| 178 | +; CHECK-NEXT: br i1 false, label %[[LOOP_1]], label %[[LOOP_2_PH:.*]] |
| 179 | +; CHECK: [[LOOP_2_PH]]: |
| 180 | +; CHECK-NEXT: [[IV_1_LCSSA1:%.*]] = phi i64 [ [[IV_1]], %[[LOOP_1]] ] |
| 181 | +; CHECK-NEXT: [[IV_1_LCSSA:%.*]] = phi i64 [ [[IV_1]], %[[LOOP_1]] ] |
| 182 | +; CHECK-NEXT: [[PHI:%.*]] = phi ptr addrspace(1) [ [[GETELEMENTPTR]], %[[LOOP_1]] ] |
| 183 | +; CHECK-NEXT: [[TMP0:%.*]] = shl nuw nsw i64 [[IV_1_LCSSA1]], 2 |
| 184 | +; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr addrspace(1) [[ARG]], i64 [[TMP0]] |
| 185 | +; CHECK-NEXT: call void @llvm.memset.p1.i64(ptr addrspace(1) align 4 [[SCEVGEP]], i8 0, i64 8, i1 false) |
| 186 | +; CHECK-NEXT: br label %[[LOOP_2_HEADER:.*]] |
| 187 | +; CHECK: [[LOOP_2_HEADER]]: |
| 188 | +; CHECK-NEXT: [[IV_2:%.*]] = phi i64 [ [[IV_1_LCSSA]], %[[LOOP_2_PH]] ], [ [[IV_2_NEXT:%.*]], %[[LOOP_2_LATCH:.*]] ] |
| 189 | +; CHECK-NEXT: [[GREP_ARG:%.*]] = getelementptr i32, ptr addrspace(1) [[ARG]], i64 [[IV_2]] |
| 190 | +; CHECK-NEXT: [[EC:%.*]] = icmp ult i64 [[IV_2]], 1 |
| 191 | +; CHECK-NEXT: br i1 [[EC]], label %[[LOOP_2_LATCH]], label %[[EXIT:.*]] |
| 192 | +; CHECK: [[LOOP_2_LATCH]]: |
| 193 | +; CHECK-NEXT: [[IV_2_NEXT]] = add i64 [[IV_2]], 1 |
| 194 | +; CHECK-NEXT: br label %[[LOOP_2_HEADER]] |
| 195 | +; CHECK: [[EXIT]]: |
| 196 | +; CHECK-NEXT: ret void |
| 197 | +; |
| 198 | +bb: |
| 199 | + br label %loop.1 |
| 200 | + |
| 201 | +loop.1: |
| 202 | + %iv.1 = phi i64 [ 0, %bb ], [ %add5, %loop.1] |
| 203 | + %add5 = add i64 %iv.1, 1 |
| 204 | + %getelementptr = getelementptr i16, ptr addrspace(1) %arg, i64 %add5 |
| 205 | + br i1 false, label %loop.1, label %loop.2.ph |
| 206 | + |
| 207 | +loop.2.ph: |
| 208 | + %phi = phi ptr addrspace(1) [ %getelementptr, %loop.1] |
| 209 | + br label %loop.2.header |
| 210 | + |
| 211 | +loop.2.header: |
| 212 | + %iv.2 = phi i64 [ %iv.1, %loop.2.ph ], [ %iv.2.next, %loop.2.latch ] |
| 213 | + %grep.arg = getelementptr i32, ptr addrspace(1) %arg, i64 %iv.2 |
| 214 | + store i32 0, ptr addrspace(1) %grep.arg, align 4 |
| 215 | + %ec = icmp ult i64 %iv.2, 1 |
| 216 | + br i1 %ec, label %loop.2.latch, label %exit |
| 217 | + |
| 218 | +loop.2.latch: |
| 219 | + %iv.2.next = add i64 %iv.2, 1 |
| 220 | + br label %loop.2.header |
| 221 | + |
| 222 | +exit: |
| 223 | + ret void |
| 224 | +} |
0 commit comments