[PATCH] D106099: [DependenceAnalysis] Guard analysis using getPointerBase()
Eli Friedman via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 16 16:43:06 PDT 2021
efriedma added inline comments.
================
Comment at: llvm/lib/Analysis/DependenceAnalysis.cpp:3556
LLVM_DEBUG(dbgs() << " DstSCEV = " << *DstSCEV << "\n");
+ if (SE->getPointerBase(SrcSCEV) != SE->getPointerBase(DstSCEV)) {
+ // If two pointers have different bases, trying to analyze indexes won't
----------------
artemrad wrote:
> This seems like a subset of cases we should be filtering out. Please also add checks for the access width being unaligned with the store/load size. In this case the base pointers are different but the accesses can still overlap. This case will not be caught by DependenceAnalysis.
>
>
> ```
> define void @z0(i32* %A, i64 %n) nounwind uwtable ssp {
> entry:
> %arrayidx = getelementptr inbounds i32, i32* %A, i64 %n
> %arrayidx_cast = bitcast i32* %arrayidx to i64*
> store i64 0, i64* %arrayidx_cast, align 4
>
> ; CHECK: da analyze - confused!
> ; CHECK: da analyze - confused!
> ; CHECK: da analyze - confused!
> ; CHECK: da analyze - none
> ; CHECK: da analyze - confused!
> ; CHECK: da analyze - confused!
>
> %add1 = add i64 %n, 1
> %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %add1
> %0 = load i32, i32* %arrayidx2, align 4
>
> ; Even if the load and store types are the same, if their
> ; alignments are smaller than the store size and they are
> ; accesses through something other than a straightforward
> ; gep, they can still overlap, as this access shows
> %arrayidx2_cast = bitcast i32* %arrayidx2 to i64*
> %1 = load i64, i64* %arrayidx2_cast, align 4
> ret void
> }
> ```
>
>
>
>
Well, there are a few things we can do in that case:
1. Bail out if we don't have two naturally aligned accesses of the same size.
2. Perform multiple dependency checks, and merge the results. For example, if you have a size 4 access, and a size 8 access, you can treat the size 8 access as two size 4 accesses, and merge the results accordingly.
3. Teach the dependence checks to use ranges, instead of plain indexes.
I'm afraid (1) will hurt performance. And I don't really want to sign up to do (2) or (3).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D106099/new/
https://reviews.llvm.org/D106099
More information about the llvm-commits
mailing list