From bf83203ae697b529c15e1d10064193dc6fdd248b Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Mon, 19 Jan 2009 08:46:20 +0000 Subject: [PATCH] Temporarily revert r62487. It's causing this error during a release bootstrap of llvm-gcc. Most likely, it's miscompiling one of the "gen*" programs: /Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm-gcc.obj/./prev-gcc/xgcc -B/Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm-gcc.obj/./prev-gcc/ -B/Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm-gcc.install/i386-apple-darwin9.6.0/bin/ -c -g -O2 -mdynamic-no-pic -DIN_GCC -W -Wall -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -mdynamic-no-pic -DHAVE_CONFIG_H -DGENERATOR_FILE -I. -Ibuild -I../../llvm-gcc.src/gcc -I../../llvm-gcc.src/gcc/build -I../../llvm-gcc.src/gcc/../include -I./../intl -I../../llvm-gcc.src/gcc/../libcpp/include -I../../llvm-gcc.src/gcc/../libdecnumber -I../libdecnumber -I/Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm.obj/include -I/Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm.src/include -DENABLE_LLVM -I/Volumes/Sandbox/Buildbot/llvm/full-llvm/build/llvm.obj/../llvm.src/include -D_DEBUG -D_GNU_SOURCE -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -o build/gencondmd.o build/gencondmd.c ../../llvm-gcc.src/gcc/config/i386/mmx.md:926: error: expected '}' before ')' token ../../llvm-gcc.src/gcc/config/i386/mmx.md:926: warning: excess elements in struct initializer ../../llvm-gcc.src/gcc/config/i386/mmx.md:926: warning: (near initialization for 'insn_conditions[4]') ../../llvm-gcc.src/gcc/config/i386/mmx.md:926: error: expected '}' before ')' token ../../llvm-gcc.src/gcc/config/i386/mmx.md:926: error: expected ',' or ';' before ')' token ../../llvm-gcc.src/gcc/config/i386/mmx.md:927: error: expected identifier or '(' before ',' token ../../llvm-gcc.src/gcc/config/i386/sse.md:3458: error: expected identifier or '(' before ',' token ... llvm-svn: 62506 --- lib/Transforms/Utils/SimplifyCFG.cpp | 79 +------------------ .../SimplifyCFG/2009-01-18-PHIPropCrash.ll | 1 + 2 files changed, 3 insertions(+), 77 deletions(-) diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index fd3ca9e8439..b0feadffadd 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -21,7 +21,6 @@ #include "llvm/Support/Debug.h" #include "llvm/Analysis/ConstantFolding.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" -#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/Statistic.h" @@ -173,74 +172,6 @@ static bool CanPropagatePredecessorsForPHIs(BasicBlock *BB, BasicBlock *Succ) { return true; } -/// BlockIsReachableFrom - Return true if there is a path from StartBB to -/// DestBB. We do this by recursively walking the CFG from DestBB up to StartBB -/// unwind we either reach StartBB or find an unreachable chunk of the CFG. -/// -/// Each entry in VisitedBlocks is either 0 -> not visited, 1 -> known reachable -/// 2 -> known unreachable, 3 -> visitation in progress. -static bool BlockIsReachableFrom(BasicBlock *StartBB, BasicBlock *DestBB, - DenseMap &VisitedBlocks) { - if (StartBB == DestBB) return true; - - unsigned &BlockEntry = VisitedBlocks[DestBB]; - if (BlockEntry == 1) return true; // Known reachable! - if (BlockEntry == 2 || // Known unreachable. - BlockEntry == 3) // Found a loop. - return false; - - // If BlockEntry is 0, this is the first time we've seen this block. Mark it - // as being visited and recurse up predecessors. - BlockEntry = 3; - - for (pred_iterator PI = pred_begin(DestBB), E = pred_end(DestBB); PI != E; - ++PI) { - if (BlockIsReachableFrom(StartBB, *PI, VisitedBlocks)) { - VisitedBlocks[DestBB] = 1; - return true; - } - } - - // If we scanned all of our predecessors and we couldn't find a path to - // StartBB, then this block must be unreachable for sure. Record this to - // prevent visitation of this block in the future. - VisitedBlocks[DestBB] = 2; - return false; -} - -/// RemoveUnreachableUsersOf - For each user of Inst, scan up the CFG until we -/// find Inst. If Inst is found, then the user is live, otherwise it is dead. -/// Remove dead users. This is basically a poor-man's dominance query, and is -/// worst-case linear time in the number of blocks in the function. -static void RemoveUnreachableUsersOf(Instruction *Inst) { - DenseMap VisitedBlocks; - - BasicBlock *InstBB = Inst->getParent(); - for (Instruction::use_iterator UI = Inst->use_begin(), E = Inst->use_end(); - UI != E;) { - Instruction *User = cast(*UI); - Use &TheUse = UI.getUse(); - - if (PHINode *PN = dyn_cast(User)) { - unsigned UseOp = UI.getOperandNo(); - ++UI; - - if (BlockIsReachableFrom(InstBB, PN->getIncomingBlock(UseOp/2), - VisitedBlocks)) - continue; - } else { - ++UI; - if (BlockIsReachableFrom(InstBB, User->getParent(), - VisitedBlocks)) - continue; - } - // If there is no path from Inst to this User, then this user is in dead - // code. Just replace uses of Inst with undef. - TheUse = UndefValue::get(Inst->getType()); - } -} - - /// TryToSimplifyUncondBranchFromEmptyBlock - BB contains an unconditional /// branch to Succ, and contains no instructions other than PHI nodes and the /// branch. If possible, eliminate BB. @@ -285,18 +216,12 @@ static bool TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB, } if (isa(&BB->front())) { - SmallVector OldSuccPreds(pred_begin(Succ), - pred_end(Succ)); + SmallVector + OldSuccPreds(pred_begin(Succ), pred_end(Succ)); // Move all PHI nodes in BB to Succ if they are alive, otherwise // delete them. while (PHINode *PN = dyn_cast(&BB->front())) { - // The algorithm below will not work if there are users of PN that are in - // unreachable blocks. These users will not be properly dominated by the - // instruction, but the IR is valid because dead code does not need to - // obey dominance properties. - RemoveUnreachableUsersOf(PN); - if (PN->use_empty()) { // Just remove the dead phi. This happens if Succ's PHIs were the only // users of the PHI nodes. diff --git a/test/Transforms/SimplifyCFG/2009-01-18-PHIPropCrash.ll b/test/Transforms/SimplifyCFG/2009-01-18-PHIPropCrash.ll index 692ef748262..fc34f5157ba 100644 --- a/test/Transforms/SimplifyCFG/2009-01-18-PHIPropCrash.ll +++ b/test/Transforms/SimplifyCFG/2009-01-18-PHIPropCrash.ll @@ -1,4 +1,5 @@ ; RUN: llvm-as < %s | opt -simplifycfg | llvm-dis +; XFAIL: * ; PR3016 ; Dead use caused invariant violation.