Skip to content

Commit 66037b8

Browse files
author
Jessica Paquette
committed
MachineFunctionInfo for AArch64 in MIR
Starting with hasRedZone adding MachineFunctionInfo to be put in the YAML for MIR files. Split out of: D78062 Based on implementation for MachineFunctionInfo for WebAssembly Differential Revision: https://reviews.llvm.org/D78173 Patch by Andrew Litteken! (AndrewLitteken)
1 parent 861b69f commit 66037b8

File tree

7 files changed

+169
-0
lines changed

7 files changed

+169
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//=- AArch64MachineFunctionInfo.cpp - AArch64 Machine Function Info ---------=//
2+
3+
//
4+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5+
// See https://llvm.org/LICENSE.txt for license information.
6+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7+
//
8+
//===----------------------------------------------------------------------===//
9+
///
10+
/// \file
11+
/// This file implements AArch64-specific per-machine-function
12+
/// information.
13+
///
14+
//===----------------------------------------------------------------------===//
15+
16+
#include "AArch64MachineFunctionInfo.h"
17+
18+
using namespace llvm;
19+
20+
yaml::AArch64FunctionInfo::AArch64FunctionInfo(
21+
const llvm::AArch64FunctionInfo &MFI)
22+
: HasRedZone(MFI.hasRedZone()) {}
23+
24+
void yaml::AArch64FunctionInfo::mappingImpl(yaml::IO &YamlIO) {
25+
MappingTraits<AArch64FunctionInfo>::mapping(YamlIO, *this);
26+
}
27+
28+
void AArch64FunctionInfo::initializeBaseYamlFields(
29+
const yaml::AArch64FunctionInfo &YamlMFI) {
30+
if (YamlMFI.HasRedZone.hasValue())
31+
HasRedZone = YamlMFI.HasRedZone;
32+
}

llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "llvm/ADT/SmallPtrSet.h"
1919
#include "llvm/ADT/SmallVector.h"
2020
#include "llvm/CodeGen/CallingConvLower.h"
21+
#include "llvm/CodeGen/MIRYamlMapping.h"
2122
#include "llvm/CodeGen/MachineFunction.h"
2223
#include "llvm/CodeGen/TargetFrameLowering.h"
2324
#include "llvm/IR/Function.h"
@@ -26,6 +27,10 @@
2627

2728
namespace llvm {
2829

30+
namespace yaml {
31+
struct AArch64FunctionInfo;
32+
} // end namespace yaml
33+
2934
class MachineInstr;
3035

3136
/// AArch64FunctionInfo - This class is derived from MachineFunctionInfo and
@@ -137,6 +142,7 @@ class AArch64FunctionInfo final : public MachineFunctionInfo {
137142
if (MF.getFunction().hasFnAttribute(Attribute::NoRedZone))
138143
HasRedZone = false;
139144
}
145+
void initializeBaseYamlFields(const yaml::AArch64FunctionInfo &YamlMFI);
140146

141147
unsigned getBytesInStackArgArea() const { return BytesInStackArgArea; }
142148
void setBytesInStackArgArea(unsigned bytes) { BytesInStackArgArea = bytes; }
@@ -333,6 +339,25 @@ class AArch64FunctionInfo final : public MachineFunctionInfo {
333339
DenseMap<int, std::pair<unsigned, MCSymbol *>> JumpTableEntryInfo;
334340
};
335341

342+
namespace yaml {
343+
struct AArch64FunctionInfo final : public yaml::MachineFunctionInfo {
344+
Optional<bool> HasRedZone;
345+
346+
AArch64FunctionInfo() = default;
347+
AArch64FunctionInfo(const llvm::AArch64FunctionInfo &MFI);
348+
349+
void mappingImpl(yaml::IO &YamlIO) override;
350+
~AArch64FunctionInfo() = default;
351+
};
352+
353+
template <> struct MappingTraits<AArch64FunctionInfo> {
354+
static void mapping(IO &YamlIO, AArch64FunctionInfo &MFI) {
355+
YamlIO.mapOptional("hasRedZone", MFI.HasRedZone);
356+
}
357+
};
358+
359+
} // end namespace yaml
360+
336361
} // end namespace llvm
337362

338363
#endif // LLVM_LIB_TARGET_AARCH64_AARCH64MACHINEFUNCTIONINFO_H

