aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-09-29 06:17:27 +0000
committerChris Lattner <sabre@nondot.org>2005-09-29 06:17:27 +0000
commita48bc53cad55452f534f7b5dad06a0d4c4607cc6 (patch)
tree1280c9956e923676ce1137fcb6280791997e5eea
parentd21dd0d8ad8ee89135d52162565b459b4863e118 (diff)
Fold isascii into a simple comparison. This speeds up 197.parser by 7.4%,
bringing the LLC time down to the CBE time. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23521 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/IPO/SimplifyLibCalls.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/Transforms/IPO/SimplifyLibCalls.cpp b/lib/Transforms/IPO/SimplifyLibCalls.cpp
index c3075f4eaa..58aac20b70 100644
--- a/lib/Transforms/IPO/SimplifyLibCalls.cpp
+++ b/lib/Transforms/IPO/SimplifyLibCalls.cpp
@@ -1745,6 +1745,32 @@ public:
}
} isdigitOptimizer;
+struct isasciiOptimization : public LibCallOptimization {
+public:
+ isasciiOptimization()
+ : LibCallOptimization("isascii", "Number of 'isascii' calls simplified") {}
+
+ virtual bool ValidateCalledFunction(const Function *F, SimplifyLibCalls &SLC){
+ return F->arg_size() == 1 && F->arg_begin()->getType()->isInteger() &&
+ F->getReturnType()->isInteger();
+ }
+
+ /// @brief Perform the isascii optimization.
+ virtual bool OptimizeCall(CallInst *CI, SimplifyLibCalls &SLC) {
+ // isascii(c) -> (unsigned)c < 128
+ Value *V = CI->getOperand(1);
+ if (V->getType()->isSigned())
+ V = new CastInst(V, V->getType()->getUnsignedVersion(), V->getName(), CI);
+ Value *Cmp = BinaryOperator::createSetLT(V, ConstantUInt::get(V->getType(),
+ 128),
+ V->getName()+".isascii", CI);
+ if (Cmp->getType() != CI->getType())
+ Cmp = new CastInst(Cmp, CI->getType(), Cmp->getName(), CI);
+ CI->replaceAllUsesWith(Cmp);
+ CI->eraseFromParent();
+ return true;
+ }
+} isasciiOptimizer;
/// This LibCallOptimization will simplify calls to the "toascii" library