InstCombine: Don't assume DataLayout is always available

We tried to get the result of DataLayout::getLargestLegalIntTypeSize but
we didn't have a DataLayout.  This resulted in opt crashing.

This fixes PR21651.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@222645 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Majnemer 2014-11-24 07:26:20 +00:00
parent 5deb1bf97f
commit 4a9d304d9d
2 changed files with 22 additions and 1 deletions

View File

@ -2095,7 +2095,8 @@ Instruction *InstCombiner::visitSwitchInst(SwitchInst &SI) {
// the largest legal integer type. We need to be conservative here since
// x86 generates redundant zero-extenstion instructions if the operand is
// truncated to i8 or i16.
if (BitWidth > NewWidth && NewWidth >= DL->getLargestLegalIntTypeSize()) {
if (DL && BitWidth > NewWidth &&
NewWidth >= DL->getLargestLegalIntTypeSize()) {
IntegerType *Ty = IntegerType::get(SI.getContext(), NewWidth);
Builder->SetInsertPoint(&SI);
Value *NewCond = Builder->CreateTrunc(SI.getCondition(), Ty, "trunc");

View File

@ -0,0 +1,20 @@
; RUN: opt < %s -instcombine -S | FileCheck %s
define void @PR21651() {
switch i2 0, label %out [
i2 0, label %out
i2 1, label %out
]
out:
ret void
}
; CHECK-LABEL: define void @PR21651(
; CHECK: switch i2 0, label %out [
; CHECK: i2 0, label %out
; CHECK: i2 1, label %out
; CHECK: ]
; CHECK: out: ; preds = %0, %0, %0
; CHECK: ret void
; CHECK: }