BasicAA has some special bit of logic for "same base pointer" GEPs that performs a structural comparison: It only looks at two GEPs with the same base (as opposed to two GEP chains with a MustAlias base) and compares their indexes in a limited way. I generalized part of this code in D91027, and this patch merges the remainder into the normal decomposed GEP logic. What this code ultimately wants to do is to determine that gep %base, %idx1 and gep %base, %idx2 don't alias if %idx1 != %idx2, and the access size fits within the stride. We can express this in terms of a decomposed GEP expression with two indexes scale*%idx1 + -scale*%idx2 where %idx1 != %idx2, and some appropriate checks for sizes and offsets. This makes the reasoning slightly more powerful, and more importantly brings all the GEP logic under a common umbrella. Differential Revision: https://reviews.llvm.org/D92723
23 lines
713 B
LLVM
23 lines
713 B
LLVM
; RUN: opt -basic-aa -aa-eval -print-all-alias-modref-info -disable-output < %s 2>&1 | FileCheck %s
|
|
|
|
; Check that BasicAA falls back to MayAlias (instead of PartialAlias) when none
|
|
; of its little tricks are applicable.
|
|
|
|
; CHECK: MayAlias: float* %arrayidxA, float* %arrayidxB
|
|
|
|
define void @fallback_mayalias(float* noalias nocapture %C, i64 %i, i64 %j) local_unnamed_addr {
|
|
entry:
|
|
%cmp = icmp ne i64 %i, %j
|
|
call void @llvm.assume(i1 %cmp)
|
|
|
|
%arrayidxA = getelementptr inbounds float, float* %C, i64 %i
|
|
store float undef, float* %arrayidxA, align 4
|
|
|
|
%arrayidxB = getelementptr inbounds float, float* %C, i64 %j
|
|
store float undef, float* %arrayidxB, align 4
|
|
|
|
ret void
|
|
}
|
|
|
|
declare void @llvm.assume(i1)
|