https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123268

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Robin Dapp from comment #2)
> It's the following match.pd pattern that fre happens to invoke:
> 
> /* Transform x * { 0 or 1, 0 or 1, ... } into x & { 0 or -1, 0 or -1, ...},
>    unless the target has native support for the former but not the latter. 
> */
> (simplify
>  (mult @0 VECTOR_CST@1)
>  (if (initializer_each_zero_or_onep (@1)
>  ...
> 
> I guess that's via try_conditional_simplification which strips cond, len,
> else, etc. from an IFN and simplifies the underlying operation, then adds it
> back.
> 
> We probably don't have too many patterns that go from float to int and this
> particular case where the else value is stale just never happened?
> 
> In convert_conditional_op when we put the IFN back together we don't verify
> that the operand types (or orig_op.type) and the else value's type match. 
> Maybe we should?  Another case where IFN type checking would help :)
> 
> On the other hand, the float zero is special and we could convert it to an
> integer zero?

Yeah, but I guess that only works for actual zero?  So I'd play safe here.

Reply via email to