xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/CombinerHelperArtifacts.cpp (revision 700637cbb5e582861067a11aaca4d053546871d2)
1*700637cbSDimitry Andric //===- CombinerHelperArtifacts.cpp-----------------------------------------===//
2*700637cbSDimitry Andric //
3*700637cbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*700637cbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*700637cbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*700637cbSDimitry Andric //
7*700637cbSDimitry Andric //===----------------------------------------------------------------------===//
8*700637cbSDimitry Andric //
9*700637cbSDimitry Andric // This file implements CombinerHelper for legalization artifacts.
10*700637cbSDimitry Andric //
11*700637cbSDimitry Andric //===----------------------------------------------------------------------===//
12*700637cbSDimitry Andric //
13*700637cbSDimitry Andric // G_MERGE_VALUES
14*700637cbSDimitry Andric //
15*700637cbSDimitry Andric //===----------------------------------------------------------------------===//
16*700637cbSDimitry Andric #include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
17*700637cbSDimitry Andric #include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
18*700637cbSDimitry Andric #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
19*700637cbSDimitry Andric #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
20*700637cbSDimitry Andric #include "llvm/CodeGen/GlobalISel/Utils.h"
21*700637cbSDimitry Andric #include "llvm/CodeGen/MachineOperand.h"
22*700637cbSDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h"
23*700637cbSDimitry Andric #include "llvm/CodeGen/TargetOpcodes.h"
24*700637cbSDimitry Andric #include "llvm/Support/Casting.h"
25*700637cbSDimitry Andric 
26*700637cbSDimitry Andric #define DEBUG_TYPE "gi-combiner"
27*700637cbSDimitry Andric 
28*700637cbSDimitry Andric using namespace llvm;
29*700637cbSDimitry Andric 
matchMergeXAndUndef(const MachineInstr & MI,BuildFnTy & MatchInfo) const30*700637cbSDimitry Andric bool CombinerHelper::matchMergeXAndUndef(const MachineInstr &MI,
31*700637cbSDimitry Andric                                          BuildFnTy &MatchInfo) const {
32*700637cbSDimitry Andric   const GMerge *Merge = cast<GMerge>(&MI);
33*700637cbSDimitry Andric 
34*700637cbSDimitry Andric   Register Dst = Merge->getReg(0);
35*700637cbSDimitry Andric   LLT DstTy = MRI.getType(Dst);
36*700637cbSDimitry Andric   LLT SrcTy = MRI.getType(Merge->getSourceReg(0));
37*700637cbSDimitry Andric 
38*700637cbSDimitry Andric   // Otherwise, we would miscompile.
39*700637cbSDimitry Andric   assert(Merge->getNumSources() == 2 && "Unexpected number of operands");
40*700637cbSDimitry Andric 
41*700637cbSDimitry Andric   //
42*700637cbSDimitry Andric   //   %bits_8_15:_(s8) = G_IMPLICIT_DEF
43*700637cbSDimitry Andric   //   %0:_(s16) = G_MERGE_VALUES %bits_0_7:(s8), %bits_8_15:(s8)
44*700637cbSDimitry Andric   //
45*700637cbSDimitry Andric   // ->
46*700637cbSDimitry Andric   //
47*700637cbSDimitry Andric   //   %0:_(s16) = G_ANYEXT %bits_0_7:(s8)
48*700637cbSDimitry Andric   //
49*700637cbSDimitry Andric 
50*700637cbSDimitry Andric   if (!isLegalOrBeforeLegalizer({TargetOpcode::G_ANYEXT, {DstTy, SrcTy}}))
51*700637cbSDimitry Andric     return false;
52*700637cbSDimitry Andric 
53*700637cbSDimitry Andric   MatchInfo = [=](MachineIRBuilder &B) {
54*700637cbSDimitry Andric     B.buildAnyExt(Dst, Merge->getSourceReg(0));
55*700637cbSDimitry Andric   };
56*700637cbSDimitry Andric   return true;
57*700637cbSDimitry Andric }
58*700637cbSDimitry Andric 
matchMergeXAndZero(const MachineInstr & MI,BuildFnTy & MatchInfo) const59*700637cbSDimitry Andric bool CombinerHelper::matchMergeXAndZero(const MachineInstr &MI,
60*700637cbSDimitry Andric                                         BuildFnTy &MatchInfo) const {
61*700637cbSDimitry Andric   const GMerge *Merge = cast<GMerge>(&MI);
62*700637cbSDimitry Andric 
63*700637cbSDimitry Andric   Register Dst = Merge->getReg(0);
64*700637cbSDimitry Andric   LLT DstTy = MRI.getType(Dst);
65*700637cbSDimitry Andric   LLT SrcTy = MRI.getType(Merge->getSourceReg(0));
66*700637cbSDimitry Andric 
67*700637cbSDimitry Andric   // No multi-use check. It is a constant.
68*700637cbSDimitry Andric 
69*700637cbSDimitry Andric   //
70*700637cbSDimitry Andric   //   %bits_8_15:_(s8) = G_CONSTANT i8 0
71*700637cbSDimitry Andric   //   %0:_(s16) = G_MERGE_VALUES %bits_0_7:(s8), %bits_8_15:(s8)
72*700637cbSDimitry Andric   //
73*700637cbSDimitry Andric   // ->
74*700637cbSDimitry Andric   //
75*700637cbSDimitry Andric   //   %0:_(s16) = G_ZEXT %bits_0_7:(s8)
76*700637cbSDimitry Andric   //
77*700637cbSDimitry Andric 
78*700637cbSDimitry Andric   if (!isLegalOrBeforeLegalizer({TargetOpcode::G_ZEXT, {DstTy, SrcTy}}))
79*700637cbSDimitry Andric     return false;
80*700637cbSDimitry Andric 
81*700637cbSDimitry Andric   MatchInfo = [=](MachineIRBuilder &B) {
82*700637cbSDimitry Andric     B.buildZExt(Dst, Merge->getSourceReg(0));
83*700637cbSDimitry Andric   };
84*700637cbSDimitry Andric   return true;
85*700637cbSDimitry Andric }
86