From 2d2892ee6e75d5365c1c2ea33d33eb527f7a5d88 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 13 Sep 2007 16:30:19 +0000 Subject: [PATCH] Make AllUsesOfLoadedValueWillTrapIfNull strong enough to see through PHI nodes. This is the first step of the fix for PR1639. llvm-svn: 41927 --- llvm/lib/Transforms/IPO/GlobalOpt.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index 58a705d496a8..51398b8abd7e 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -26,6 +26,7 @@ #include "llvm/Target/TargetData.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" +#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/StringExtras.h" @@ -493,8 +494,10 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV) { } /// AllUsesOfValueWillTrapIfNull - Return true if all users of the specified -/// value will trap if the value is dynamically null. -static bool AllUsesOfValueWillTrapIfNull(Value *V) { +/// value will trap if the value is dynamically null. PHIs keeps track of any +/// phi nodes we've seen to avoid reprocessing them. +static bool AllUsesOfValueWillTrapIfNull(Value *V, + SmallPtrSet &PHIs) { for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E; ++UI) if (isa(*UI)) { // Will trap. @@ -513,10 +516,15 @@ static bool AllUsesOfValueWillTrapIfNull(Value *V) { //cerr << "NONTRAPPING USE: " << **UI; return false; // Not calling the ptr } - } else if (CastInst *CI = dyn_cast(*UI)) { - if (!AllUsesOfValueWillTrapIfNull(CI)) return false; + } else if (BitCastInst *CI = dyn_cast(*UI)) { + if (!AllUsesOfValueWillTrapIfNull(CI, PHIs)) return false; } else if (GetElementPtrInst *GEPI = dyn_cast(*UI)) { - if (!AllUsesOfValueWillTrapIfNull(GEPI)) return false; + if (!AllUsesOfValueWillTrapIfNull(GEPI, PHIs)) return false; + } else if (PHINode *PN = dyn_cast(*UI)) { + // If we've already seen this phi node, ignore it, it has already been + // checked. + if (PHIs.insert(PN)) + return AllUsesOfValueWillTrapIfNull(PN, PHIs); } else if (isa(*UI) && isa(UI->getOperand(1))) { // Ignore setcc X, null @@ -533,7 +541,8 @@ static bool AllUsesOfValueWillTrapIfNull(Value *V) { static bool AllUsesOfLoadedValueWillTrapIfNull(GlobalVariable *GV) { for (Value::use_iterator UI = GV->use_begin(), E = GV->use_end(); UI!=E; ++UI) if (LoadInst *LI = dyn_cast(*UI)) { - if (!AllUsesOfValueWillTrapIfNull(LI)) + SmallPtrSet PHIs; + if (!AllUsesOfValueWillTrapIfNull(LI, PHIs)) return false; } else if (isa(*UI)) { // Ignore stores to the global.