From 30fb512e95f6a01f0c9c3426c2263ee0458de8e8 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Thu, 18 Jun 2009 20:21:07 +0000 Subject: [PATCH] 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 --- lib/Analysis/ScalarEvolution.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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; }