Skip to content

Commit 0642fcb

Browse files
committed
[LoongArch][GlobalISel] Adding initial GlobalISel infrastructure
Add an initial GlobalISel skeleton for LoongArch. It can only run ir translator for `ret void`.
1 parent 7df28fd commit 0642fcb

16 files changed

+462
-1
lines changed

llvm/lib/Target/LoongArch/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,29 @@ tablegen(LLVM LoongArchGenAsmMatcher.inc -gen-asm-matcher)
66
tablegen(LLVM LoongArchGenAsmWriter.inc -gen-asm-writer)
77
tablegen(LLVM LoongArchGenDAGISel.inc -gen-dag-isel)
88
tablegen(LLVM LoongArchGenDisassemblerTables.inc -gen-disassembler)
9+
tablegen(LLVM LoongArchGenGlobalISel.inc -gen-global-isel)
910
tablegen(LLVM LoongArchGenInstrInfo.inc -gen-instr-info)
1011
tablegen(LLVM LoongArchGenMCPseudoLowering.inc -gen-pseudo-lowering)
1112
tablegen(LLVM LoongArchGenMCCodeEmitter.inc -gen-emitter)
13+
tablegen(LLVM LoongArchGenRegisterBank.inc -gen-register-bank)
1214
tablegen(LLVM LoongArchGenRegisterInfo.inc -gen-register-info)
1315
tablegen(LLVM LoongArchGenSubtargetInfo.inc -gen-subtarget)
1416

1517
add_public_tablegen_target(LoongArchCommonTableGen)
1618

