[llvm] r309949 - [TableGen] AsmMatcher: fix OpIdx computation when HasOptionalOperands is true
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 3 17:20:32 PDT 2017
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/6924/steps/check-llvm%20ubsan/logs/stdio
Testing: 0 .. 10.. 20.. 30.. 40.. 50.. 60.
FAIL: LLVM :: MC/AMDGPU/exp.s (14527 of 21592)
******************** TEST 'LLVM :: MC/AMDGPU/exp.s' FAILED ********************
Script:
--
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/./bin/llvm-mc
-arch=amdgcn -show-encoding
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/test/MC/AMDGPU/exp.s
| /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/./bin/FileCheck
-check-prefix=SI
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/test/MC/AMDGPU/exp.s
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/./bin/llvm-mc
-arch=amdgcn -mcpu=tonga -show-encoding
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/test/MC/AMDGPU/exp.s
| /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/./bin/FileCheck
-check-prefix=VI
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/test/MC/AMDGPU/exp.s
--
Exit Code: 2
Command Output (stderr):
--
lib/Target/AMDGPU/AMDGPUGenAsmMatcher.inc:9073:33: runtime error:
index -1 out of bounds for type 'unsigned int [12]'
#0 0x4e1272 in (anonymous
namespace)::AMDGPUAsmParser::convertToMCInst(unsigned int,
llvm::MCInst&, unsigned int,
llvm::SmallVectorImpl<std::unique_ptr<llvm::MCParsedAsmOperand,
std::default_delete<llvm::MCParsedAsmOperand> > > const&,
llvm::SmallBitVector const&)
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/lib/Target/AMDGPU/AMDGPUGenAsmMatcher.inc:9073:33
#1 0x4c7230 in (anonymous
namespace)::AMDGPUAsmParser::MatchInstructionImpl(llvm::SmallVectorImpl<std::unique_ptr<llvm::MCParsedAsmOperand,
std::default_delete<llvm::MCParsedAsmOperand> > > const&,
llvm::MCInst&, unsigned long&, bool, unsigned int)
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/lib/Target/AMDGPU/AMDGPUGenAsmMatcher.inc:19873:5
#2 0x4b55b8 in (anonymous
namespace)::AMDGPUAsmParser::MatchAndEmitInstruction(llvm::SMLoc,
unsigned int&, llvm::SmallVectorImpl<std::unique_ptr<llvm::MCParsedAsmOperand,
std::default_delete<llvm::MCParsedAsmOperand> > >&, llvm::MCStreamer&,
unsigned long&, bool)
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp:2222:14
#3 0x8f37ad in (anonymous
namespace)::AsmParser::parseStatement((anonymous
namespace)::ParseStatementInfo&, llvm::MCAsmParserSemaCallback*)
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/MC/MCParser/AsmParser.cpp:2224:27
#4 0x8eb2c8 in (anonymous namespace)::AsmParser::Run(bool, bool)
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/MC/MCParser/AsmParser.cpp:883:10
#5 0x454d70 in AssembleInput(char const*, llvm::Target const*,
llvm::SourceMgr&, llvm::MCContext&, llvm::MCStreamer&,
llvm::MCAsmInfo&, llvm::MCSubtargetInfo&, llvm::MCInstrInfo&,
llvm::MCTargetOptions&)
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-mc/llvm-mc.cpp:425:21
#6 0x453529 in main
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-mc/llvm-mc.cpp:608:11
#7 0x7f0e4bcf382f in __libc_start_main
(/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
#8 0x42d138 in _start
(/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/bin/llvm-mc+0x42d138)
FileCheck error: '-' is empty.
FileCheck command line:
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_ubsan/./bin/FileCheck
-check-prefix=SI
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/test/MC/AMDGPU/exp.s
On Thu, Aug 3, 2017 at 8:40 AM, Nirav Dave via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: niravd
> Date: Thu Aug 3 08:40:21 2017
> New Revision: 309949
>
> URL: http://llvm.org/viewvc/llvm-project?rev=309949&view=rev
> Log:
> [TableGen] AsmMatcher: fix OpIdx computation when HasOptionalOperands is
> true
>
> Consider the following instruction: "inst.eq $dst, $src" where ".eq"
> is an optional flag operand. The $src and $dst operands are
> registers. If we parse the instruction "inst r0, r1", the flag is not
> present and it will be marked in the "OptionalOperandsMask" variable.
> After the matching is complete we call the "convertToMCInst" method.
>
> The current implementation works only if the optional operands are at
> the end of the array. The "Operands" array looks like [token:"inst",
> reg:r0, reg:r1]. The first operand that must be added to the MCInst
> is the destination, the r0 register. The "OpIdx" (in the Operands
> array) for this register is 2. However, since the flag is not present
> in the Operands, the actual index for r0 should be 1. The flag is not
> present since we rely on the default value.
>
> This patch removes the "NumDefaults" variable and replaces it with an
> array (DefaultsOffset). This array contains an index for each operand
> (excluding the mnemonic). At each index, the array contains the
> number of optional operands that should be subtracted. For the
> previous example, this array looks like this: [0, 1, 1]. When we need
> to access the r0 register, we compute its index as 2 -
> DefaultsOffset[1] = 1.
>
> Patch by Alexandru Guduleasa!
>
> Reviewers: SamWot, nhaustov, niravd
>
> Subscribers: llvm-commits
>
> Differential Revision: https://reviews.llvm.org/D35998
>
> Modified:
> llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
>
> Modified: llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/
> TableGen/AsmMatcherEmitter.cpp?rev=309949&r1=309948&r2=309949&view=diff
> ============================================================
> ==================
> --- llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp (original)
> +++ llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp Thu Aug 3 08:40:21
> 2017
> @@ -1847,13 +1847,30 @@ static void emitConvertFuncs(CodeGenTarg
> CvtOS << " assert(Kind < CVT_NUM_SIGNATURES && \"Invalid
> signature!\");\n";
> CvtOS << " const uint8_t *Converter = ConversionTable[Kind];\n";
> if (HasOptionalOperands) {
> - CvtOS << " unsigned NumDefaults = 0;\n";
> + size_t MaxNumOperands = 0;
> + for (const auto &MI : Infos) {
> + MaxNumOperands = std::max(MaxNumOperands, MI->AsmOperands.size());
> + }
> + CvtOS << " unsigned DefaultsOffset[" << (MaxNumOperands) << "];\n";
> + CvtOS << " assert(OptionalOperandsMask.size() == " <<
> (MaxNumOperands)
> + << ");\n";
> + CvtOS << " for (unsigned i = 0, NumDefaults = 0; i < " <<
> (MaxNumOperands)
> + << "; ++i) {\n";
> + CvtOS << " DefaultsOffset[i] = NumDefaults;\n";
> + CvtOS << " NumDefaults += (OptionalOperandsMask[i] ? 1 : 0);\n";
> + CvtOS << " }\n";
> }
> CvtOS << " unsigned OpIdx;\n";
> CvtOS << " Inst.setOpcode(Opcode);\n";
> CvtOS << " for (const uint8_t *p = Converter; *p; p+= 2) {\n";
> if (HasOptionalOperands) {
> - CvtOS << " OpIdx = *(p + 1) - NumDefaults;\n";
> + // OpIdx has different semantics for Tied operands and the rest of the
> + // operands. For Tied it is the index in the Inst, therefore we use it
> + // directly. For the rest of the operands, we need to account for the
> + // offset.
> + CvtOS << " OpIdx = *(p + 1);\n";
> + CvtOS << " OpIdx -= (*p != CVT_Tied) ? DefaultsOffset[*(p + 1) -
> 1] : "
> + "0;\n";
> } else {
> CvtOS << " OpIdx = *(p + 1);\n";
> }
> @@ -1988,7 +2005,6 @@ static void emitConvertFuncs(CodeGenTarg
> << " " << Op.Class->DefaultMethod << "()"
> << "->" << Op.Class->RenderMethod << "(Inst, "
> << OpInfo.MINumOperands << ");\n"
> - << " ++NumDefaults;\n"
> << " } else {\n"
> << " static_cast<" << TargetOperandClass
> << "&>(*Operands[OpIdx])." << Op.Class->RenderMethod
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170803/6f27e15a/attachment.html>
More information about the llvm-commits
mailing list