Index: lib/Analysis/ScalarEvolution.cpp =================================================================== --- lib/Analysis/ScalarEvolution.cpp +++ lib/Analysis/ScalarEvolution.cpp @@ -80,6 +80,8 @@ #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/InstIterator.h" #include "llvm/IR/Instructions.h" +#include "llvm/IR/IntrinsicInst.h" +#include "llvm/IR/Intrinsics.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Operator.h" @@ -5225,6 +5227,15 @@ if (isa(U)) return createNodeForSelectOrPHI(cast(U), U->getOperand(0), U->getOperand(1), U->getOperand(2)); + break; + + case Instruction::Call: + if (IntrinsicInst *II = dyn_cast(U)) { + if (II->getIntrinsicID() == Intrinsic::noalias) + return getSCEV(U->getOperand(0)); + } + + break; } return getUnknown(V); Index: test/Analysis/ScalarEvolution/noalias.ll =================================================================== --- /dev/null +++ test/Analysis/ScalarEvolution/noalias.ll @@ -0,0 +1,18 @@ +; RUN: opt < %s -S -analyze -scalar-evolution | FileCheck %s +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" + +define i8* @foo(i32 %no, i8* nocapture %d) nounwind { +entry: + %v = call i8* @llvm.noalias.p0i8(i8* %d, metadata !1) + %w = getelementptr i8, i8* %v, i64 5 + ret i8* %w +} + +; CHECK-LABEL: Classifying expressions for: @foo +; CHECK: %w = getelementptr i8, i8* %v, i64 5 +; CHECK-NEXT: (5 + %d) + +declare i8* @llvm.noalias.p0i8(i8*, metadata) nounwind argmemonly + +!0 = !{!0, !"some domain"} +!1 = !{!1, !0, !"some scope"}