[llvm] r229618 - [BDCE] Don't forget uses of root instructions seen before the instruction itself
Hal Finkel
hfinkel at anl.gov
Tue Feb 17 19:12:29 PST 2015
Author: hfinkel
Date: Tue Feb 17 21:12:28 2015
New Revision: 229618
URL: http://llvm.org/viewvc/llvm-project?rev=229618&view=rev
Log:
[BDCE] Don't forget uses of root instructions seen before the instruction itself
When visiting the initial list of "root" instructions (those which must always
be alive), for those that are integer-valued (such as invokes returning an
integer), we mark their bits as (initially) all dead (we might, obviously, find
uses of those bits later, but all bits are assumed dead until proven
otherwise). Don't do so, however, if we're already seen a use of those bits by
another root instruction (such as a store).
Fixes a miscompile of the sanitizer unit tests on x86_64.
Also, add a debug line for visiting the root instructions, and remove a debug
line which tried to print instructions being removed (printing dead
instructions is dangerous, and can sometimes crash).
Added:
llvm/trunk/test/Transforms/BDCE/order.ll
Modified:
llvm/trunk/lib/Transforms/Scalar/BDCE.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/BDCE.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/BDCE.cpp?rev=229618&r1=229617&r2=229618&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/BDCE.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/BDCE.cpp Tue Feb 17 21:12:28 2015
@@ -277,13 +277,17 @@ bool BDCE::runOnFunction(Function& F) {
if (!isAlwaysLive(&I))
continue;
+ DEBUG(dbgs() << "BDCE: Root: " << I);
// For integer-valued instructions, set up an initial empty set of alive
// bits and add the instruction to the work list. For other instructions
// add their operands to the work list (for integer values operands, mark
// all bits as live).
if (IntegerType *IT = dyn_cast<IntegerType>(I.getType())) {
- AliveBits[&I] = APInt(IT->getBitWidth(), 0);
- Worklist.push_back(&I);
+ if (!AliveBits.count(&I)) {
+ AliveBits[&I] = APInt(IT->getBitWidth(), 0);
+ Worklist.push_back(&I);
+ }
+
continue;
}
@@ -388,7 +392,6 @@ bool BDCE::runOnFunction(Function& F) {
if (isAlwaysLive(&I))
continue;
- DEBUG(dbgs() << "BDCE: Removing: " << I << " (unused)\n");
Worklist.push_back(&I);
I.dropAllReferences();
Changed = true;
Added: llvm/trunk/test/Transforms/BDCE/order.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/BDCE/order.ll?rev=229618&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/BDCE/order.ll (added)
+++ llvm/trunk/test/Transforms/BDCE/order.ll Tue Feb 17 21:12:28 2015
@@ -0,0 +1,37 @@
+; RUN: opt -bdce -S < %s | FileCheck %s
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+declare i32 @__gxx_personality_v0(...)
+
+define fastcc void @_ZN11__sanitizerL12TestRegistryEPNS_14ThreadRegistryEb() #0 {
+entry:
+ br i1 undef, label %if.else, label %entry.if.end_crit_edge
+
+if.else:
+ ret void
+
+invoke.cont70:
+ store i32 %call71, i32* undef, align 4
+ br label %if.else
+
+; CHECK-LABEL: @_ZN11__sanitizerL12TestRegistryEPNS_14ThreadRegistryEb
+; CHECK: store i32 %call71
+
+lpad65.loopexit.split-lp.loopexit.split-lp:
+ br label %if.else
+
+lpad65.loopexit.split-lp.loopexit.split-lp.loopexit:
+ %lpad.loopexit1121 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
+ cleanup
+ br label %lpad65.loopexit.split-lp.loopexit.split-lp
+
+entry.if.end_crit_edge:
+ %call71 = invoke i32 @_ZN11__sanitizer14ThreadRegistry12CreateThreadEmbjPv()
+ to label %invoke.cont70 unwind label %lpad65.loopexit.split-lp.loopexit.split-lp.loopexit
+}
+
+declare i32 @_ZN11__sanitizer14ThreadRegistry12CreateThreadEmbjPv()
+
+attributes #0 = { uwtable }
+
More information about the llvm-commits
mailing list