blob: cffe7dbfe6632c3d7f7243ea3b06655b45aa05e4 [file] [log] [blame]
Daniel Sanders34eac352018-10-03 02:21:30 +00001//=== lib/CodeGen/GlobalISel/AArch64PreLegalizerCombiner.cpp --------------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Daniel Sanders34eac352018-10-03 02:21:30 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This pass does combining of machine instructions at the generic MI level,
10// before the legalizer.
11//
12//===----------------------------------------------------------------------===//
13
14#include "AArch64TargetMachine.h"
15#include "llvm/CodeGen/GlobalISel/Combiner.h"
16#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
17#include "llvm/CodeGen/GlobalISel/CombinerInfo.h"
18#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
19#include "llvm/CodeGen/MachineFunctionPass.h"
20#include "llvm/CodeGen/TargetPassConfig.h"
21#include "llvm/Support/Debug.h"
22
23#define DEBUG_TYPE "aarch64-prelegalizer-combiner"
24
25using namespace llvm;
26using namespace MIPatternMatch;
27
28namespace {
29class AArch64PreLegalizerCombinerInfo : public CombinerInfo {
30public:
31 AArch64PreLegalizerCombinerInfo()
32 : CombinerInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
33 /*LegalizerInfo*/ nullptr) {}
Aditya Nandakumarf75d4f32018-12-05 20:14:52 +000034 virtual bool combine(GISelChangeObserver &Observer, MachineInstr &MI,
Daniel Sanders34eac352018-10-03 02:21:30 +000035 MachineIRBuilder &B) const override;
36};
37
Aditya Nandakumarf75d4f32018-12-05 20:14:52 +000038bool AArch64PreLegalizerCombinerInfo::combine(GISelChangeObserver &Observer,
Daniel Sanders34eac352018-10-03 02:21:30 +000039 MachineInstr &MI,
40 MachineIRBuilder &B) const {
41 CombinerHelper Helper(Observer, B);
42
43 switch (MI.getOpcode()) {
44 default:
45 return false;
46 case TargetOpcode::G_LOAD:
47 case TargetOpcode::G_SEXTLOAD:
48 case TargetOpcode::G_ZEXTLOAD:
49 return Helper.tryCombineExtendingLoads(MI);
50 }
51
52 return false;
53}
54
55// Pass boilerplate
56// ================
57
58class AArch64PreLegalizerCombiner : public MachineFunctionPass {
59public:
60 static char ID;
61
62 AArch64PreLegalizerCombiner();
63
64 StringRef getPassName() const override { return "AArch64PreLegalizerCombiner"; }
65
66 bool runOnMachineFunction(MachineFunction &MF) override;
67
68 void getAnalysisUsage(AnalysisUsage &AU) const override;
69};
70}
71
72void AArch64PreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
73 AU.addRequired<TargetPassConfig>();
74 AU.setPreservesCFG();
75 getSelectionDAGFallbackAnalysisUsage(AU);
76 MachineFunctionPass::getAnalysisUsage(AU);
77}
78
79AArch64PreLegalizerCombiner::AArch64PreLegalizerCombiner() : MachineFunctionPass(ID) {
80 initializeAArch64PreLegalizerCombinerPass(*PassRegistry::getPassRegistry());
81}
82
83bool AArch64PreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
84 if (MF.getProperties().hasProperty(
85 MachineFunctionProperties::Property::FailedISel))
86 return false;
87 auto *TPC = &getAnalysis<TargetPassConfig>();
88 AArch64PreLegalizerCombinerInfo PCInfo;
89 Combiner C(PCInfo, TPC);
Aditya Nandakumar500e3ea2019-01-16 00:40:37 +000090 return C.combineMachineInstrs(MF, /*CSEInfo*/ nullptr);
Daniel Sanders34eac352018-10-03 02:21:30 +000091}
92
93char AArch64PreLegalizerCombiner::ID = 0;
94INITIALIZE_PASS_BEGIN(AArch64PreLegalizerCombiner, DEBUG_TYPE,
95 "Combine AArch64 machine instrs before legalization",
96 false, false)
97INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
98INITIALIZE_PASS_END(AArch64PreLegalizerCombiner, DEBUG_TYPE,
99 "Combine AArch64 machine instrs before legalization", false,
100 false)
101
102
103namespace llvm {
104FunctionPass *createAArch64PreLegalizeCombiner() {
105 return new AArch64PreLegalizerCombiner();
106}
107} // end namespace llvm