From 96418481bc5994e72b851e3779a8ff5cc2d2111e Mon Sep 17 00:00:00 2001 From: Justin Lebar Date: Fri, 1 Apr 2016 01:09:10 +0000 Subject: [PATCH] [NVPTX] Add a truncate DAG node to some calls. Summary: Previously, we were running afoul of the assertion EVT(CLI.Ins[i].VT) == InVals[i].getValueType() && "LowerCall emitted a value with the wrong type!" in SelectionDAGBuilder.cpp when running the NVPTX/i8-param.ll test. This is because our backend (for some reason) treats small return values as i32, but it wasn't ever truncating the i32 back down to the expected width in the DAG. Unclear to me whether this fixes any actual bugs -- in this test, at least, the generated code is unchanged. Reviewers: jingyue Subscribers: llvm-commits, tra, jholewinski Differential Revision: http://reviews.llvm.org/D17872 llvm-svn: 265091 --- llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp index 79689b4..8ff8ec3 100644 --- a/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp @@ -1620,9 +1620,11 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, for (unsigned i = 0, e = Ins.size(); i != e; ++i) { unsigned sz = VTs[i].getSizeInBits(); unsigned AlignI = GreatestCommonDivisor64(RetAlign, Offsets[i]); - bool needTruncate = sz < 8; - if (VTs[i].isInteger() && (sz < 8)) + bool needTruncate = false; + if (VTs[i].isInteger() && sz < 8) { sz = 8; + needTruncate = true; + } SmallVector LoadRetVTs; EVT TheLoadType = VTs[i]; @@ -1631,10 +1633,16 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, // aggregates. LoadRetVTs.push_back(MVT::i32); TheLoadType = MVT::i32; + needTruncate = true; } else if (sz < 16) { // If loading i1/i8 result, generate // load i8 (-> i16) // trunc i16 to i1/i8 + + // FIXME: Do we need to set needTruncate to true here, too? We could + // not figure out what this branch is for in D17872, so we left it + // alone. The comment above about loading i1/i8 may be wrong, as the + // branch above seems to cover integers of size < 32. LoadRetVTs.push_back(MVT::i16); } else LoadRetVTs.push_back(Ins[i].VT); -- 2.7.4