From 4bfa6fecc1348f120e463138d4fb435b40d7b650 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Mon, 27 Jan 2014 10:47:44 +0000 Subject: [PATCH] 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 --- lib/Analysis/ScalarEvolution.cpp | 4 +++- test/Analysis/ScalarEvolution/fold.ll | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) 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 +} -- 2.34.1