From: Dan Gohman Date: Thu, 18 Jun 2009 20:21:07 +0000 (+0000) Subject: Recognize n != 0 ? n : 1 as umax(n, 1). Previously only ULT/UGT/ULE/UGE X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=30fb512e95f6a01f0c9c3426c2263ee0458de8e8;p=oota-llvm.git Recognize n != 0 ? n : 1 as umax(n, 1). Previously only ULT/UGT/ULE/UGE comparisons were recognized for umax, but instcombine canonicalizes unsigned comparisons with zero to this simpler form. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73717 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 9c6941f0d31..18c136fc0a6 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -2580,6 +2580,24 @@ SCEVHandle ScalarEvolution::createSCEV(Value *V) { return getNotSCEV(getUMaxExpr(getNotSCEV(getSCEV(LHS)), getNotSCEV(getSCEV(RHS)))); break; + case ICmpInst::ICMP_NE: + // n != 0 ? n : 1 -> umax(n, 1) + if (LHS == U->getOperand(1) && + isa(U->getOperand(2)) && + cast(U->getOperand(2))->isOne() && + isa(RHS) && + cast(RHS)->isZero()) + return getUMaxExpr(getSCEV(LHS), getSCEV(U->getOperand(2))); + break; + case ICmpInst::ICMP_EQ: + // n == 0 ? 1 : n -> umax(n, 1) + if (LHS == U->getOperand(2) && + isa(U->getOperand(1)) && + cast(U->getOperand(1))->isOne() && + isa(RHS) && + cast(RHS)->isZero()) + return getUMaxExpr(getSCEV(LHS), getSCEV(U->getOperand(1))); + break; default: break; }