From dcfc69899756f56739f18ebbe7b4bc8622bc54cb Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Thu, 6 Aug 2015 18:26:36 +0000 Subject: [PATCH] MIR Parser: Report an error when parsing duplicate memory operand flags. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244240 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MIRParser/MIParser.cpp | 6 +++- .../MIR/X86/duplicate-memory-operand-flag.mir | 29 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/MIR/X86/duplicate-memory-operand-flag.mir diff --git a/lib/CodeGen/MIRParser/MIParser.cpp b/lib/CodeGen/MIRParser/MIParser.cpp index 36460b3f3eb..f8a6200cc67 100644 --- a/lib/CodeGen/MIRParser/MIParser.cpp +++ b/lib/CodeGen/MIRParser/MIParser.cpp @@ -1059,6 +1059,7 @@ bool MIParser::getUint64(uint64_t &Result) { } bool MIParser::parseMemoryOperandFlag(unsigned &Flags) { + const unsigned OldFlags = Flags; switch (Token.kind()) { case MIToken::kw_volatile: Flags |= MachineMemOperand::MOVolatile; @@ -1069,11 +1070,14 @@ bool MIParser::parseMemoryOperandFlag(unsigned &Flags) { case MIToken::kw_invariant: Flags |= MachineMemOperand::MOInvariant; break; - // TODO: report an error when we specify the same flag more than once. // TODO: parse the target specific memory operand flags. default: llvm_unreachable("The current token should be a memory operand flag"); } + if (OldFlags == Flags) + // We know that the same flag is specified more than once when the flags + // weren't modified. + return error("duplicate '" + Token.stringValue() + "' memory operand flag"); lex(); return false; } diff --git a/test/CodeGen/MIR/X86/duplicate-memory-operand-flag.mir b/test/CodeGen/MIR/X86/duplicate-memory-operand-flag.mir new file mode 100644 index 00000000000..f608195387f --- /dev/null +++ b/test/CodeGen/MIR/X86/duplicate-memory-operand-flag.mir @@ -0,0 +1,29 @@ +# RUN: not llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s 2>&1 | FileCheck %s + +--- | + + define i32 @volatile_inc(i32* %x) { + entry: + %0 = load volatile i32, i32* %x + %1 = add i32 %0, 1 + store volatile i32 %1, i32* %x + ret i32 %1 + } + +... +--- +name: volatile_inc +tracksRegLiveness: true +liveins: + - { reg: '%rdi' } +body: + - id: 0 + name: entry + liveins: [ '%rdi' ] + instructions: +# CHECK: [[@LINE+1]]:55: duplicate 'volatile' memory operand flag + - '%eax = MOV32rm %rdi, 1, _, 0, _ :: (volatile volatile load 4 from %ir.x)' + - '%eax = INC32r killed %eax, implicit-def dead %eflags' + - 'MOV32mr killed %rdi, 1, _, 0, _, %eax :: (volatile store 4 into %ir.x)' + - 'RETQ %eax' +... -- 2.34.1