diff options
author | Owen Anderson <resistor@mac.com> | 2007-07-25 23:54:42 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2007-07-25 23:54:42 +0000 |
commit | febc7e3613007a159943917734baa35cc1b1411d (patch) | |
tree | b15e23af91f81add995912e606f8837db6b150f2 | |
parent | a49ed78c2793c52d89a780c1f71c4fca0602eb66 (diff) | |
download | external_llvm-febc7e3613007a159943917734baa35cc1b1411d.zip external_llvm-febc7e3613007a159943917734baa35cc1b1411d.tar.gz external_llvm-febc7e3613007a159943917734baa35cc1b1411d.tar.bz2 |
Fix what is _hopefully_ the last corner case for loops.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40503 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/GVN.cpp | 8 | ||||
-rw-r--r-- | test/Transforms/GVN/2007-07-25-DominatedLoop.ll | 86 |
2 files changed, 92 insertions, 2 deletions
diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index f3aa796..d7e6228 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -738,8 +738,12 @@ Value *GVN::performPHIConstruction(BasicBlock *BB, LoadInst* orig, for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) if (!visited.count(*PI)) PN->addIncoming(performPHIConstruction(*PI, orig, Phis, visited), *PI); - else - PN->addIncoming(Phis[*PI], *PI); + else { + if (Phis[*PI]) + PN->addIncoming(Phis[*PI], *PI); + else + PN->addIncoming(PN, *PI); + } visited.erase(BB); bool all_same = PN->getNumIncomingValues() != 1; diff --git a/test/Transforms/GVN/2007-07-25-DominatedLoop.ll b/test/Transforms/GVN/2007-07-25-DominatedLoop.ll new file mode 100644 index 0000000..7c10f97 --- /dev/null +++ b/test/Transforms/GVN/2007-07-25-DominatedLoop.ll @@ -0,0 +1,86 @@ +; RUN: llvm-as < %s | opt -gvn | llvm-dis + + %struct.PerlInterpreter = type { i8 } +@PL_sv_count = external global i32 ; <i32*> [#uses=2] + +define void @perl_destruct(%struct.PerlInterpreter* %sv_interp) { +entry: + br i1 false, label %cond_next25, label %cond_true16 + +cond_true16: ; preds = %entry + ret void + +cond_next25: ; preds = %entry + br i1 false, label %cond_next33, label %cond_true32 + +cond_true32: ; preds = %cond_next25 + ret void + +cond_next33: ; preds = %cond_next25 + br i1 false, label %cond_next61, label %cond_true.i46 + +cond_true.i46: ; preds = %cond_next33 + ret void + +cond_next61: ; preds = %cond_next33 + br i1 false, label %cond_next69, label %cond_true66 + +cond_true66: ; preds = %cond_next61 + ret void + +cond_next69: ; preds = %cond_next61 + br i1 false, label %Perl_safefree.exit52, label %cond_true.i50 + +cond_true.i50: ; preds = %cond_next69 + ret void + +Perl_safefree.exit52: ; preds = %cond_next69 + br i1 false, label %cond_next80, label %cond_true77 + +cond_true77: ; preds = %Perl_safefree.exit52 + ret void + +cond_next80: ; preds = %Perl_safefree.exit52 + br i1 false, label %Perl_safefree.exit56, label %cond_true.i54 + +cond_true.i54: ; preds = %cond_next80 + ret void + +Perl_safefree.exit56: ; preds = %cond_next80 + br i1 false, label %Perl_safefree.exit60, label %cond_true.i58 + +cond_true.i58: ; preds = %Perl_safefree.exit56 + ret void + +Perl_safefree.exit60: ; preds = %Perl_safefree.exit56 + br i1 false, label %Perl_safefree.exit64, label %cond_true.i62 + +cond_true.i62: ; preds = %Perl_safefree.exit60 + ret void + +Perl_safefree.exit64: ; preds = %Perl_safefree.exit60 + br i1 false, label %Perl_safefree.exit68, label %cond_true.i66 + +cond_true.i66: ; preds = %Perl_safefree.exit64 + ret void + +Perl_safefree.exit68: ; preds = %Perl_safefree.exit64 + br i1 false, label %cond_next150, label %cond_true23.i + +cond_true23.i: ; preds = %Perl_safefree.exit68 + ret void + +cond_next150: ; preds = %Perl_safefree.exit68 + %tmp16092 = load i32* @PL_sv_count, align 4 ; <i32> [#uses=0] + br label %cond_next165 + +bb157: ; preds = %cond_next165 + %tmp158 = load i32* @PL_sv_count, align 4 ; <i32> [#uses=0] + br label %cond_next165 + +cond_next165: ; preds = %bb157, %cond_next150 + br i1 false, label %bb171, label %bb157 + +bb171: ; preds = %cond_next165 + ret void +} |