Skip to content

Commit f91a6e6

Browse files
authored
[SCEV] Reject comparision of pointers to different address spaces in SCEVWrapPredicate::implies (#137935)
1 parent a860706 commit f91a6e6

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14967,6 +14967,10 @@ bool SCEVWrapPredicate::implies(const SCEVPredicate *N,
1496714967
if (Start->getType()->isPointerTy() != OpStart->getType()->isPointerTy())
1496814968
return false;
1496914969

14970+
// Reject pointers to different address spaces.
14971+
if (Start->getType()->isPointerTy() && Start->getType() != OpStart->getType())
14972+
return false;
14973+
1497014974
const SCEV *Step = AR->getStepRecurrence(SE);
1497114975
const SCEV *OpStep = Op->AR->getStepRecurrence(SE);
1497214976
if (!SE.isKnownPositive(Step) || !SE.isKnownPositive(OpStep))

llvm/test/Analysis/LoopAccessAnalysis/nusw-predicates.ll

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
22
; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s
33

4-
target datalayout = "p:16:16"
4+
target datalayout = "p:16:16-p3:32:32"
55

66
define void @int_and_pointer_predicate(ptr %v, i32 %N) {
77
; CHECK-LABEL: 'int_and_pointer_predicate'
@@ -124,3 +124,37 @@ loop:
124124
exit:
125125
ret void
126126
}
127+
128+
define void @pointers_to_different_aspace_predicates(ptr %v, ptr addrspace(3) %w, i32 %N) {
129+
; CHECK-LABEL: 'pointers_to_different_aspace_predicates'
130+
; CHECK-NEXT: loop:
131+
; CHECK-NEXT: Report: cannot identify array bounds
132+
; CHECK-NEXT: Dependences:
133+
; CHECK-NEXT: Run-time memory checks:
134+
; CHECK-NEXT: Grouped accesses:
135+
; CHECK-EMPTY:
136+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
137+
; CHECK-NEXT: SCEV assumptions:
138+
; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>
139+
; CHECK-NEXT: {%v,+,4}<%loop> Added Flags: <nusw>
140+
; CHECK-NEXT: {%w,+,4}<%loop> Added Flags: <nusw>
141+
; CHECK-EMPTY:
142+
; CHECK-NEXT: Expressions re-written:
143+
;
144+
entry:
145+
br label %loop
146+
147+
loop:
148+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
149+
%gep.v = getelementptr {i16, i16}, ptr %v, i64 %iv
150+
store i16 0, ptr %gep.v, align 1
151+
%gep.w = getelementptr i32, ptr addrspace(3) %w, i64 %iv
152+
store i32 0, ptr addrspace(3) %gep.w, align 1
153+
%iv.next = add i64 %iv, 1
154+
%iv.i32 = trunc i64 %iv to i32
155+
%.not = icmp ult i32 %N, %iv.i32
156+
br i1 %.not, label %exit, label %loop
157+
158+
exit:
159+
ret void
160+
}

0 commit comments

Comments
 (0)