[SelectionDAG][AArch64] Restrict matchUnaryPredicate to only handle SPLAT_VECTOR...
authorCraig Topper <craig.topper@sifive.com>
Tue, 16 Feb 2021 17:22:44 +0000 (09:22 -0800)
committerCraig Topper <craig.topper@sifive.com>
Tue, 16 Feb 2021 17:22:46 +0000 (09:22 -0800)
commit064ada4ec6bb4cb77d809ba366c90ca59e95d4ba
tree46c97d7b418c2f1cb3a5b6e28c5b82877daef65d
parent2ab57c503ed9d235bf7bf9334a414e1d3c628d17
[SelectionDAG][AArch64] Restrict matchUnaryPredicate to only handle SPLAT_VECTOR for scalable vectors.

fde24661718c7812a20a10e518cd853e8e060107 added support for
scalable vectors to matchUnaryPredicate by handling SPLAT_VECTOR in
addition to BUILD_VECTOR. This was used to enabled UDIV/SDIV/UREM/SREM
by constant expansion in BuildUDIV/BuildSDIV in TargetLowering.cpp

The caller there expects to call getBuildVector from the match factors.
This leads to a crash right now if there is a SPLAT_VECTOR of
fixed vectors since the number of vectors won't match the number
of elements.

To fix this, this patch updates the callers to check the opcode
instead of whether the type is fixed or scalable. This assumes
that only 3 opcodes are handled by matchUnaryPredicate so
I've added an assertion to the final else to check that opcode.

Reviewed By: RKSimon

Differential Revision: https://reviews.llvm.org/D96174
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/test/CodeGen/AArch64/sve-fixed-length-int-div.ll