From 243712720ad1da144d4376bdd854d81260c1beaa Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Wed, 15 Dec 2010 20:10:26 +0000 Subject: [PATCH] Strengthen GetUnderlyingObject using InstructionSimplify. While LLVM's main design is that analysis code shouldn't go out of its way to understand code which hasn't been InstCombined, analysis utility routines like this can find themselves being called in the middle of transform passes when instcombine hasn't had a chance to run. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121886 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/ValueTracking.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp index d1b75c3f9fc..75062953cba 100644 --- a/lib/Analysis/ValueTracking.cpp +++ b/lib/Analysis/ValueTracking.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Analysis/ValueTracking.h" +#include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Constants.h" #include "llvm/Instructions.h" #include "llvm/GlobalVariable.h" @@ -1440,6 +1441,14 @@ Value *llvm::GetUnderlyingObject(Value *V, unsigned MaxLookup) { return V; V = GA->getAliasee(); } else { + // See if InstructionSimplify knows any relevant tricks. + if (Instruction *I = dyn_cast(V)) + // TODO: Aquire TargetData and DominatorTree and use them. + if (Value *Simplified = SimplifyInstruction(I, 0, 0)) { + V = Simplified; + continue; + } + return V; } assert(V->getType()->isPointerTy() && "Unexpected operand type!");