Skip to content

Commit 2ca300f

Browse files
author
Thorsten Schütt
authored
[GlobalIsel][NFC] Move cast code (#100196)
Preparation for more cast combines
1 parent cd1a2ed commit 2ca300f

File tree

3 files changed

+116
-89
lines changed

3 files changed

+116
-89
lines changed

llvm/lib/CodeGen/GlobalISel/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ add_llvm_component_library(LLVMGlobalISel
66
GlobalISel.cpp
77
Combiner.cpp
88
CombinerHelper.cpp
9+
CombinerHelperCasts.cpp
910
CombinerHelperVectorOps.cpp
1011
GIMatchTableExecutor.cpp
1112
GISelChangeObserver.cpp

llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp

Lines changed: 0 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -7457,92 +7457,3 @@ void CombinerHelper::applyExpandFPowI(MachineInstr &MI, int64_t Exponent) {
74577457
Builder.buildCopy(Dst, *Res);
74587458
MI.eraseFromParent();
74597459
}
7460-
7461-
bool CombinerHelper::matchSextOfTrunc(const MachineOperand &MO,
7462-
BuildFnTy &MatchInfo) {
7463-
GSext *Sext = cast<GSext>(getDefIgnoringCopies(MO.getReg(), MRI));
7464-
GTrunc *Trunc = cast<GTrunc>(getDefIgnoringCopies(Sext->getSrcReg(), MRI));
7465-
7466-
Register Dst = Sext->getReg(0);
7467-
Register Src = Trunc->getSrcReg();
7468-
7469-
LLT DstTy = MRI.getType(Dst);
7470-
LLT SrcTy = MRI.getType(Src);
7471-
7472-
if (DstTy == SrcTy) {
7473-
MatchInfo = [=](MachineIRBuilder &B) { B.buildCopy(Dst, Src); };
7474-
return true;
7475-
}
7476-
7477-
if (DstTy.getScalarSizeInBits() < SrcTy.getScalarSizeInBits() &&
7478-
isLegalOrBeforeLegalizer({TargetOpcode::G_TRUNC, {DstTy, SrcTy}})) {
7479-
MatchInfo = [=](MachineIRBuilder &B) {
7480-
B.buildTrunc(Dst, Src, MachineInstr::MIFlag::NoSWrap);
7481-
};
7482-
return true;
7483-
}
7484-
7485-
if (DstTy.getScalarSizeInBits() > SrcTy.getScalarSizeInBits() &&
7486-
isLegalOrBeforeLegalizer({TargetOpcode::G_SEXT, {DstTy, SrcTy}})) {
7487-
MatchInfo = [=](MachineIRBuilder &B) { B.buildSExt(Dst, Src); };
7488-
return true;
7489-
}
7490-
7491-
return false;
7492-
}
7493-
7494-
bool CombinerHelper::matchZextOfTrunc(const MachineOperand &MO,
7495-
BuildFnTy &MatchInfo) {
7496-
GZext *Zext = cast<GZext>(getDefIgnoringCopies(MO.getReg(), MRI));
7497-
GTrunc *Trunc = cast<GTrunc>(getDefIgnoringCopies(Zext->getSrcReg(), MRI));
7498-
7499-
Register Dst = Zext->getReg(0);
7500-
Register Src = Trunc->getSrcReg();
7501-
7502-
LLT DstTy = MRI.getType(Dst);
7503-
LLT SrcTy = MRI.getType(Src);
7504-
7505-
if (DstTy == SrcTy) {
7506-
MatchInfo = [=](MachineIRBuilder &B) { B.buildCopy(Dst, Src); };
7507-
return true;
7508-
}
7509-
7510-
if (DstTy.getScalarSizeInBits() < SrcTy.getScalarSizeInBits() &&
7511-
isLegalOrBeforeLegalizer({TargetOpcode::G_TRUNC, {DstTy, SrcTy}})) {
7512-
MatchInfo = [=](MachineIRBuilder &B) {
7513-
B.buildTrunc(Dst, Src, MachineInstr::MIFlag::NoUWrap);
7514-
};
7515-
return true;
7516-
}
7517-
7518-
if (DstTy.getScalarSizeInBits() > SrcTy.getScalarSizeInBits() &&
7519-
isLegalOrBeforeLegalizer({TargetOpcode::G_ZEXT, {DstTy, SrcTy}})) {
7520-
MatchInfo = [=](MachineIRBuilder &B) {
7521-
B.buildZExt(Dst, Src, MachineInstr::MIFlag::NonNeg);
7522-
};
7523-
return true;
7524-
}
7525-
7526-
return false;
7527-
}
7528-
7529-
bool CombinerHelper::matchNonNegZext(const MachineOperand &MO,
7530-
BuildFnTy &MatchInfo) {
7531-
GZext *Zext = cast<GZext>(MRI.getVRegDef(MO.getReg()));
7532-
7533-
Register Dst = Zext->getReg(0);
7534-
Register Src = Zext->getSrcReg();
7535-
7536-
LLT DstTy = MRI.getType(Dst);
7537-
LLT SrcTy = MRI.getType(Src);
7538-
const auto &TLI = getTargetLowering();
7539-
7540-
// Convert zext nneg to sext if sext is the preferred form for the target.
7541-
if (isLegalOrBeforeLegalizer({TargetOpcode::G_SEXT, {DstTy, SrcTy}}) &&
7542-
TLI.isSExtCheaperThanZExt(getMVTForLLT(SrcTy), getMVTForLLT(DstTy))) {
7543-
MatchInfo = [=](MachineIRBuilder &B) { B.buildSExt(Dst, Src); };
7544-
return true;
7545-
}
7546-
7547-
return false;
7548-
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
//===- CombinerHelperCasts.cpp---------------------------------------------===//
2+
//
3+
// 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
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file implements CombinerHelper for G_ANYEXT, G_SEXT, G_TRUNC, and
10+
// G_ZEXT
11+
//
12+
//===----------------------------------------------------------------------===//
13+
#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
14+
#include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
15+
#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
16+
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
17+
#include "llvm/CodeGen/GlobalISel/Utils.h"
18+
#include "llvm/CodeGen/LowLevelTypeUtils.h"
19+
#include "llvm/CodeGen/MachineOperand.h"
20+
#include "llvm/CodeGen/MachineRegisterInfo.h"
21+
#include "llvm/CodeGen/TargetOpcodes.h"
22+
#include "llvm/Support/Casting.h"
23+
24+
#define DEBUG_TYPE "gi-combiner"
25+
26+
using namespace llvm;
27+
28+
bool CombinerHelper::matchSextOfTrunc(const MachineOperand &MO,
29+
BuildFnTy &MatchInfo) {
30+
GSext *Sext = cast<GSext>(getDefIgnoringCopies(MO.getReg(), MRI));
31+
GTrunc *Trunc = cast<GTrunc>(getDefIgnoringCopies(Sext->getSrcReg(), MRI));
32+
33+
Register Dst = Sext->getReg(0);
34+
Register Src = Trunc->getSrcReg();
35+
36+
LLT DstTy = MRI.getType(Dst);
37+
LLT SrcTy = MRI.getType(Src);
38+
39+
if (DstTy == SrcTy) {
40+
MatchInfo = [=](MachineIRBuilder &B) { B.buildCopy(Dst, Src); };
41+
return true;
42+
}
43+
44+
if (DstTy.getScalarSizeInBits() < SrcTy.getScalarSizeInBits() &&
45+
isLegalOrBeforeLegalizer({TargetOpcode::G_TRUNC, {DstTy, SrcTy}})) {
46+
MatchInfo = [=](MachineIRBuilder &B) {
47+
B.buildTrunc(Dst, Src, MachineInstr::MIFlag::NoSWrap);
48+
};
49+
return true;
50+
}
51+
52+
if (DstTy.getScalarSizeInBits() > SrcTy.getScalarSizeInBits() &&
53+
isLegalOrBeforeLegalizer({TargetOpcode::G_SEXT, {DstTy, SrcTy}})) {
54+
MatchInfo = [=](MachineIRBuilder &B) { B.buildSExt(Dst, Src); };
55+
return true;
56+
}
57+
58+
return false;
59+
}
60+
61+
bool CombinerHelper::matchZextOfTrunc(const MachineOperand &MO,
62+
BuildFnTy &MatchInfo) {
63+
GZext *Zext = cast<GZext>(getDefIgnoringCopies(MO.getReg(), MRI));
64+
GTrunc *Trunc = cast<GTrunc>(getDefIgnoringCopies(Zext->getSrcReg(), MRI));
65+
66+
Register Dst = Zext->getReg(0);
67+
Register Src = Trunc->getSrcReg();
68+
69+
LLT DstTy = MRI.getType(Dst);
70+
LLT SrcTy = MRI.getType(Src);
71+
72+
if (DstTy == SrcTy) {
73+
MatchInfo = [=](MachineIRBuilder &B) { B.buildCopy(Dst, Src); };
74+
return true;
75+
}
76+
77+
if (DstTy.getScalarSizeInBits() < SrcTy.getScalarSizeInBits() &&
78+
isLegalOrBeforeLegalizer({TargetOpcode::G_TRUNC, {DstTy, SrcTy}})) {
79+
MatchInfo = [=](MachineIRBuilder &B) {
80+
B.buildTrunc(Dst, Src, MachineInstr::MIFlag::NoUWrap);
81+
};
82+
return true;
83+
}
84+
85+
if (DstTy.getScalarSizeInBits() > SrcTy.getScalarSizeInBits() &&
86+
isLegalOrBeforeLegalizer({TargetOpcode::G_ZEXT, {DstTy, SrcTy}})) {
87+
MatchInfo = [=](MachineIRBuilder &B) {
88+
B.buildZExt(Dst, Src, MachineInstr::MIFlag::NonNeg);
89+
};
90+
return true;
91+
}
92+
93+
return false;
94+
}
95+
96+
bool CombinerHelper::matchNonNegZext(const MachineOperand &MO,
97+
BuildFnTy &MatchInfo) {
98+
GZext *Zext = cast<GZext>(MRI.getVRegDef(MO.getReg()));
99+
100+
Register Dst = Zext->getReg(0);
101+
Register Src = Zext->getSrcReg();
102+
103+
LLT DstTy = MRI.getType(Dst);
104+
LLT SrcTy = MRI.getType(Src);
105+
const auto &TLI = getTargetLowering();
106+
107+
// Convert zext nneg to sext if sext is the preferred form for the target.
108+
if (isLegalOrBeforeLegalizer({TargetOpcode::G_SEXT, {DstTy, SrcTy}}) &&
109+
TLI.isSExtCheaperThanZExt(getMVTForLLT(SrcTy), getMVTForLLT(DstTy))) {
110+
MatchInfo = [=](MachineIRBuilder &B) { B.buildSExt(Dst, Src); };
111+
return true;
112+
}
113+
114+
return false;
115+
}

0 commit comments

Comments
 (0)