From d5a00b0ff645be2fa219fd9abd95527c70ccdc5c Mon Sep 17 00:00:00 2001 From: Diana Picus Date: Wed, 2 Aug 2017 11:09:30 +0000 Subject: [PATCH] [MIR] Print target-specific constant pools This should enable us to test the generation of target-specific constant pools, e.g. for ARM: constants: - id: 0 value: 'g(GOT_PREL)-(LPC0+8-.)' alignment: 4 isTargetSpecific: true I intend to use this to test PIC support in GlobalISel for ARM. This is difficult to test outside of that context, since the existing MIR tests usually rely on parser support as well, and that seems a bit trickier to add. We could try to add a unit test, but the setup for that seems rather convoluted and overkill. We do test however that the parser reports a nice error when encountering a target-specific constant pool. Differential Revision: https://reviews.llvm.org/D36092 llvm-svn: 309806 --- llvm/include/llvm/CodeGen/MIRYamlMapping.h | 5 +++- llvm/lib/CodeGen/MIRParser/MIRParser.cpp | 4 +++ llvm/lib/CodeGen/MIRPrinter.cpp | 15 ++++++----- .../MIR/ARM/target-constant-pools-error.mir | 27 +++++++++++++++++++ llvm/test/CodeGen/MIR/X86/constant-pool.mir | 6 +++++ 5 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 llvm/test/CodeGen/MIR/ARM/target-constant-pools-error.mir diff --git a/llvm/include/llvm/CodeGen/MIRYamlMapping.h b/llvm/include/llvm/CodeGen/MIRYamlMapping.h index cbd94f1c4176..8e2c6149a827 100644 --- a/llvm/include/llvm/CodeGen/MIRYamlMapping.h +++ b/llvm/include/llvm/CodeGen/MIRYamlMapping.h @@ -310,9 +310,11 @@ struct MachineConstantPoolValue { UnsignedValue ID; StringValue Value; unsigned Alignment = 0; + bool IsTargetSpecific = false; bool operator==(const MachineConstantPoolValue &Other) const { return ID == Other.ID && Value == Other.Value && - Alignment == Other.Alignment; + Alignment == Other.Alignment && + IsTargetSpecific == Other.IsTargetSpecific; } }; @@ -321,6 +323,7 @@ template <> struct MappingTraits { YamlIO.mapRequired("id", Constant.ID); YamlIO.mapOptional("value", Constant.Value, StringValue()); YamlIO.mapOptional("alignment", Constant.Alignment, (unsigned)0); + YamlIO.mapOptional("isTargetSpecific", Constant.IsTargetSpecific, false); } }; diff --git a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp index d0b46c4668be..5df8dbce36a4 100644 --- a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp @@ -719,6 +719,10 @@ bool MIRParserImpl::initializeConstantPool(PerFunctionMIParsingState &PFS, const auto &M = *MF.getFunction()->getParent(); SMDiagnostic Error; for (const auto &YamlConstant : YamlMF.Constants) { + if (YamlConstant.IsTargetSpecific) + // FIXME: Support target-specific constant pools + return error(YamlConstant.Value.SourceRange.Start, + "Can't parse target-specific constant pool entries yet"); const Constant *Value = dyn_cast_or_null( parseConstantValue(YamlConstant.Value.Value, Error, M)); if (!Value) diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp index b9281b1e5e15..db9ccef8a365 100644 --- a/llvm/lib/CodeGen/MIRPrinter.cpp +++ b/llvm/lib/CodeGen/MIRPrinter.cpp @@ -458,17 +458,20 @@ void MIRPrinter::convert(yaml::MachineFunction &MF, const MachineConstantPool &ConstantPool) { unsigned ID = 0; for (const MachineConstantPoolEntry &Constant : ConstantPool.getConstants()) { - // TODO: Serialize target specific constant pool entries. - if (Constant.isMachineConstantPoolEntry()) - llvm_unreachable("Can't print target specific constant pool entries yet"); - - yaml::MachineConstantPoolValue YamlConstant; std::string Str; raw_string_ostream StrOS(Str); - Constant.Val.ConstVal->printAsOperand(StrOS); + if (Constant.isMachineConstantPoolEntry()) { + Constant.Val.MachineCPVal->print(StrOS); + } else { + Constant.Val.ConstVal->printAsOperand(StrOS); + } + + yaml::MachineConstantPoolValue YamlConstant; YamlConstant.ID = ID++; YamlConstant.Value = StrOS.str(); YamlConstant.Alignment = Constant.getAlignment(); + YamlConstant.IsTargetSpecific = Constant.isMachineConstantPoolEntry(); + MF.Constants.push_back(YamlConstant); } } diff --git a/llvm/test/CodeGen/MIR/ARM/target-constant-pools-error.mir b/llvm/test/CodeGen/MIR/ARM/target-constant-pools-error.mir new file mode 100644 index 000000000000..4fc7ea1f3cde --- /dev/null +++ b/llvm/test/CodeGen/MIR/ARM/target-constant-pools-error.mir @@ -0,0 +1,27 @@ +# RUN: not llc -mtriple arm-unknown -run-pass none -o /dev/null %s 2>&1 | FileCheck %s +--- | + target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" + + @g = private global i32 4 + define void @target_constant_pool() { ret void } +... +--- +name: target_constant_pool +tracksRegLiveness: true +registers: + - { id: 0, class: gpr, preferred-register: '' } + - { id: 1, class: gpr, preferred-register: '' } +constants: + - id: 0 + # CHECK: [[@LINE+1]]:22: Can't parse target-specific constant pool entries yet + value: 'g-(LPC0+8)' + alignment: 4 + isTargetSpecific: true +body: | + bb.0.entry: + %0 = LDRi12 %const.0, 0, 14, _ :: (load 4 from constant-pool) + %1 = PICLDR killed %0, 0, 14, _ :: (dereferenceable load 4 from @g) + %r0 = COPY %1 + BX_RET 14, _, implicit %r0 + +... diff --git a/llvm/test/CodeGen/MIR/X86/constant-pool.mir b/llvm/test/CodeGen/MIR/X86/constant-pool.mir index 3312e6f67bde..60e12d3ddcd9 100644 --- a/llvm/test/CodeGen/MIR/X86/constant-pool.mir +++ b/llvm/test/CodeGen/MIR/X86/constant-pool.mir @@ -46,9 +46,11 @@ # CHECK-NEXT: - id: 0 # CHECK-NEXT: value: 'double 3.250000e+00' # CHECK-NEXT: alignment: 8 +# CHECK-NEXT: isTargetSpecific: false # CHECK-NEXT: - id: 1 # CHECK-NEXT: value: 'float 6.250000e+00' # CHECK-NEXT: alignment: 4 +# CHECK-NEXT: isTargetSpecific: false name: test constants: - id: 0 @@ -74,9 +76,11 @@ body: | # CHECK-NEXT: - id: 0 # CHECK-NEXT: value: 'double 3.250000e+00' # CHECK-NEXT: alignment: 8 +# CHECK-NEXT: isTargetSpecific: false # CHECK-NEXT: - id: 1 # CHECK-NEXT: value: 'float 6.250000e+00' # CHECK-NEXT: alignment: 4 +# CHECK-NEXT: isTargetSpecific: false name: test2 constants: - id: 0 @@ -98,9 +102,11 @@ body: | # CHECK-NEXT: - id: 0 # CHECK-NEXT: value: 'double 3.250000e+00' # CHECK-NEXT: alignment: 128 +# CHECK-NEXT: isTargetSpecific: false # CHECK-NEXT: - id: 1 # CHECK-NEXT: value: 'float 6.250000e+00' # CHECK-NEXT: alignment: 1 +# CHECK-NEXT: isTargetSpecific: false name: test3 constants: - id: 0