xref: /llvm-project/llvm/lib/CodeGen/GlobalISel/CombinerHelperArtifacts.cpp (revision ee7ca0dddafb609090ad1789570c099d95c0afb6)
10e97b4d0SThorsten Schütt //===- CombinerHelperArtifacts.cpp-----------------------------------------===//
20e97b4d0SThorsten Schütt //
30e97b4d0SThorsten Schütt // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40e97b4d0SThorsten Schütt // See https://llvm.org/LICENSE.txt for license information.
50e97b4d0SThorsten Schütt // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60e97b4d0SThorsten Schütt //
70e97b4d0SThorsten Schütt //===----------------------------------------------------------------------===//
80e97b4d0SThorsten Schütt //
90e97b4d0SThorsten Schütt // This file implements CombinerHelper for legalization artifacts.
100e97b4d0SThorsten Schütt //
110e97b4d0SThorsten Schütt //===----------------------------------------------------------------------===//
120e97b4d0SThorsten Schütt //
130e97b4d0SThorsten Schütt // G_MERGE_VALUES
140e97b4d0SThorsten Schütt //
150e97b4d0SThorsten Schütt //===----------------------------------------------------------------------===//
160e97b4d0SThorsten Schütt #include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
170e97b4d0SThorsten Schütt #include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
180e97b4d0SThorsten Schütt #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
190e97b4d0SThorsten Schütt #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
200e97b4d0SThorsten Schütt #include "llvm/CodeGen/GlobalISel/Utils.h"
210e97b4d0SThorsten Schütt #include "llvm/CodeGen/LowLevelTypeUtils.h"
220e97b4d0SThorsten Schütt #include "llvm/CodeGen/MachineOperand.h"
230e97b4d0SThorsten Schütt #include "llvm/CodeGen/MachineRegisterInfo.h"
240e97b4d0SThorsten Schütt #include "llvm/CodeGen/TargetOpcodes.h"
250e97b4d0SThorsten Schütt #include "llvm/Support/Casting.h"
260e97b4d0SThorsten Schütt 
270e97b4d0SThorsten Schütt #define DEBUG_TYPE "gi-combiner"
280e97b4d0SThorsten Schütt 
290e97b4d0SThorsten Schütt using namespace llvm;
300e97b4d0SThorsten Schütt 
310e97b4d0SThorsten Schütt bool CombinerHelper::matchMergeXAndUndef(const MachineInstr &MI,
32*ee7ca0ddSPaul Bowen-Huggett                                          BuildFnTy &MatchInfo) const {
330e97b4d0SThorsten Schütt   const GMerge *Merge = cast<GMerge>(&MI);
340e97b4d0SThorsten Schütt 
350e97b4d0SThorsten Schütt   Register Dst = Merge->getReg(0);
360e97b4d0SThorsten Schütt   LLT DstTy = MRI.getType(Dst);
370e97b4d0SThorsten Schütt   LLT SrcTy = MRI.getType(Merge->getSourceReg(0));
380e97b4d0SThorsten Schütt 
390e97b4d0SThorsten Schütt   // Otherwise, we would miscompile.
400e97b4d0SThorsten Schütt   assert(Merge->getNumSources() == 2 && "Unexpected number of operands");
410e97b4d0SThorsten Schütt 
420e97b4d0SThorsten Schütt   //
430e97b4d0SThorsten Schütt   //   %bits_8_15:_(s8) = G_IMPLICIT_DEF
440e97b4d0SThorsten Schütt   //   %0:_(s16) = G_MERGE_VALUES %bits_0_7:(s8), %bits_8_15:(s8)
450e97b4d0SThorsten Schütt   //
460e97b4d0SThorsten Schütt   // ->
470e97b4d0SThorsten Schütt   //
480e97b4d0SThorsten Schütt   //   %0:_(s16) = G_ANYEXT %bits_0_7:(s8)
490e97b4d0SThorsten Schütt   //
500e97b4d0SThorsten Schütt 
510e97b4d0SThorsten Schütt   if (!isLegalOrBeforeLegalizer({TargetOpcode::G_ANYEXT, {DstTy, SrcTy}}))
520e97b4d0SThorsten Schütt     return false;
530e97b4d0SThorsten Schütt 
540e97b4d0SThorsten Schütt   MatchInfo = [=](MachineIRBuilder &B) {
550e97b4d0SThorsten Schütt     B.buildAnyExt(Dst, Merge->getSourceReg(0));
560e97b4d0SThorsten Schütt   };
570e97b4d0SThorsten Schütt   return true;
580e97b4d0SThorsten Schütt }
592906fcadSThorsten Schütt 
602906fcadSThorsten Schütt bool CombinerHelper::matchMergeXAndZero(const MachineInstr &MI,
61*ee7ca0ddSPaul Bowen-Huggett                                         BuildFnTy &MatchInfo) const {
622906fcadSThorsten Schütt   const GMerge *Merge = cast<GMerge>(&MI);
632906fcadSThorsten Schütt 
642906fcadSThorsten Schütt   Register Dst = Merge->getReg(0);
652906fcadSThorsten Schütt   LLT DstTy = MRI.getType(Dst);
662906fcadSThorsten Schütt   LLT SrcTy = MRI.getType(Merge->getSourceReg(0));
672906fcadSThorsten Schütt 
682906fcadSThorsten Schütt   // No multi-use check. It is a constant.
692906fcadSThorsten Schütt 
702906fcadSThorsten Schütt   //
712906fcadSThorsten Schütt   //   %bits_8_15:_(s8) = G_CONSTANT i8 0
722906fcadSThorsten Schütt   //   %0:_(s16) = G_MERGE_VALUES %bits_0_7:(s8), %bits_8_15:(s8)
732906fcadSThorsten Schütt   //
742906fcadSThorsten Schütt   // ->
752906fcadSThorsten Schütt   //
762906fcadSThorsten Schütt   //   %0:_(s16) = G_ZEXT %bits_0_7:(s8)
772906fcadSThorsten Schütt   //
782906fcadSThorsten Schütt 
792906fcadSThorsten Schütt   if (!isLegalOrBeforeLegalizer({TargetOpcode::G_ZEXT, {DstTy, SrcTy}}))
802906fcadSThorsten Schütt     return false;
812906fcadSThorsten Schütt 
822906fcadSThorsten Schütt   MatchInfo = [=](MachineIRBuilder &B) {
832906fcadSThorsten Schütt     B.buildZExt(Dst, Merge->getSourceReg(0));
842906fcadSThorsten Schütt   };
852906fcadSThorsten Schütt   return true;
862906fcadSThorsten Schütt }
87