When comparing constants, consider a less wide constant to be "less complex"

than a wider one, before trying to compare their contents which will crash
if their sizes are different.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74792 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nick Lewycky 2009-07-04 17:24:52 +00:00
parent 0cddc49b91
commit d1ec98923e
2 changed files with 18 additions and 0 deletions

View File

@ -495,6 +495,8 @@ namespace {
// Compare constant values.
if (const SCEVConstant *LC = dyn_cast<SCEVConstant>(LHS)) {
const SCEVConstant *RC = cast<SCEVConstant>(RHS);
if (LC->getValue()->getBitWidth() != RC->getValue()->getBitWidth())
return LC->getValue()->getBitWidth() < RC->getValue()->getBitWidth();
return LC->getValue()->getValue().ult(RC->getValue()->getValue());
}

View File

@ -0,0 +1,16 @@
; RUN: llvm-as < %s | opt -analyze -scalar-evolution
; PR4501
define void @test() {
entry:
%0 = load i16* undef, align 1
%1 = lshr i16 %0, 8
%2 = and i16 %1, 3
%3 = zext i16 %2 to i32
%4 = load i8* undef, align 1
%5 = lshr i8 %4, 4
%6 = and i8 %5, 1
%7 = zext i8 %6 to i32
%t1 = add i32 %3, %7
ret void
}