Skip to content

Commit b29084f

Browse files
committed
[SCEVExp] Check if getPtrToIntExpr resulted in CouldNotCompute.
This fixes a crash trying to use SCEVCouldNotCompute, if getPtrToIntExpr failed. Fixes llvm#155287
1 parent cdb1870 commit b29084f

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed

llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,10 +1239,13 @@ Value *SCEVExpander::tryToReuseLCSSAPhi(const SCEVAddRecExpr *S) {
12391239
if (!isa<SCEVAddRecExpr>(ExitSCEV))
12401240
continue;
12411241
Type *PhiTy = PN.getType();
1242-
if (STy->isIntegerTy() && PhiTy->isPointerTy())
1242+
if (STy->isIntegerTy() && PhiTy->isPointerTy()) {
12431243
ExitSCEV = SE.getPtrToIntExpr(ExitSCEV, STy);
1244-
else if (S->getType() != PN.getType())
1244+
if (isa<SCEVCouldNotCompute>(ExitSCEV))
1245+
continue;
1246+
} else if (S->getType() != PN.getType()) {
12451247
continue;
1248+
}
12461249

12471250
// Check if we can re-use the existing PN, by adjusting it with an expanded
12481251
// offset, if the offset is simpler.

llvm/test/Transforms/LoopIdiom/reuse-lcssa-phi-scev-expansion.ll

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
22
; RUN: opt -p loop-idiom -S %s | FileCheck %s
33

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+
46
declare void @foo()
57
declare void @bar()
68

@@ -160,3 +162,63 @@ loop.0.latch:
160162
exit:
161163
ret ptr %res
162164
}
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

Comments
 (0)