llvm/lib/Target/AArch64/AArch64TargetMachine.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "AArch64TargetMachine.h"
1313
#include "AArch64.h"
14+
#include "AArch64MachineFunctionInfo.h"
1415
#include "AArch64MacroFusion.h"
1516
#include "AArch64Subtarget.h"
1617
#include "AArch64TargetObjectFile.h"
@@ -26,6 +27,7 @@
2627
#include "llvm/CodeGen/GlobalISel/Legalizer.h"
2728
#include "llvm/CodeGen/GlobalISel/Localizer.h"
2829
#include "llvm/CodeGen/GlobalISel/RegBankSelect.h"
30+
#include "llvm/CodeGen/MIRParser/MIParser.h"
2931
#include "llvm/CodeGen/MachineScheduler.h"
3032
#include "llvm/CodeGen/Passes.h"
3133
#include "llvm/CodeGen/TargetPassConfig.h"
@@ -661,3 +663,24 @@ void AArch64PassConfig::addPreEmitPass() {
661663
// SVE bundles move prefixes with destructive operations.
662664
addPass(createUnpackMachineBundles(nullptr));
663665
}
666+
667+
yaml::MachineFunctionInfo *
668+
AArch64TargetMachine::createDefaultFuncInfoYAML() const {
669+
return new yaml::AArch64FunctionInfo();
670+
}
671+
672+
yaml::MachineFunctionInfo *
673+
AArch64TargetMachine::convertFuncInfoToYAML(const MachineFunction &MF) const {
674+
const auto *MFI = MF.getInfo<AArch64FunctionInfo>();
675+
return new yaml::AArch64FunctionInfo(*MFI);
676+
}
677+
678+
bool AArch64TargetMachine::parseMachineFunctionInfo(
679+
const yaml::MachineFunctionInfo &MFI, PerFunctionMIParsingState &PFS,
680+
SMDiagnostic &Error, SMRange &SourceRange) const {
681+
const auto &YamlMFI =
682+
reinterpret_cast<const yaml::AArch64FunctionInfo &>(MFI);
683+
MachineFunction &MF = PFS.MF;
684+
MF.getInfo<AArch64FunctionInfo>()->initializeBaseYamlFields(YamlMFI);
685+
return false;
686+
}

llvm/lib/Target/AArch64/AArch64TargetMachine.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@ class AArch64TargetMachine : public LLVMTargetMachine {
4949
return TLOF.get();
5050
}
5151

52+
yaml::MachineFunctionInfo *createDefaultFuncInfoYAML() const override;
53+
yaml::MachineFunctionInfo *
54+
convertFuncInfoToYAML(const MachineFunction &MF) const override;
55+
bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &,
56+
PerFunctionMIParsingState &PFS,
57+
SMDiagnostic &Error,
58+
SMRange &SourceRange) const override;
59+
5260
private:
5361
bool isLittle;
5462
};

llvm/lib/Target/AArch64/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ add_llvm_target(AArch64CodeGen
4848
AArch64InstructionSelector.cpp
4949
AArch64LegalizerInfo.cpp
5050
AArch64LoadStoreOptimizer.cpp
51+
AArch64MachineFunctionInfo.cpp
5152
AArch64MacroFusion.cpp
5253
AArch64MCInstLower.cpp
5354
AArch64PreLegalizerCombiner.cpp
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
; RUN: llc -mtriple=aarch64--- --verify-machineinstrs -stop-before=finalize-isel -simplify-mir -o - < %s | FileCheck %s
2+
3+
; Here we check thatt the noredzone attribute is carried through the machine
4+
; IR generation and is put in MachineFunctionInfo
5+
6+
define void @baz() {
7+
entry:
8+
; CHECK-LABEL: name: baz
9+
; CHECK: machineFunctionInfo: {}
10+
ret void
11+
}
12+
13+
define void @bar() #0 {
14+
entry:
15+
; CHECK-LABEL: name: bar
16+
; CHECK: machineFunctionInfo:
17+
; CHECK-NEXT: hasRedZone: false
18+
ret void
19+
}
20+
21+
attributes #0 = { noredzone }
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# RUN: llc -mtriple=aarch64--- --verify-machineinstrs -simplify-mir -run-pass none %s -o - | FileCheck %s
2+
3+
# This test checks for persistence of the hasRedZone attribute through a
4+
# llc transformation that shouldn't do anything
5+
6+
# CHECK-NAME: name: foo
7+
# CHECK-LABEL: machineFunctionInfo: {}
8+
9+
---
10+
name: foo
11+
alignment: 4
12+
tracksRegLiveness: true
13+
frameInfo:
14+
maxAlignment: 1
15+
maxCallFrameSize: 0
16+
machineFunctionInfo: {}
17+
body: |
18+
bb.0.entry:
19+
RET_ReallyLR
20+
21+
...
22+
23+
# CHECK-LABEL: name: bar
24+
# CHECK: machineFunctionInfo:
25+
# CHECK-NEXT: hasRedZone: false
26+
27+
---
28+
name: bar
29+
alignment: 4
30+
tracksRegLiveness: true
31+
frameInfo:
32+
maxAlignment: 1
33+
maxCallFrameSize: 0
34+
machineFunctionInfo:
35+
hasRedZone: false
36+
body: |
37+
bb.0:
38+
RET_ReallyLR
39+
40+
...
41+
42+
# CHECK-LABEL: name: baz
43+
# CHECK: machineFunctionInfo:
44+
# CHECK-NEXT: hasRedZone: true
45+
46+
---
47+
name: baz
48+
alignment: 4
49+
tracksRegLiveness: true
50+
frameInfo:
51+
maxAlignment: 1
52+
maxCallFrameSize: 0
53+
machineFunctionInfo:
54+
hasRedZone: true
55+
body: |
56+
bb.0.entry:
57+
RET_ReallyLR
58+
59+
...

0 commit comments

Comments
 (0)