diff options
author | Jay Foad <jay.foad@amd.com> | 2020-04-17 16:17:26 +0100 |
---|---|---|
committer | Jay Foad <jay.foad@amd.com> | 2020-05-12 16:51:03 +0100 |
commit | 989be65b11fa2fbc2cde7e188657636ea9a2da1d (patch) | |
tree | 10553e3690cae1ad2af4ae728319cfbe104bdeef /llvm/lib/CodeGen | |
parent | bd80a8bb87617a25a1fda0338db3b26637b273a0 (diff) | |
download | llvm-989be65b11fa2fbc2cde7e188657636ea9a2da1d.zip llvm-989be65b11fa2fbc2cde7e188657636ea9a2da1d.tar.gz llvm-989be65b11fa2fbc2cde7e188657636ea9a2da1d.tar.bz2 |
[GlobalISel][IRTranslator] Fix <1 x Ty> handling in ConstantExprs
Summary:
ConstantExprs involving operations on <1 x Ty> could translate into MIR
that failed to verify with:
*** Bad machine code: Reading virtual register without a def ***
The problem was that translate(const Constant &C, Register Reg) had
recursive calls that passed the same Reg in for the translation of a
subexpression, but without updating VMap for the subexpression first as
translate(const Constant &C, Register Reg) expects.
Fix this by using the same translateCopy helper function that we use for
translating Instructions. In some cases this causes extra G_COPY
MIR instructions to be generated.
Fixes https://bugs.llvm.org/show_bug.cgi?id=45576
Reviewers: arsenm, volkan, t.p.northover, aditya_nandakumar
Subscribers: jvesely, wdng, nhaehnle, rovka, hiraditya, kerbowa, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D78378
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 4a2cbbb..109f86f 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -2173,7 +2173,7 @@ bool IRTranslator::translate(const Constant &C, Register Reg) { return false; // Return the scalar if it is a <1 x Ty> vector. if (CAZ->getNumElements() == 1) - return translate(*CAZ->getElementValue(0u), Reg); + return translateCopy(C, *CAZ->getElementValue(0u), *EntryBuilder.get()); SmallVector<Register, 4> Ops; for (unsigned i = 0; i < CAZ->getNumElements(); ++i) { Constant &Elt = *CAZ->getElementValue(i); @@ -2183,7 +2183,8 @@ bool IRTranslator::translate(const Constant &C, Register Reg) { } 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); + return translateCopy(C, *CV->getElementAsConstant(0), + *EntryBuilder.get()); SmallVector<Register, 4> Ops; for (unsigned i = 0; i < CV->getNumElements(); ++i) { Constant &Elt = *CV->getElementAsConstant(i); @@ -2201,7 +2202,7 @@ bool IRTranslator::translate(const Constant &C, Register Reg) { } } else if (auto CV = dyn_cast<ConstantVector>(&C)) { if (CV->getNumOperands() == 1) - return translate(*CV->getOperand(0), Reg); + return translateCopy(C, *CV->getOperand(0), *EntryBuilder.get()); SmallVector<Register, 4> Ops; for (unsigned i = 0; i < CV->getNumOperands(); ++i) { Ops.push_back(getOrCreateVReg(*CV->getOperand(i))); |