From: Philip Reames Date: Wed, 30 Jun 2021 15:31:13 +0000 (-0700) Subject: [SCEV] Fold (0 udiv %x) to 0 X-Git-Tag: llvmorg-14-init~2602 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=14d8f1546a0483ef54a7a09442848d0a470c94c0;p=platform%2Fupstream%2Fllvm.git [SCEV] Fold (0 udiv %x) to 0 We have analogous rules in instsimplify, etc.., but were missing the same in SCEV. The fold is near trivial, but came up in the context of a larger change. --- diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 990f3d6..97ea60f 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -3268,6 +3268,11 @@ const SCEV *ScalarEvolution::getUDivExpr(const SCEV *LHS, if (const SCEV *S = UniqueSCEVs.FindNodeOrInsertPos(ID, IP)) return S; + // 0 udiv Y == 0 + if (const SCEVConstant *LHSC = dyn_cast(LHS)) + if (LHSC->getValue()->isZero()) + return LHS; + if (const SCEVConstant *RHSC = dyn_cast(RHS)) { if (RHSC->getValue()->isOne()) return LHS; // X udiv 1 --> x diff --git a/llvm/test/Analysis/ScalarEvolution/fold.ll b/llvm/test/Analysis/ScalarEvolution/fold.ll index 72b62ec..c23029d 100644 --- a/llvm/test/Analysis/ScalarEvolution/fold.ll +++ b/llvm/test/Analysis/ScalarEvolution/fold.ll @@ -132,6 +132,6 @@ define i64 @test11(i64 %a) { ; CHECK-LABEL: @test11 %t0 = udiv i64 0, %a ; CHECK: %t0 -; CHECK-NEXT: --> (0 /u %a) +; CHECK-NEXT: --> 0 ret i64 %t0 }