[InstCombine][SSE4a] Fix assertion failure caused by unsafe dyn_casts on the operands...
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Wed, 7 Sep 2016 12:03:03 +0000 (12:03 +0000)
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Wed, 7 Sep 2016 12:03:03 +0000 (12:03 +0000)
commit8df5b9cf487701ff323d3a758c71349f8b7916a8
treec7af87932457ff4c604dc34ed8cf9e6191e7c2b7
parentbcbbb3987d06a757b90e32b87716f9af8db9565b
[InstCombine][SSE4a] Fix assertion failure caused by unsafe dyn_casts on the operands of extrq/extrqi intrinsic calls.

This patch fixes an assertion failure caused by unsafe dynamic casts on the
constant operands of sse4a intrinsic calls to extrq/extrqi

The combine logic that simplifies sse4a extrq/extrqi intrinsic calls currently
checks if the input operands are constants. Internally, that logic relies on
dyn_casts of values returned by calls to method Constant::getAggregateElement.
However, method getAggregateElemet may return nullptr if the constant element
cannot be retrieved. So, all the dyn_casts can potentially fail. This is what
happens for example if a constexpr value is passed in input to an extrq/extrqi
intrinsic call.

This patch fixes the problem by using a dyn_cast_or_null (instead of a simple
dyn_cast) on the result of each call to Constant::getAggregateElement.

Added reproducible test cases to x86-sse4a.ll.

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

llvm-svn: 280804
llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
llvm/test/Transforms/InstCombine/x86-sse4a.ll