From: Nick Lewycky Date: Mon, 27 Jan 2014 10:47:44 +0000 (+0000) Subject: Fix crasher introduced in r200203 and caught by a libc++ buildbot. Don't assume that... X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=4bfa6fecc1348f120e463138d4fb435b40d7b650;p=oota-llvm.git Fix crasher introduced in r200203 and caught by a libc++ buildbot. Don't assume that getMulExpr returns a SCEVMulExpr, it may have simplified it to something else! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200210 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index e8ee46dff8c..1a15144863d 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -2292,7 +2292,9 @@ const SCEV *ScalarEvolution::getUDivExactExpr(const SCEV *LHS, Operands.append(Mul->op_begin() + 1, Mul->op_end()); LHS = getMulExpr(Operands); RHS = RHSCst; - Mul = cast(LHS); + Mul = dyn_cast(LHS); + if (!Mul) + return getUDivExactExpr(LHS, RHS); } } } diff --git a/test/Analysis/ScalarEvolution/fold.ll b/test/Analysis/ScalarEvolution/fold.ll index 84b657050c5..ab5742557b3 100644 --- a/test/Analysis/ScalarEvolution/fold.ll +++ b/test/Analysis/ScalarEvolution/fold.ll @@ -77,3 +77,12 @@ define void @test5(i32 %i) { ; CHECK: --> (-2147483648 * (%i /u -2147483648)) ret void } + +define void @test6(i8 %x) { +; CHECK-LABEL: @test6 + %A = zext i8 %x to i16 + %B = shl nuw i16 %A, 8 + %C = and i16 %B, -2048 +; CHECK: --> (2048 * ((zext i8 %x to i16) /u 8)) + ret void +}