blob: d746c29e90deb0b83afbd7da011e46741ea29a46 [file] [edit]
; RUN: opt -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output %s 2>&1 | FileCheck %s
; BasicAA must not look through llvm.ptrmask when decomposing a GEP into a
; symbolic byte offset, because ptrmask preserves the underlying object but
; can change the byte address. With %base 2-aligned:
; %p = %base + 1
; %q = ptrmask(%p, -2) == %base
; %r = %q + 1 == %p
; so %p and %r alias.
declare ptr @llvm.ptrmask.p0.i64(ptr, i64)
define i8 @ptrmask_gep_may_alias(ptr align 2 %base) {
; CHECK-LABEL: Function: ptrmask_gep_may_alias
; CHECK: MayAlias: i8* %p, i8* %r
entry:
%p = getelementptr i8, ptr %base, i64 1
%q = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 -2)
%r = getelementptr i8, ptr %q, i64 1
store i8 7, ptr %p, align 1
store i8 42, ptr %r, align 1
%v = load i8, ptr %p, align 1
ret i8 %v
}