llvm-6502/lib/Transforms/Scalar
Hal Finkel 5b43c8551e [BDCE] Add a bit-tracking DCE pass
BDCE is a bit-tracking dead code elimination pass. It is based on ADCE (the
"aggressive DCE" pass), with the added capability to track dead bits of integer
valued instructions and remove those instructions when all of the bits are
dead.

Currently, it does not actually do this all-bits-dead removal, but rather
replaces the instruction's uses with a constant zero, and lets instcombine (and
the later run of ADCE) do the rest. Because we essentially get a run of ADCE
"for free" while tracking the dead bits, we also do what ADCE does and removes
actually-dead instructions as well (this includes instructions newly trivially
dead because all bits were dead, but not all such instructions can be removed).

The motivation for this is a case like:

int __attribute__((const)) foo(int i);
int bar(int x) {
  x |= (4 & foo(5));
  x |= (8 & foo(3));
  x |= (16 & foo(2));
  x |= (32 & foo(1));
  x |= (64 & foo(0));
  x |= (128& foo(4));
  return x >> 4;
}

As it turns out, if you order the bit-field insertions so that all of the dead
ones come last, then instcombine will remove them. However, if you pick some
other order (such as the one above), the fact that some of the calls to foo()
are useless is not locally obvious, and we don't remove them (without this
pass).

I did a quick compile-time overhead check using sqlite from the test suite
(Release+Asserts). BDCE took ~0.4% of the compilation time (making it about
twice as expensive as ADCE).

I've not looked at why yet, but we eliminate instructions due to having
all-dead bits in:
External/SPEC/CFP2006/447.dealII/447.dealII
External/SPEC/CINT2006/400.perlbench/400.perlbench
External/SPEC/CINT2006/403.gcc/403.gcc
MultiSource/Applications/ClamAV/clamscan
MultiSource/Benchmarks/7zip/7zip-benchmark

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229462 91177308-0d34-0410-b5e6-96231b3b80d8
2015-02-17 01:36:59 +00:00
..
ADCE.cpp [ADCE] Don't indent inside an anonymous namespace 2015-02-16 18:08:00 +00:00
AlignmentFromAssumptions.cpp [PM] Split the LoopInfo object apart from the legacy pass, creating 2015-01-17 14:16:18 +00:00
BDCE.cpp [BDCE] Add a bit-tracking DCE pass 2015-02-17 01:36:59 +00:00
CMakeLists.txt [BDCE] Add a bit-tracking DCE pass 2015-02-17 01:36:59 +00:00
ConstantHoisting.cpp [optnone] Skip pass Constant Hoisting on optnone functions. 2015-02-14 15:11:48 +00:00
ConstantProp.cpp
CorrelatedValuePropagation.cpp
DCE.cpp
DeadStoreElimination.cpp
EarlyCSE.cpp Removing LLVM_DELETED_FUNCTION, as MSVC 2012 was the last reason for requiring the macro. NFC; LLVM edition. 2015-02-15 22:54:22 +00:00
FlattenCFGPass.cpp
GVN.cpp Allow PRE to insert no-cost phi nodes 2015-02-03 20:37:08 +00:00
InductiveRangeCheckElimination.cpp Make helper functions/classes/globals static. NFC. 2015-02-06 17:51:54 +00:00
IndVarSimplify.cpp [multiversion] Thread a function argument through all the callers of the 2015-02-01 12:01:35 +00:00
JumpThreading.cpp [PM] Replace the Pass argument to SplitEdge with specific analyses used 2015-01-19 12:36:53 +00:00
LICM.cpp [PM] Split the LoopInfo object apart from the legacy pass, creating 2015-01-17 14:16:18 +00:00
LLVMBuild.txt
LoadCombine.cpp
LoopDeletion.cpp [PM] Split the LoopInfo object apart from the legacy pass, creating 2015-01-17 14:16:18 +00:00
LoopIdiomRecognize.cpp LoopIdiom: Use utility functions. 2015-02-07 21:37:08 +00:00
LoopInstSimplify.cpp [LPM] Stop using the string based preservation API. It is an 2015-01-28 04:57:56 +00:00
LoopRerollPass.cpp [LoopReroll] Relax some assumptions a little. 2015-02-16 17:02:00 +00:00
LoopRotation.cpp [multiversion] Thread a function argument through all the callers of the 2015-02-01 12:01:35 +00:00
LoopStrengthReduce.cpp [multiversion] Thread a function argument through all the callers of the 2015-02-01 12:01:35 +00:00
LoopUnrollPass.cpp Transforms: Canonicalize access to function attributes, NFC 2015-02-14 01:11:29 +00:00
LoopUnswitch.cpp Transforms: Canonicalize access to function attributes, NFC 2015-02-14 01:11:29 +00:00
LowerAtomic.cpp
LowerExpectIntrinsic.cpp [PM] Port LowerExpectIntrinsic to the new pass manager. 2015-01-24 11:13:02 +00:00
Makefile
MemCpyOptimizer.cpp Properly update AA metadata when performing call slot optimization 2015-02-07 17:54:36 +00:00
MergedLoadStoreMotion.cpp
PartiallyInlineLibCalls.cpp [multiversion] Thread a function argument through all the callers of the 2015-02-01 12:01:35 +00:00
PlaceSafepoints.cpp [PM] Remove the old 'PassManager.h' header file at the top level of 2015-02-13 10:01:29 +00:00
Reassociate.cpp Reassociate: cannot negate a INT_MIN value 2015-02-11 19:54:44 +00:00
Reg2Mem.cpp
SampleProfile.cpp [PM] Split the LoopInfo object apart from the legacy pass, creating 2015-01-17 14:16:18 +00:00
Scalar.cpp [BDCE] Add a bit-tracking DCE pass 2015-02-17 01:36:59 +00:00
Scalarizer.cpp
ScalarReplAggregates.cpp
SCCP.cpp
SeparateConstOffsetFromGEP.cpp [multiversion] Thread a function argument through all the callers of the 2015-02-01 12:01:35 +00:00
SimplifyCFGPass.cpp [multiversion] Thread a function argument through all the callers of the 2015-02-01 12:01:35 +00:00
Sink.cpp [PM] Split the LoopInfo object apart from the legacy pass, creating 2015-01-17 14:16:18 +00:00
SROA.cpp Debug info: When updating debug info during SROA, do not emit debug info 2015-02-09 23:57:22 +00:00
StraightLineStrengthReduce.cpp Fixing a -Wsign-compare warning; NFC 2015-02-04 14:01:08 +00:00
StructurizeCFG.cpp StructurizeCFG: Remove obsolete fix for loop backedge detection 2015-02-04 20:49:47 +00:00
TailRecursionElimination.cpp [multiversion] Thread a function argument through all the callers of the 2015-02-01 12:01:35 +00:00