InstCombine: Stop two transforms dueling
authorDavid Majnemer <david.majnemer@gmail.com>
Thu, 19 Jun 2014 07:14:33 +0000 (07:14 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Thu, 19 Jun 2014 07:14:33 +0000 (07:14 +0000)
commit6c2e8874b0f1fd993a17ad27c8348ae531cd5464
tree07ebc42227db705656a73d014f0bdd931c190af7
parent179bb4e0eef028baf4015a12f962964739d3b542
InstCombine: Stop two transforms dueling

InstCombineMulDivRem has:
// Canonicalize (X+C1)*CI -> X*CI+C1*CI.

InstCombineAddSub has:
// W*X + Y*Z --> W * (X+Z)  iff W == Y

These two transforms could fight with each other if C1*CI would not fold
away to something simpler than a ConstantExpr mul.

The InstCombineMulDivRem transform only acted on ConstantInts until
r199602 when it was changed to operate on all Constants in order to
let it fire on ConstantVectors.

To fix this, make this transform more careful by checking to see if we
actually folded away C1*CI.

This fixes PR20079.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211258 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
test/Transforms/InstCombine/pr20079.ll [new file with mode: 0644]