summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
diff options
context:
space:
mode:
authorVolkan Keles <vkeles@apple.com>2017-03-14 23:45:06 +0000
committerVolkan Keles <vkeles@apple.com>2017-03-14 23:45:06 +0000
commit4862c635948aca849f75af94751aac00ad404d4d (patch)
tree5d0d17970941b304dcd37d5558714cc40cbe3248 /llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
parent858b25e2c7ee0be3caf3205b428709649ac1111c (diff)
downloadbcm5719-llvm-4862c635948aca849f75af94751aac00ad404d4d.tar.gz
bcm5719-llvm-4862c635948aca849f75af94751aac00ad404d4d.zip
[GlobalISel] IRTranslator: Return the scalar for <1 x Ty> constant vectors
Summary: <1 x Ty> is not a legal vector type in LLT, we shouldn’t build G_MERGE_VALUES instruction for them. Reviewers: qcolombet, aditya_nandakumar, dsanders, t.p.northover, ab, javed.absar Reviewed By: qcolombet Subscribers: dberris, rovka, kristof.beyls, llvm-commits Differential Revision: https://reviews.llvm.org/D30948 llvm-svn: 297792
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index 15bf31cd6d6..3b926a34aaf 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -1068,6 +1068,9 @@ bool IRTranslator::translate(const Constant &C, unsigned Reg) {
else if (auto CAZ = dyn_cast<ConstantAggregateZero>(&C)) {
if (!CAZ->getType()->isVectorTy())
return false;
+ // Return the scalar if it is a <1 x Ty> vector.
+ if (CAZ->getNumElements() == 1)
+ return translate(*CAZ->getElementValue(0u), Reg);
std::vector<unsigned> Ops;
for (unsigned i = 0; i < CAZ->getNumElements(); ++i) {
Constant &Elt = *CAZ->getElementValue(i);
@@ -1075,6 +1078,9 @@ bool IRTranslator::translate(const Constant &C, unsigned Reg) {
}
EntryBuilder.buildMerge(Reg, Ops);
} else if (auto CV = dyn_cast<ConstantDataVector>(&C)) {
+ // Return the scalar if it is a <1 x Ty> vector.
+ if (CV->getNumElements() == 1)
+ return translate(*CV->getElementAsConstant(0), Reg);
std::vector<unsigned> Ops;
for (unsigned i = 0; i < CV->getNumElements(); ++i) {
Constant &Elt = *CV->getElementAsConstant(i);
OpenPOWER on IntegriCloud