diff options
-rw-r--r-- | include/llvm/CodeGen/MIRYamlMapping.h | 5 | ||||
-rw-r--r-- | lib/CodeGen/MIRParser/MIRParser.cpp | 4 | ||||
-rw-r--r-- | lib/CodeGen/MIRPrinter.cpp | 15 | ||||
-rw-r--r-- | test/CodeGen/MIR/ARM/target-constant-pools-error.mir | 27 | ||||
-rw-r--r-- | test/CodeGen/MIR/X86/constant-pool.mir | 6 |
5 files changed, 50 insertions, 7 deletions
diff --git a/include/llvm/CodeGen/MIRYamlMapping.h b/include/llvm/CodeGen/MIRYamlMapping.h index cbd94f1c417..8e2c6149a82 100644 --- a/include/llvm/CodeGen/MIRYamlMapping.h +++ b/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<MachineConstantPoolValue> { 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/lib/CodeGen/MIRParser/MIRParser.cpp b/lib/CodeGen/MIRParser/MIRParser.cpp index d0b46c4668b..5df8dbce36a 100644 --- a/lib/CodeGen/MIRParser/MIRParser.cpp +++ b/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<Constant>( parseConstantValue(YamlConstant.Value.Value, Error, M)); if (!Value) diff --git a/lib/CodeGen/MIRPrinter.cpp b/lib/CodeGen/MIRPrinter.cpp index b9281b1e5e1..db9ccef8a36 100644 --- a/lib/CodeGen/MIRPrinter.cpp +++ b/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/test/CodeGen/MIR/ARM/target-constant-pools-error.mir b/test/CodeGen/MIR/ARM/target-constant-pools-error.mir new file mode 100644 index 00000000000..4fc7ea1f3cd --- /dev/null +++ b/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/test/CodeGen/MIR/X86/constant-pool.mir b/test/CodeGen/MIR/X86/constant-pool.mir index 3312e6f67bd..60e12d3ddcd 100644 --- a/test/CodeGen/MIR/X86/constant-pool.mir +++ b/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 |