44 bool isLocalIntVar(
jitdata* jd,
s4 varIndex);
46 bool isLocalVar(
jitdata* jd,
s4 varIndex);
75 if (isLocalIntVar(jd, instr->s1.varindex))
79 if (instr->s1.varindex != instr->dst.varindex)
111 if (isLocalVar(jd, instr->s1.varindex))
136 assert(!loop->
footers.empty());
140 enum { SEEKING_JUMP, JUMP_FOUND, INC_FOUND } state = SEEKING_JUMP;
142 for (
s4 i = footer->icount - 1;
i >= 0;
i--)
210 for (std::vector<Edge>::iterator it = jd->ld->loopBackEdges.begin(); it != jd->ld->loopBackEdges.end(); ++it)
212 if (it->from == pred && it->to == node)
224 if (node->ld->analyzed)
226 if (target == node->ld->jumpTarget)
227 return node->ld->targetIntervals;
229 return node->ld->intervals;
233 node->ld->analyzed =
true;
237 IntervalMap& targetIntervals = node->ld->targetIntervals;
248 if (isRegularPredecessor(jd, node, node->
predecessors[0]))
263 for (
LoopList::iterator predLoopIt = pred->ld->loops.begin(); predLoopIt != pred->ld->loops.end(); ++predLoopIt)
266 if (node->ld->loops.find(predLoop) == node->ld->loops.end())
276 for (
size_t j = 0; j < intervals.
size(); j++)
301 if (node->ld->loop->hasCounterVariable)
303 if (node->ld->loop->counterIncrement >= 0)
311 for (
VariableSet::iterator it = node->ld->loop->writtenVariables.begin(); it != node->ld->loop->writtenVariables.end(); ++it)
317 for (
VariableSet::iterator it = node->ld->loop->invariantVariables.begin(); it != node->ld->loop->invariantVariables.end(); ++it)
319 node->ld->loop->invariantIntervals[*it] = intervals[*it];
329 s4 s2_index = instr->
sx.
s23.s2.varindex;
337 if (isLocalIntVar(jd, dst_index))
347 if (isLocalIntVar(jd, dst_index))
352 if (s1_index != dst_index)
355 intervals[dst_index] = intervals[s1_index];
361 if (isLocalIntVar(jd, dst_index))
370 if (isLocalIntVar(jd, dst_index))
372 Scalar l = intervals[s1_index].lower();
373 Scalar u = intervals[s1_index].upper();
378 intervals[dst_index] =
Interval(l, u);
388 if (isLocalIntVar(jd, dst_index))
390 Scalar l = intervals[s1_index].lower();
391 Scalar u = intervals[s1_index].upper();
396 intervals[dst_index] =
Interval(l, u);
433 if (intervals[s2_index].isWithinBounds(s1_index))
439 node->ld->jumpTarget = instr->
dst.
block;
445 targetIntervals = intervals;
446 targetIntervals[s1_index].intersectWith(
i);
449 intervals[s1_index].tryRemove(s);
455 node->ld->jumpTarget = instr->
dst.
block;
461 targetIntervals = intervals;
462 targetIntervals[s1_index].tryRemove(s);
465 intervals[s1_index].intersectWith(
i);
471 node->ld->jumpTarget = instr->
dst.
block;
482 targetIntervals = intervals;
483 targetIntervals[s1_index].intersectWith(
i);
494 intervals[s1_index].intersectWith(
i);
501 node->ld->jumpTarget = instr->
dst.
block;
511 targetIntervals = intervals;
512 targetIntervals[s1_index].intersectWith(
i);
524 intervals[s1_index].intersectWith(
i);
531 node->ld->jumpTarget = instr->
dst.
block;
542 targetIntervals = intervals;
543 targetIntervals[s1_index].intersectWith(
i);
554 intervals[s1_index].intersectWith(
i);
561 node->ld->jumpTarget = instr->
dst.
block;
571 targetIntervals = intervals;
572 targetIntervals[s1_index].intersectWith(
i);
584 intervals[s1_index].intersectWith(
i);
591 node->ld->jumpTarget = instr->
dst.
block;
596 targetIntervals = intervals;
597 targetIntervals[s1_index].intersectWith(intervals[s2_index]);
598 targetIntervals[s2_index] = targetIntervals[s1_index];
606 if (temp[s2_index].lower() == temp[s2_index].upper())
608 intervals[s1_index].tryRemove(temp[s2_index].lower());
613 if (temp[s1_index].lower() == temp[s1_index].upper())
615 intervals[s2_index].tryRemove(temp[s1_index].lower());
622 node->ld->jumpTarget = instr->
dst.
block;
626 targetIntervals = intervals;
630 if (intervals[s2_index].lower() == intervals[s2_index].upper())
632 targetIntervals[s1_index].tryRemove(intervals[s2_index].lower());
637 if (intervals[s1_index].lower() == intervals[s1_index].upper())
639 targetIntervals[s2_index].tryRemove(intervals[s1_index].lower());
645 intervals[s1_index].intersectWith(intervals[s2_index]);
646 intervals[s2_index] = intervals[s1_index];
652 node->ld->jumpTarget = instr->
dst.
block;
656 targetIntervals = intervals;
660 lessThan.
upper(intervals[s2_index].upper());
661 lessThan.
tryRemove(intervals[s2_index].upper());
665 greaterThan.
lower(intervals[s1_index].lower());
666 greaterThan.
tryRemove(intervals[s1_index].lower());
669 targetIntervals[s1_index].intersectWith(lessThan);
672 targetIntervals[s2_index].intersectWith(greaterThan);
679 greaterThan.
lower(intervals[s2_index].lower());
683 lessThan.
upper(intervals[s1_index].upper());
686 intervals[s1_index].intersectWith(greaterThan);
689 intervals[s2_index].intersectWith(lessThan);
696 node->ld->jumpTarget = instr->
dst.
block;
700 targetIntervals = intervals;
704 lessThan.
upper(intervals[s2_index].upper());
708 greaterThan.
lower(intervals[s1_index].lower());
711 targetIntervals[s1_index].intersectWith(lessThan);
714 targetIntervals[s2_index].intersectWith(greaterThan);
721 greaterThan.
lower(intervals[s2_index].lower());
722 greaterThan.
tryRemove(intervals[s2_index].lower());
726 lessThan.
upper(intervals[s1_index].upper());
727 lessThan.
tryRemove(intervals[s1_index].upper());
730 intervals[s1_index].intersectWith(greaterThan);
733 intervals[s2_index].intersectWith(lessThan);
740 node->ld->jumpTarget = instr->
dst.
block;
744 targetIntervals = intervals;
748 greaterThan.
lower(intervals[s2_index].lower());
749 greaterThan.
tryRemove(intervals[s2_index].lower());
753 lessThan.
upper(intervals[s1_index].upper());
754 lessThan.
tryRemove(intervals[s1_index].upper());
757 targetIntervals[s1_index].intersectWith(greaterThan);
760 targetIntervals[s2_index].intersectWith(lessThan);
767 lessThan.
upper(intervals[s2_index].upper());
771 greaterThan.
lower(intervals[s1_index].lower());
774 intervals[s1_index].intersectWith(lessThan);
777 intervals[s2_index].intersectWith(greaterThan);
784 node->ld->jumpTarget = instr->
dst.
block;
788 targetIntervals = intervals;
792 greaterThan.
lower(intervals[s2_index].lower());
796 lessThan.
upper(intervals[s1_index].upper());
799 targetIntervals[s1_index].intersectWith(greaterThan);
802 targetIntervals[s2_index].intersectWith(lessThan);
809 lessThan.
upper(intervals[s2_index].upper());
810 lessThan.
tryRemove(intervals[s2_index].upper());
814 greaterThan.
lower(intervals[s1_index].lower());
815 greaterThan.
tryRemove(intervals[s1_index].lower());
818 intervals[s1_index].intersectWith(lessThan);
821 intervals[s2_index].intersectWith(greaterThan);
834 if (isLocalIntVar(jd, dst_index))
841 for (
size_t i = 0;
i < intervals.
size();
i++)
844 intervals[
i].lower().instruction().variable() == dst_index)
849 intervals[
i].upper().
instruction().variable() == dst_index)
864 if (node->ld->loop && node->ld->loop->hasCounterVariable)
866 if (node->ld->jumpTarget)
869 if (node->ld->jumpTarget->ld->loops.find(node->ld->loop) == node->ld->jumpTarget->ld->loops.end())
872 node->ld->loop->counterInterval.intersectWith(intervals[node->ld->loop->counterVariable]);
877 Interval temp = intervals[node->ld->loop->counterVariable];
878 temp.
unionWith(targetIntervals[node->ld->loop->counterVariable]);
879 node->ld->loop->counterInterval.intersectWith(temp);
884 node->ld->loop->counterInterval.intersectWith(intervals[node->ld->loop->counterVariable]);
888 if (target == node->ld->jumpTarget)
889 return targetIntervals;
897 bool isLocalIntVar(
jitdata* jd,
s4 varIndex)
917 bool isLocalVar(
jitdata* jd,
s4 varIndex)
931 for (std::vector<LoopContainer*>::iterator it = jd->ld->loops.begin(); it != jd->ld->loops.end(); ++it)
935 assert(!loop->
footers.empty());
941 analyzeBasicblockInLoop(jd, loop->
header, loop);
942 for (std::vector<basicblock*>::iterator blockIt = loop->
nodes.begin(); blockIt != loop->
nodes.end(); ++blockIt)
944 if (*blockIt != footer)
945 analyzeBasicblockInLoop(jd, *blockIt, loop);
947 analyzeFooter(jd, loop);
948 analyzeBasicblockInLoop(jd, footer, loop);
965 for (std::vector<Edge>::const_iterator it = jd->ld->loopBackEdges.begin(); it != jd->ld->loopBackEdges.end(); ++it)
967 it->from->ld->outgoingBackEdgeCount++;
972 assert(b->successorcount >= b->ld->outgoingBackEdgeCount);
973 b->ld->leaf = (b->successorcount == b->ld->outgoingBackEdgeCount);
982 analyze(jd, block, 0);
VariableSet writtenVariables
Maps variable names to intervals.
Represents a single loop.
static bool instruction_has_dst(const instruction *iptr)
VariableSet invariantArrays
void unionWith(const IntervalMap &)
Computes the union set of this map with the specified map.
std::set< s4 >::iterator iterator
VariableSet invariantVariables
std::set< s4 >::iterator begin()
bool contains(s4 variableIndex)
void findLeaves(jitdata *jd)
Marks all basicblocks which are leaves.
An integer interval of the form constant_0 + instruction_0 .
void analyzeLoops(jitdata *jd)
Analyzes all loops and for every loop it finds.
static bool var_is_local(const jitdata *jd, s4 i)
An integral value of the form Constant + NumericInstruction.
void tryRemove(const Scalar &)
Tries to remove the specified scalar from this interval.
void unionWith(const Interval &)
Computes a superset of the union of this interval with the specified interval.
basicblock ** predecessors
static NumericInstruction newArrayLength(s4 variable)
union instruction::@12 sx
IntervalMap invariantIntervals
std::vector< basicblock * > footers
icmdtable_entry_t icmd_table[256]
static NumericInstruction newVariable(s4 variable)
void removeFullyRedundantChecks(jitdata *jd)
Removes all array bound checks that are fully redundant.
std::vector< basicblock * > nodes
static bool var_is_temp(const jitdata *jd, s4 i)
std::vector< LoopContainer * >::iterator iterator
bool tryAdd(const Scalar &)
Tries to add a scalar to this scalar.
std::set< s4 >::iterator end()
void remove(s4 variableIndex)
struct instruction::@12::@13 s23
bool trySubtract(const Scalar &)
Tries to subtract a scalar from this scalar.
void insert(s4 variableIndex)