OSDN Git Service

[InstCombine] Teach the udiv folding logic how to handle constant expressions.
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Mon, 26 Sep 2016 12:07:23 +0000 (12:07 +0000)
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Mon, 26 Sep 2016 12:07:23 +0000 (12:07 +0000)
commit56f90d72c89f5ba87c6d735c71936b4f7292b882
treea5ad125dd4a78db742dc8023f2538aa2a9d8e9f9
parent679be7ea7ef926c0b4767244e4f64e786dbb2da1
[InstCombine] Teach the udiv folding logic how to handle constant expressions.

This patch fixes PR30366.

Function foldUDivShl() worked under the assumption that one of the values
in input to the function was always an instance of llvm::Instruction.
However, function visitUDivOperand() (the only user of foldUDivShl) was
clearly violating that precondition; internally, visitUDivOperand() uses pattern
matches to check the operands of a udiv. Pattern matchers for binary operators
know how to handle both Instruction and ConstantExpr values.

This patch fixes the problem in foldUDivShl(). Now we use pattern matchers
instead of explicit casts to Instruction. The reduced test case from PR30366
has been added to test file InstCombine/udiv-simplify.ll.

Differential Revision: https://reviews.llvm.org/D24565

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282398 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
test/Transforms/InstCombine/udiv-simplify.ll