+/// IVisLT - If Op is comparing IV based value with an loop invariant and
+/// IV based value is less than the loop invariant then return the loop
+/// invariant. Otherwise return NULL.
+Value * LoopIndexSplit::IVisLT(ICmpInst &Op) {
+ ICmpInst::Predicate P = Op.getPredicate();
+ if ((P == ICmpInst::ICMP_SLT || P == ICmpInst::ICMP_ULT)
+ && IVBasedValues.count(Op.getOperand(0))
+ && L->isLoopInvariant(Op.getOperand(1)))
+ return Op.getOperand(1);
+
+ if ((P == ICmpInst::ICMP_SGT || P == ICmpInst::ICMP_UGT)
+ && IVBasedValues.count(Op.getOperand(1))
+ && L->isLoopInvariant(Op.getOperand(0)))
+ return Op.getOperand(0);
+
+ return NULL;
+}
+
+/// IVisLE - If Op is comparing IV based value with an loop invariant and
+/// IV based value is less than or equal to the loop invariant then
+/// return the loop invariant. Otherwise return NULL.
+Value * LoopIndexSplit::IVisLE(ICmpInst &Op) {
+ ICmpInst::Predicate P = Op.getPredicate();
+ if ((P == ICmpInst::ICMP_SLE || P == ICmpInst::ICMP_ULE)
+ && IVBasedValues.count(Op.getOperand(0))
+ && L->isLoopInvariant(Op.getOperand(1)))
+ return Op.getOperand(1);
+
+ if ((P == ICmpInst::ICMP_SGE || P == ICmpInst::ICMP_UGE)
+ && IVBasedValues.count(Op.getOperand(1))
+ && L->isLoopInvariant(Op.getOperand(0)))
+ return Op.getOperand(0);
+
+ return NULL;
+}
+
+/// IVisGT - If Op is comparing IV based value with an loop invariant and
+/// IV based value is greater than the loop invariant then return the loop
+/// invariant. Otherwise return NULL.
+Value * LoopIndexSplit::IVisGT(ICmpInst &Op) {
+ ICmpInst::Predicate P = Op.getPredicate();
+ if ((P == ICmpInst::ICMP_SGT || P == ICmpInst::ICMP_UGT)
+ && IVBasedValues.count(Op.getOperand(0))
+ && L->isLoopInvariant(Op.getOperand(1)))
+ return Op.getOperand(1);
+
+ if ((P == ICmpInst::ICMP_SLT || P == ICmpInst::ICMP_ULT)
+ && IVBasedValues.count(Op.getOperand(1))
+ && L->isLoopInvariant(Op.getOperand(0)))
+ return Op.getOperand(0);
+
+ return NULL;
+}
+
+/// IVisGE - If Op is comparing IV based value with an loop invariant and
+/// IV based value is greater than or equal to the loop invariant then
+/// return the loop invariant. Otherwise return NULL.
+Value * LoopIndexSplit::IVisGE(ICmpInst &Op) {
+ ICmpInst::Predicate P = Op.getPredicate();
+ if ((P == ICmpInst::ICMP_SGE || P == ICmpInst::ICMP_UGE)
+ && IVBasedValues.count(Op.getOperand(0))
+ && L->isLoopInvariant(Op.getOperand(1)))
+ return Op.getOperand(1);
+
+ if ((P == ICmpInst::ICMP_SLE || P == ICmpInst::ICMP_ULE)
+ && IVBasedValues.count(Op.getOperand(1))
+ && L->isLoopInvariant(Op.getOperand(0)))
+ return Op.getOperand(0);
+
+ return NULL;
+}
+