diff options
author | Sanjay Patel <spatel@rotateright.com> | 2017-03-16 20:42:45 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2017-03-16 20:42:45 +0000 |
commit | 6105bb5eaf65c4d58a72e51cb2399b590c8fcb16 (patch) | |
tree | 25b27b75d34fe9f182d91a2adc2dd92b1a7cba91 /llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp | |
parent | 7fcc647a5c62cd24ca7a7a54989cecd5e5ba06d1 (diff) | |
download | bcm5719-llvm-6105bb5eaf65c4d58a72e51cb2399b590c8fcb16.tar.gz bcm5719-llvm-6105bb5eaf65c4d58a72e51cb2399b590c8fcb16.zip |
[InstCombine] avoid breaking up bitcasted vector min/max patterns (PR32306)
As the related tests show, we're not canonicalizing to this form for scalars or vectors yet,
but this solves the immediate problem in:
https://bugs.llvm.org/show_bug.cgi?id=32306
llvm-svn: 297989
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp index b8c1daab3f6..84dace5db76 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp @@ -120,6 +120,16 @@ static Constant *getSelectFoldableConstant(Instruction *I) { /// We have (select c, TI, FI), and we know that TI and FI have the same opcode. Instruction *InstCombiner::foldSelectOpOp(SelectInst &SI, Instruction *TI, Instruction *FI) { + // Don't break up min/max patterns. The hasOneUse checks below prevent that + // for most cases, but vector min/max with bitcasts can be transformed. If the + // one-use restrictions are eased for other patterns, we still don't want to + // obfuscate min/max. + if ((match(&SI, m_SMin(m_Value(), m_Value())) || + match(&SI, m_SMax(m_Value(), m_Value())) || + match(&SI, m_UMin(m_Value(), m_Value())) || + match(&SI, m_UMax(m_Value(), m_Value())))) + return nullptr; + // If this is a cast from the same type, merge. if (TI->getNumOperands() == 1 && TI->isCast()) { Type *FIOpndTy = FI->getOperand(0)->getType(); |