//===- CombinerHelperArtifacts.cpp-----------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements CombinerHelper for legalization artifacts. // //===----------------------------------------------------------------------===// // // G_MERGE_VALUES // //===----------------------------------------------------------------------===// #include "llvm/CodeGen/GlobalISel/CombinerHelper.h" #include "llvm/CodeGen/GlobalISel/LegalizerHelper.h" #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h" #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" #include "llvm/CodeGen/GlobalISel/Utils.h" #include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/TargetOpcodes.h" #include "llvm/Support/Casting.h" #define DEBUG_TYPE "gi-combiner" using namespace llvm; bool CombinerHelper::matchMergeXAndUndef(const MachineInstr &MI, BuildFnTy &MatchInfo) const { const GMerge *Merge = cast(&MI); Register Dst = Merge->getReg(0); LLT DstTy = MRI.getType(Dst); LLT SrcTy = MRI.getType(Merge->getSourceReg(0)); // Otherwise, we would miscompile. assert(Merge->getNumSources() == 2 && "Unexpected number of operands"); // // %bits_8_15:_(s8) = G_IMPLICIT_DEF // %0:_(s16) = G_MERGE_VALUES %bits_0_7:(s8), %bits_8_15:(s8) // // -> // // %0:_(s16) = G_ANYEXT %bits_0_7:(s8) // if (!isLegalOrBeforeLegalizer({TargetOpcode::G_ANYEXT, {DstTy, SrcTy}})) return false; MatchInfo = [=](MachineIRBuilder &B) { B.buildAnyExt(Dst, Merge->getSourceReg(0)); }; return true; } bool CombinerHelper::matchMergeXAndZero(const MachineInstr &MI, BuildFnTy &MatchInfo) const { const GMerge *Merge = cast(&MI); Register Dst = Merge->getReg(0); LLT DstTy = MRI.getType(Dst); LLT SrcTy = MRI.getType(Merge->getSourceReg(0)); // No multi-use check. It is a constant. // // %bits_8_15:_(s8) = G_CONSTANT i8 0 // %0:_(s16) = G_MERGE_VALUES %bits_0_7:(s8), %bits_8_15:(s8) // // -> // // %0:_(s16) = G_ZEXT %bits_0_7:(s8) // if (!isLegalOrBeforeLegalizer({TargetOpcode::G_ZEXT, {DstTy, SrcTy}})) return false; MatchInfo = [=](MachineIRBuilder &B) { B.buildZExt(Dst, Merge->getSourceReg(0)); }; return true; }