From 8d5e4e48bced6a230acba41754ad7eca46d6ff0d Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 25 Jun 2015 18:32:02 +0000 Subject: [PATCH] GVN: If a branch has two identical successors, we cannot declare either dead. This previously caused miscompilations as a result of phi nodes receiving undef incoming values from blocks dominated by such successors. Differential Revision: http://reviews.llvm.org/D10726 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240670 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/GVN.cpp | 4 +++ test/Transforms/GVN/br-identical.ll | 38 +++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 test/Transforms/GVN/br-identical.ll diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp index e93833c32f4..60903c8b4aa 100644 --- a/lib/Transforms/Scalar/GVN.cpp +++ b/lib/Transforms/Scalar/GVN.cpp @@ -2804,6 +2804,10 @@ bool GVN::processFoldableCondBr(BranchInst *BI) { if (!BI || BI->isUnconditional()) return false; + // If a branch has two identical successors, we cannot declare either dead. + if (BI->getSuccessor(0) == BI->getSuccessor(1)) + return false; + ConstantInt *Cond = dyn_cast(BI->getCondition()); if (!Cond) return false; diff --git a/test/Transforms/GVN/br-identical.ll b/test/Transforms/GVN/br-identical.ll new file mode 100644 index 00000000000..dfb7abe9a5d --- /dev/null +++ b/test/Transforms/GVN/br-identical.ll @@ -0,0 +1,38 @@ +; RUN: opt -gvn -S -o - %s | FileCheck %s + +; If a branch has two identical successors, we cannot declare either dead. + +define void @widget(i1 %p) { +entry: + br label %bb2 + +bb2: + %t1 = phi i64 [ 0, %entry ], [ %t5, %bb7 ] + %t2 = add i64 %t1, 1 + %t3 = icmp ult i64 0, %t2 + br i1 %t3, label %bb3, label %bb4 + +bb3: + %t4 = call i64 @f() + br label %bb4 + +bb4: + ; CHECK-NOT: phi {{.*}} undef + %foo = phi i64 [ %t4, %bb3 ], [ 0, %bb2 ] + br i1 %p, label %bb5, label %bb6 + +bb5: + br i1 true, label %bb7, label %bb7 + +bb6: + br i1 true, label %bb7, label %bb7 + +bb7: + %t5 = add i64 %t1, 1 + br i1 %p, label %bb2, label %bb8 + +bb8: + ret void +} + +declare i64 @f() -- 2.34.1