1719
add_llvm_target(LoongArchCodeGen
1820
LoongArchAsmPrinter.cpp
21+
LoongArchCallLowering.cpp
1922
LoongArchExpandAtomicPseudoInsts.cpp
2023
LoongArchExpandPseudoInsts.cpp
2124
LoongArchFrameLowering.cpp
2225
LoongArchInstrInfo.cpp
26+
LoongArchInstructionSelector.cpp
2327
LoongArchISelDAGToDAG.cpp
2428
LoongArchISelLowering.cpp
29+
LoongArchLegalizerInfo.cpp
2530
LoongArchMCInstLower.cpp
31+
LoongArchRegisterBankInfo.cpp
2632
LoongArchRegisterInfo.cpp
2733
LoongArchSubtarget.cpp
2834
LoongArchTargetMachine.cpp
@@ -42,6 +48,7 @@ add_llvm_target(LoongArchCodeGen
4248
Support
4349
Target
4450
TargetParser
51+
GlobalISel
4552

4653
ADD_TO_COMPONENT
4754
LoongArch

llvm/lib/Target/LoongArch/LoongArch.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@
2020
namespace llvm {
2121
class AsmPrinter;
2222
class FunctionPass;
23+
class InstructionSelector;
2324
class LoongArchTargetMachine;
25+
class LoongArchRegisterBankInfo;
26+
class LoongArchSubtarget;
2427
class MCInst;
2528
class MCOperand;
2629
class MachineInstr;
@@ -41,6 +44,11 @@ void initializeLoongArchDAGToDAGISelPass(PassRegistry &);
4144
void initializeLoongArchExpandAtomicPseudoPass(PassRegistry &);
4245
void initializeLoongArchPreRAExpandPseudoPass(PassRegistry &);
4346
void initializeLoongArchExpandPseudoPass(PassRegistry &);
47+
48+
InstructionSelector *
49+
createLoongArchInstructionSelector(const LoongArchTargetMachine &,
50+
LoongArchSubtarget &,
51+
LoongArchRegisterBankInfo &);
4452
} // end namespace llvm
4553

4654
#endif // LLVM_LIB_TARGET_LOONGARCH_LOONGARCH_H

llvm/lib/Target/LoongArch/LoongArch.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ def FeatureRelax
113113
include "LoongArchRegisterInfo.td"
114114
include "LoongArchCallingConv.td"
115115
include "LoongArchInstrInfo.td"
116+
include "LoongArchRegisterBanks.td"
116117

117118
//===----------------------------------------------------------------------===//
118119
// LoongArch processors supported.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//===-- LoongArchCallLowering.cpp - Call lowering -------------------*- C++
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 the lowering of LLVM calls to machine code calls for
12+
/// GlobalISel.
13+
//
14+
//===----------------------------------------------------------------------===//
15+
16+
#include "LoongArchCallLowering.h"
17+
#include "LoongArchISelLowering.h"
18+
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
19+
20+
using namespace llvm;
21+
22+
LoongArchCallLowering::LoongArchCallLowering(const LoongArchTargetLowering &TLI)
23+
: CallLowering(&TLI) {}
24+
25+
bool LoongArchCallLowering::lowerReturn(MachineIRBuilder &MIRBuilder,
26+
const Value *Val,
27+
ArrayRef<Register> VRegs,
28+
FunctionLoweringInfo &FLI,
29+
Register SwiftErrorVReg) const {
30+
31+
MachineInstrBuilder Ret = MIRBuilder.buildInstrNoInsert(LoongArch::PseudoRET);
32+
33+
if (Val != nullptr) {
34+
return false;
35+
}
36+
MIRBuilder.insertInstr(Ret);
37+
return true;
38+
}
39+
40+
bool LoongArchCallLowering::lowerFormalArguments(
41+
MachineIRBuilder &MIRBuilder, const Function &F,
42+
ArrayRef<ArrayRef<Register>> VRegs, FunctionLoweringInfo &FLI) const {
43+
44+
if (F.arg_empty())
45+
return true;
46+
47+
return false;
48+
}
49+
50+
bool LoongArchCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
51+
CallLoweringInfo &Info) const {
52+
return false;
53+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//===-- LoongArchCallLowering.h - Call lowering ---------------------*- C++
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 describes how to lower LLVM calls to machine code calls.
12+
//
13+
//===----------------------------------------------------------------------===//
14+
15+
#ifndef LLVM_LIB_TARGET_LoongArch_LoongArchCALLLOWERING_H
16+
#define LLVM_LIB_TARGET_LoongArch_LoongArchCALLLOWERING_H
17+
18+
#include "llvm/CodeGen/CallingConvLower.h"
19+
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
20+
#include "llvm/CodeGen/ValueTypes.h"
21+
22+
namespace llvm {
23+
24+
class LoongArchTargetLowering;
25+
26+
class LoongArchCallLowering : public CallLowering {
27+
28+
public:
29+
LoongArchCallLowering(const LoongArchTargetLowering &TLI);
30+
31+
bool lowerReturn(MachineIRBuilder &MIRBuiler, const Value *Val,
32+
ArrayRef<Register> VRegs, FunctionLoweringInfo &FLI,
33+
Register SwiftErrorVReg) const override;
34+
35+
bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F,
36+
ArrayRef<ArrayRef<Register>> VRegs,
37+
FunctionLoweringInfo &FLI) const override;
38+
39+
bool lowerCall(MachineIRBuilder &MIRBuilder,
40+
CallLoweringInfo &Info) const override;
41+
};
42+
43+
} // end namespace llvm
44+
45+
#endif // LLVM_LIB_TARGET_LoongArch_LoongArchCALLLOWERING_H
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
//===-- LoongArchInstructionSelector.cpp -----------------------------*- C++
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+
/// \file
10+
/// This file implements the targeting of the InstructionSelector class for
11+
/// LoongArch.
12+
/// \todo This should be generated by TableGen.
13+
//===----------------------------------------------------------------------===//
14+
15+
#include "LoongArchRegisterBankInfo.h"
16+
#include "LoongArchSubtarget.h"
17+
#include "LoongArchTargetMachine.h"
18+
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
19+
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
20+
#include "llvm/IR/IntrinsicsLoongArch.h"
21+
#include "llvm/Support/Debug.h"
22+
23+
#define DEBUG_TYPE "loongarch-isel"
24+
25+
using namespace llvm;
26+
27+
#define GET_GLOBALISEL_PREDICATE_BITSET
28+
#include "LoongArchGenGlobalISel.inc"
29+
#undef GET_GLOBALISEL_PREDICATE_BITSET
30+
31+
namespace {
32+
33+
class LoongArchInstructionSelector : public InstructionSelector {
34+
public:
35+
LoongArchInstructionSelector(const LoongArchTargetMachine &TM,
36+
const LoongArchSubtarget &STI,
37+
const LoongArchRegisterBankInfo &RBI);
38+
39+
bool select(MachineInstr &I) override;
40+
static const char *getName() { return DEBUG_TYPE; }
41+
42+
private:
43+
bool selectImpl(MachineInstr &I, CodeGenCoverage &CoverageInfo) const;
44+
45+
const LoongArchSubtarget &STI;
46+
const LoongArchInstrInfo &TII;
47+
const LoongArchRegisterInfo &TRI;
48+
const LoongArchRegisterBankInfo &RBI;
49+
50+
// FIXME: This is necessary because DAGISel uses "Subtarget->" and GlobalISel
51+
// uses "STI." in the code generated by TableGen. We need to unify the name of
52+
// Subtarget variable.
53+
const LoongArchSubtarget *Subtarget = &STI;
54+
55+
#define GET_GLOBALISEL_PREDICATES_DECL
56+
#include "LoongArchGenGlobalISel.inc"
57+
#undef GET_GLOBALISEL_PREDICATES_DECL
58+
59+
#define GET_GLOBALISEL_TEMPORARIES_DECL
60+
#include "LoongArchGenGlobalISel.inc"
61+
#undef GET_GLOBALISEL_TEMPORARIES_DECL
62+
};
63+
64+
} // end anonymous namespace
65+
66+
#define GET_GLOBALISEL_IMPL
67+
#include "LoongArchGenGlobalISel.inc"
68+
#undef GET_GLOBALISEL_IMPL
69+
70+
LoongArchInstructionSelector::LoongArchInstructionSelector(
71+
const LoongArchTargetMachine &TM, const LoongArchSubtarget &STI,
72+
const LoongArchRegisterBankInfo &RBI)
73+
: InstructionSelector(), STI(STI), TII(*STI.getInstrInfo()),
74+
TRI(*STI.getRegisterInfo()), RBI(RBI),
75+
76+
#define GET_GLOBALISEL_PREDICATES_INIT
77+
#include "LoongArchGenGlobalISel.inc"
78+
#undef GET_GLOBALISEL_PREDICATES_INIT
79+
#define GET_GLOBALISEL_TEMPORARIES_INIT
80+
#include "LoongArchGenGlobalISel.inc"
81+
#undef GET_GLOBALISEL_TEMPORARIES_INIT
82+
{
83+
}
84+
85+
bool LoongArchInstructionSelector::select(MachineInstr &I) {
86+
87+
if (!isPreISelGenericOpcode(I.getOpcode())) {
88+
// Certain non-generic instructions also need some special handling.
89+
return true;
90+
}
91+
92+
if (selectImpl(I, *CoverageInfo))
93+
return true;
94+
95+
return false;
96+
}
97+
98+
namespace llvm {
99+
InstructionSelector *
100+
createLoongArchInstructionSelector(const LoongArchTargetMachine &TM,
101+
LoongArchSubtarget &Subtarget,
102+
LoongArchRegisterBankInfo &RBI) {
103+
return new LoongArchInstructionSelector(TM, Subtarget, RBI);
104+
}
105+
} // end namespace llvm
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//===-- LoongArchLegalizerInfo.cpp ----------------------------------*- C++
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+
/// \file
10+
/// This file implements the targeting of the Machinelegalizer class for
11+
/// LoongArch. \todo This should be generated by TableGen.
12+
//===----------------------------------------------------------------------===//
13+
14+
#include "LoongArchLegalizerInfo.h"
15+
#include "llvm/CodeGen/TargetOpcodes.h"
16+
#include "llvm/CodeGen/ValueTypes.h"
17+
#include "llvm/IR/DerivedTypes.h"
18+
#include "llvm/IR/Type.h"
19+
20+
using namespace llvm;
21+
22+
LoongArchLegalizerInfo::LoongArchLegalizerInfo(const LoongArchSubtarget &ST) {
23+
getLegacyLegalizerInfo().computeTables();
24+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//===-- LoongArchLegalizerInfo.h ------------------------------------*- C++
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+
/// \file
10+
/// This file declares the targeting of the Machinelegalizer class for
11+
/// LoongArch. \todo This should be generated by TableGen.
12+
//===----------------------------------------------------------------------===//
13+
14+
#ifndef LLVM_LIB_TARGET_LoongArch_LoongArchMACHINELEGALIZER_H
15+
#define LLVM_LIB_TARGET_LoongArch_LoongArchMACHINELEGALIZER_H
16+
17+
#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
18+
19+
namespace llvm {
20+
21+
class LoongArchSubtarget;
22+
23+
/// This class provides the information for the target register banks.
24+
class LoongArchLegalizerInfo : public LegalizerInfo {
25+
public:
26+
LoongArchLegalizerInfo(const LoongArchSubtarget &ST);
27+
};
28+
} // end namespace llvm
29+
#endif
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//===-- LoongArchRegisterBankInfo.cpp -------------------------------*- C++
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+
/// \file
10+
/// This file implements the targeting of the RegisterBankInfo class for
11+
/// LoongArch. \todo This should be generated by TableGen.
12+
//===----------------------------------------------------------------------===//
13+
14+
#include "LoongArchRegisterBankInfo.h"
15+
#include "MCTargetDesc/LoongArchMCTargetDesc.h"
16+
#include "llvm/CodeGen/MachineRegisterInfo.h"
17+
#include "llvm/CodeGen/RegisterBank.h"
18+
#include "llvm/CodeGen/RegisterBankInfo.h"
19+
#include "llvm/CodeGen/TargetRegisterInfo.h"
20+
21+
#define GET_TARGET_REGBANK_IMPL
22+
#include "LoongArchGenRegisterBank.inc"
23+
24+
using namespace llvm;
25+
26+
LoongArchRegisterBankInfo::LoongArchRegisterBankInfo(unsigned HwMode)
27+
: LoongArchGenRegisterBankInfo(HwMode) {}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//===-- LoongArchRegisterBankInfo.h ---------------------------------*- C++
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+
/// \file
10+
/// This file declares the targeting of the RegisterBankInfo class for
11+
/// LoongArch. \todo This should be generated by TableGen.
12+
//===----------------------------------------------------------------------===//
13+
14+
#ifndef LLVM_LIB_TARGET_LoongArch_LoongArchREGISTERBANKINFO_H
15+
#define LLVM_LIB_TARGET_LoongArch_LoongArchREGISTERBANKINFO_H
16+
17+
#include "llvm/CodeGen/RegisterBankInfo.h"
18+
19+
#define GET_REGBANK_DECLARATIONS
20+
#include "LoongArchGenRegisterBank.inc"
21+
22+
namespace llvm {
23+
24+
class TargetRegisterInfo;
25+
26+
class LoongArchGenRegisterBankInfo : public RegisterBankInfo {
27+
protected:
28+
#define GET_TARGET_REGBANK_CLASS
29+
#include "LoongArchGenRegisterBank.inc"
30+
};
31+
32+
/// This class provides the information for the target register banks.
33+
class LoongArchRegisterBankInfo final : public LoongArchGenRegisterBankInfo {
34+
public:
35+
LoongArchRegisterBankInfo(unsigned HwMode);
36+
};
37+
} // end namespace llvm
38+
#endif

0 commit comments

Comments
 (0)