diff options
author | Alon Zakai <alonzakai@gmail.com> | 2014-03-26 14:45:54 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2014-03-26 14:45:54 -0700 |
commit | 9901f6970fb393d63b606624b1fce828ada7c7e3 (patch) | |
tree | 8505b12b4903e8e2550d5e150690cfeb1a6b91ae /lib | |
parent | f80db17a78b7194761a717435c0ff015c7d92247 (diff) |
optimize x < 0 and generalize it to non-i64 values too
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/JSBackend/ExpandI64.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/Target/JSBackend/ExpandI64.cpp b/lib/Target/JSBackend/ExpandI64.cpp index 1fbf0ddebd..5a5a39ade2 100644 --- a/lib/Target/JSBackend/ExpandI64.cpp +++ b/lib/Target/JSBackend/ExpandI64.cpp @@ -646,6 +646,15 @@ bool ExpandI64::splitInst(Instruction *I) { case ICmpInst::ICMP_SLE: case ICmpInst::ICMP_UGE: case ICmpInst::ICMP_SGE: { + if (ConstantInt *CI = dyn_cast<ConstantInt>(I->getOperand(1))) { + if (CI->getZExtValue() == 0 && Pred == ICmpInst::ICMP_SLT) { + // strict < 0 is easy to do, even on non-i64, just the sign bit matters + Instruction *NewInst = new ICmpInst(I, ICmpInst::ICMP_SLT, LeftChunks[LeftChunks.size()-1], Zero); + CopyDebug(NewInst, I); + I->replaceAllUsesWith(NewInst); + return true; + } + } assert(I->getOperand(0)->getType() == i64); Instruction *A, *B, *C, *D, *Final; ICmpInst::Predicate StrictPred = Pred; |