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
This commit is contained in:
Nick Lewycky 2014-01-27 10:47:44 +00:00
parent f2282cac95
commit 4bfa6fecc1
2 changed files with 12 additions and 1 deletions

View File

@ -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<SCEVMulExpr>(LHS);
Mul = dyn_cast<SCEVMulExpr>(LHS);
if (!Mul)
return getUDivExactExpr(LHS, RHS);
}
}
}

View File

@ -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
}