diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index 2cf1661cfd9..767b42b4bd7 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -1011,6 +1011,10 @@ static Value *SimplifyDiv(Instruction::BinaryOps Opcode, Value *Op0, Value *Op1, if (match(Op1, m_Undef())) return Op1; + // X / 0 -> undef, we don't need to preserve faults! + if (match(Op1, m_Zero())) + return UndefValue::get(Op1->getType()); + // undef / X -> 0 if (match(Op0, m_Undef())) return Constant::getNullValue(Op0->getType()); diff --git a/test/Transforms/InstSimplify/undef.ll b/test/Transforms/InstSimplify/undef.ll index 181c2efa2dc..a6ae7a9fbf7 100644 --- a/test/Transforms/InstSimplify/undef.ll +++ b/test/Transforms/InstSimplify/undef.ll @@ -160,3 +160,17 @@ define <4 x i8> @test19(<4 x i8> %a) { %b = shl <4 x i8> %a, ret <4 x i8> %b } + +; CHECK-LABEL: @test20 +; CHECK: ret i32 undef +define i32 @test20(i32 %a) { + %b = udiv i32 %a, 0 + ret i32 %b +} + +; CHECK-LABEL: @test21 +; CHECK: ret i32 undef +define i32 @test21(i32 %a) { + %b = sdiv i32 %a, 0 + ret i32 %b +}