The method of doing the matching with a 'select' instruction was wrong. The
authorBill Wendling <isanbard@gmail.com>
Sun, 9 Nov 2008 23:17:42 +0000 (23:17 +0000)
committerBill Wendling <isanbard@gmail.com>
Sun, 9 Nov 2008 23:17:42 +0000 (23:17 +0000)
commit1fb43c32edd3b3eb9e4ece9240578984c5914d65
tree1c8e45159064131e0ad2016d5bdcb382f2a2a87a
parent47ed475dec2fdd3a434af2021cfdcbd7538b3e27
The method of doing the matching with a 'select' instruction was wrong. The
original code was matching like this:

if (match(A, m_Not(m_Value(B))))

B was already matched as a 'select' instruction. However, this isn't matching
what we think it's matching. It would match B as a 'Value', so basically
anything would match to it. In this case, a Constant matched. B was replaced
with a constant representation. And then the wrong value would be used in the
SelectInst::Create statement, causing a crash.

After thinking on this for a moment, and after Nick L. told me how the pattern
matching stuff was supposed to work, the solution was to match NOT an m_Value,
but an m_Select.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58946 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Scalar/InstructionCombining.cpp
test/FrontendC/2008-11-08-InstCombineSelect.c [new file with mode: 0644]