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