Index: lib/Analysis/CFLAliasAnalysis.cpp =================================================================== --- lib/Analysis/CFLAliasAnalysis.cpp +++ lib/Analysis/CFLAliasAnalysis.cpp @@ -103,13 +103,11 @@ LLVM_CONSTEXPR unsigned MaxStratifiedAttrIndex = NumStratifiedAttrs; LLVM_CONSTEXPR unsigned AttrAllIndex = 0; LLVM_CONSTEXPR unsigned AttrGlobalIndex = 1; -LLVM_CONSTEXPR unsigned AttrUnknownIndex = 2; -LLVM_CONSTEXPR unsigned AttrFirstArgIndex = 3; +LLVM_CONSTEXPR unsigned AttrFirstArgIndex = 2; LLVM_CONSTEXPR unsigned AttrLastArgIndex = MaxStratifiedAttrIndex; LLVM_CONSTEXPR unsigned AttrMaxNumArgs = AttrLastArgIndex - AttrFirstArgIndex; LLVM_CONSTEXPR StratifiedAttr AttrNone = 0; -LLVM_CONSTEXPR StratifiedAttr AttrUnknown = 1 << AttrUnknownIndex; LLVM_CONSTEXPR StratifiedAttr AttrAll = ~AttrNone; /// StratifiedSets call for knowledge of "direction", so this is how we @@ -175,12 +173,12 @@ void visitPtrToIntInst(PtrToIntInst &Inst) { auto *Ptr = Inst.getOperand(0); - Output.push_back(Edge(Ptr, Ptr, EdgeType::Assign, AttrUnknown)); + Output.push_back(Edge(&Inst, Ptr, EdgeType::Assign, AttrNone)); } void visitIntToPtrInst(IntToPtrInst &Inst) { - auto *Ptr = &Inst; - Output.push_back(Edge(Ptr, Ptr, EdgeType::Assign, AttrUnknown)); + auto *Src = Inst.getOperand(0); + Output.push_back(Edge(&Inst, Src, EdgeType::Assign, AttrNone)); } void visitCastInst(CastInst &Inst) { Index: test/Analysis/CFLAliasAnalysis/int_ptr_cast.ll =================================================================== --- test/Analysis/CFLAliasAnalysis/int_ptr_cast.ll +++ test/Analysis/CFLAliasAnalysis/int_ptr_cast.ll @@ -0,0 +1,31 @@ +; This testcase ensures that inttoptr pointer only aliases pointers that it depends on + +; RUN: opt < %s -disable-basicaa -cfl-aa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s +; RUN: opt < %s -aa-pipeline=cfl-aa -passes=aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s + +; CHECK: Function: test_value_dep +; CHECK: NoAlias: i64* %p, i64* %qcast +; CHECK: MayAlias: i64* %q, i64* %qcast +define void @test_value_dep(i64* %p, i64 %n) { + %q = alloca i64, align 8 + %qint = ptrtoint i64* %q to i64 + %qint2 = add nsw i64 %qint, %n + %qcast = inttoptr i64 %qint2 to i64* + ret void +} + +; CHECK: Function: test_memory_dep +; CHECK: NoAlias: i64* %p, i64* %qcast +; CHECK: MayAlias: i64* %q, i64* %qcast +; CHECK: NoAlias: i64* %qcast, i64* %r +define void @test_memory_dep(i64* %p) { + %q = alloca i64, align 8 + %qint = ptrtoint i64* %q to i64 + + %r = alloca i64, align 8 + store i64 %qint, i64* %r + + %qint2 = load i64, i64* %r + %qcast = inttoptr i64 %qint2 to i64* + ret void +}