llvm-6502/test/Transforms
Jim Grosbach dc2dc390f6 LowerSwitch: track bounding range for the condition tree.
When LowerSwitch transforms a switch instruction into a tree of ifs it
is actually performing a binary search into the various case ranges, to
see if the current value falls into one cases range of values.

So, if we have a program with something like this:

switch (a) {
case 0:
  do0();
  break;
case 1:
  do1();
  break;
case 2:
  do2();
  break;
default:
  break;
}

the code produced is something like this:

  if (a < 1) {
    if (a == 0) {
      do0();
    }
  } else {
    if (a < 2) {
      if (a == 1) {
        do1();
      }
    } else {
      if (a == 2) {
        do2();
      }
    }
  }

This code is inefficient because the check (a == 1) to execute do1() is
not needed.

The reason is that because we already checked that (a >= 1) initially by
checking that also  (a < 2) we basically already inferred that (a == 1)
without the need of an extra basic block spawned to check if actually (a
== 1).

The patch addresses this problem by keeping track of already
checked bounds in the LowerSwitch algorithm, so that when the time
arrives to produce a Leaf Block that checks the equality with the case
value / range the algorithm can decide if that block is really needed
depending on the already checked bounds .

For example, the above with "a = 1" would work like this:

the bounds start as LB: NONE , UB: NONE
as (a < 1) is emitted the bounds for the else path become LB: 1 UB:
NONE. This happens because by failing the test (a < 1) we know that the
value "a" cannot be smaller than 1 if we enter the else branch.
After the emitting the check (a < 2) the bounds in the if branch become
LB: 1 UB: 1. This is because by checking that "a" is smaller than 2 then
the upper bound becomes 2 - 1 = 1.

When it is time to emit the leaf block for "case 1:" we notice that 1
can be squeezed exactly in between the LB and UB, which means that if we
arrived to that block there is no need to emit a block that checks if (a
== 1).

Patch by: Marcello Maggioni <hayarms@gmail.com>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211038 91177308-0d34-0410-b5e6-96231b3b80d8
2014-06-16 16:55:20 +00:00
..
ADCE
AddDiscriminators
ArgumentPromotion
AtomicExpandLoadLinked/ARM Atomics: make use of the "cmpxchg weak" instruction. 2014-06-13 16:45:52 +00:00
BBVectorize Reduce verbiage of lit.local.cfg files 2014-06-09 22:42:55 +00:00
BranchFolding
CodeExtractor
CodeGenPrepare Reduce verbiage of lit.local.cfg files 2014-06-09 22:42:55 +00:00
ConstantHoisting [ConstantHoisting][X86] Improve the cost model for small constants with large types (i64 and above). 2014-06-10 00:32:29 +00:00
ConstantMerge
ConstProp
CorrelatedValuePropagation
DeadArgElim
DeadStoreElimination
DebugIR
EarlyCSE
FunctionAttrs
GCOVProfiling
GlobalDCE
GlobalOpt
GVN GVN: Enable value forwarding for calloc 2014-06-12 21:16:19 +00:00
IndVarSimplify
Inline
InstCombine Canonicalize addrspacecast ConstExpr between different pointer types 2014-06-15 21:40:57 +00:00
InstSimplify
Internalize
IPConstantProp
JumpThreading
LCSSA
LICM
LoadCombine
LoopDeletion
LoopIdiom Reduce verbiage of lit.local.cfg files 2014-06-09 22:42:55 +00:00
LoopReroll
LoopRotate
LoopSimplify
LoopStrengthReduce Reduce verbiage of lit.local.cfg files 2014-06-09 22:42:55 +00:00
LoopUnroll Revert r210721 as it causes breakage in internal builds (and possibly GDB). 2014-06-12 18:05:39 +00:00
LoopUnswitch
LoopVectorize Reduce verbiage of lit.local.cfg files 2014-06-09 22:42:55 +00:00
LowerAtomic IR: add "cmpxchg weak" variant to support permitted failure. 2014-06-13 14:24:07 +00:00
LowerExpectIntrinsic
LowerInvoke
LowerSwitch LowerSwitch: track bounding range for the condition tree. 2014-06-16 16:55:20 +00:00
Mem2Reg
MemCpyOpt
MergeFunc Added functions cross-reference test. 2014-06-09 19:03:02 +00:00
MetaRenamer
ObjCARC
PhaseOrdering
PruneEH
Reassociate [Reassociate] FileCheckize and cleanup a few testcases. No functional change 2014-06-11 18:28:45 +00:00
Reg2Mem
SampleProfile
Scalarizer
ScalarRepl
SCCP SCCP: update for cmpxchg returning { iN, i1 } now. 2014-06-13 14:54:09 +00:00
SeparateConstOffsetFromGEP/NVPTX Reduce verbiage of lit.local.cfg files 2014-06-09 22:42:55 +00:00
SimplifyCFG Reduce verbiage of lit.local.cfg files 2014-06-09 22:42:55 +00:00
Sink
SLPVectorizer Reduce verbiage of lit.local.cfg files 2014-06-09 22:42:55 +00:00
SROA
StripSymbols
StructurizeCFG
TailCallElim
TailDup Reduce verbiage of lit.local.cfg files 2014-06-09 22:42:55 +00:00