[GlobalISel] Fix invalid combine of unmerge(merge) with intermediate cast
authorDominik Montada <dominik.montada@hightec-rt.com>
Wed, 15 Apr 2020 08:06:13 +0000 (10:06 +0200)
committerDominik Montada <dominik.montada@hightec-rt.com>
Wed, 15 Apr 2020 15:19:14 +0000 (17:19 +0200)
commitbddac41b9f1ae80b56dace7d55cd81a07147ff3d
tree0300e0155238e19807ec8bfec4b1520d05bcaaad
parent7c1355096794bcf07d59395825c83440d726c134
[GlobalISel] Fix invalid combine of unmerge(merge) with intermediate cast

Summary:
The combine for unmerge(cast(merge)) is only valid for vectors, but was
missing a corresponding check. Add a check that the operands are vectors
to avoid an invalid combine.

Without this check, the combiner would emit incorrect code for scalars
and pointers because the artifact cast (trunc/ext) only affects bits at
the end of the type, while this combine assumes that the casted bits
appear between meaningful bits.

This also uncovered a segmentation fault in the AMDGPU
InstructionSelector. The tests triggering this bug have been moved to
their own file and a check for the segmentation fault has been added.

Reviewers: arsenm, dsanders, aemerson, paquette, aditya_nandakumar

Reviewed By: arsenm

Subscribers: tpr, jvesely, wdng, nhaehnle, rovka, kerbowa, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D78191
llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h
llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-unmerge-values.mir
llvm/test/CodeGen/AMDGPU/GlobalISel/cvt_f32_ubyte-xfail.ll [new file with mode: 0644]
llvm/test/CodeGen/AMDGPU/GlobalISel/cvt_f32_ubyte.ll
llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-bitcast.mir
llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-merge-values.mir
llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-unmerge-values.mir
llvm/test/CodeGen/AMDGPU/GlobalISel/zextload-xfail.ll [new file with mode: 0644]
llvm/test/CodeGen/AMDGPU/GlobalISel/zextload.ll