[PATCH][CodeGen] Fix a bug in bitcast optimization of DAGCombiner

Andrea Di Biagio andrea.dibiagio at gmail.com
Tue Mar 31 04:15:17 PDT 2015


Hi James,

I think what Jiangning was trying to say is that this node:
  v2i32 BV = BUILD_VECTOR (i32 58712, i32 undef)

is not equivalent to:
  v4i16 SV = SCALAR_TO_VECTOR (i16 58712)

scalar_to_vector SV is equivalent to a
  BUILD_VECTOR(i16 58712, i16 undef, i16 undef, i16 undef)

However, the correct value should be instead:
  BUILD_VECTOR(i16 58712, i16 0, i16 undef, i16 undef).

So, the problem is not that an undef has been turned to zero. It is
actually the other way round :-).
An explicit zero has been turned into an undef value.

The problem could have been described a bit better, however I don't
think this patch is wrong. It actually looks good to me.
As a side note: it would have been much easier to review this patch on
phabricator with a bit of context :-).

A small nit: in the test file, please change "Bugzilla #23065" with
PR23065. Also, it would be nice to have a comment in the test file
where you briefly describe what was the wrong optimization performed
by the dag combiner.

Thanks,
Andrea



On Tue, Mar 31, 2015 at 11:43 AM, James Molloy <james at jamesmolloy.co.uk> wrote:
> Hi Jiangning,
>
> I don't understand your logic here - the upper lanes can be undef, right.
> But undef is a contract that means "anything". So if we zero-extend, we make
> the upper lanes zero, but zero is a valid implementation of undef.
>
> Cheers,
>
> James
>
> On Tue, 31 Mar 2015 at 10:53 Jiangning Liu <liujiangning1 at gmail.com> wrote:
>>
>> BTW, this patch is to fix https://llvm.org/bugs/show_bug.cgi?id=23065 .
>>
>> Thanks,
>> -Jiangning
>>
>> 2015-03-31 17:47 GMT+08:00 Jiangning Liu <liujiangning1 at gmail.com>:
>>>
>>> Hi,
>>>
>>> The small patch attached is to fix a bug in bitcast optimization of
>>> DAGCombiner.
>>>
>>> Originally, the code tries to optimize bitcast with build_vector input to
>>> be a scalar_to_vector, if only the bitcast and build_vector can meet some
>>> conditions. In particular, it thought "ThisVal.zext(SrcBitSize) == OpVal" is
>>> one of the requirements. This requirement means, if zero extension of a
>>> narrow element value is equal to the original wide element value, the
>>> optimization would be allowed. Unfortunately this is incorrect, because the
>>> semantic of scalar_to_vector is the top 1 to N-1 elements are undef rather
>>> than zero. So no matter we use zero_extension or sign_extension, this
>>> transformation would be always invalid. The patch attached disables this
>>> optimization.
>>>
>>> Thanks,
>>> -Jiangning
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



More information about the llvm-commits mailing list