diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2019-08-20 20:50:12 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2019-08-20 20:50:12 +0000 |
| commit | e6d1592492a3a379186bfb02bd0f4eda0669c0d5 (patch) | |
| tree | 599ab169a01f1c86eda9adc774edaedde2f2db5b /lib/Target/NVPTX | |
| parent | 1a56a5ead7a2e84bee8240f5f6b033b5f1707154 (diff) | |
Notes
Diffstat (limited to 'lib/Target/NVPTX')
57 files changed, 835 insertions, 717 deletions
diff --git a/lib/Target/NVPTX/MCTargetDesc/NVPTXBaseInfo.h b/lib/Target/NVPTX/MCTargetDesc/NVPTXBaseInfo.h index 1cb92005979d..815b600fe93a 100644 --- a/lib/Target/NVPTX/MCTargetDesc/NVPTXBaseInfo.h +++ b/lib/Target/NVPTX/MCTargetDesc/NVPTXBaseInfo.h @@ -1,9 +1,8 @@ //===-- NVPTXBaseInfo.h - Top-level definitions for NVPTX -------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/InstPrinter/NVPTXInstPrinter.cpp b/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.cpp index b774fe169d71..b6eefe206268 100644 --- a/lib/Target/NVPTX/InstPrinter/NVPTXInstPrinter.cpp +++ b/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.cpp @@ -1,9 +1,8 @@ //===-- NVPTXInstPrinter.cpp - PTX assembly instruction printing ----------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -11,7 +10,7 @@ // //===----------------------------------------------------------------------===// -#include "InstPrinter/NVPTXInstPrinter.h" +#include "MCTargetDesc/NVPTXInstPrinter.h" #include "MCTargetDesc/NVPTXBaseInfo.h" #include "NVPTX.h" #include "llvm/MC/MCExpr.h" @@ -270,6 +269,20 @@ void NVPTXInstPrinter::printLdStCode(const MCInst *MI, int OpNum, llvm_unreachable("Empty Modifier"); } +void NVPTXInstPrinter::printMmaCode(const MCInst *MI, int OpNum, raw_ostream &O, + const char *Modifier) { + const MCOperand &MO = MI->getOperand(OpNum); + int Imm = (int)MO.getImm(); + if (Modifier == nullptr || strcmp(Modifier, "version") == 0) { + O << Imm; // Just print out PTX version + } else if (strcmp(Modifier, "aligned") == 0) { + // PTX63 requires '.aligned' in the name of the instruction. + if (Imm >= 63) + O << ".aligned"; + } else + llvm_unreachable("Unknown Modifier"); +} + void NVPTXInstPrinter::printMemOperand(const MCInst *MI, int OpNum, raw_ostream &O, const char *Modifier) { printOperand(MI, OpNum, O); diff --git a/lib/Target/NVPTX/InstPrinter/NVPTXInstPrinter.h b/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.h index f0f223aa057b..c38472925a29 100644 --- a/lib/Target/NVPTX/InstPrinter/NVPTXInstPrinter.h +++ b/lib/Target/NVPTX/MCTargetDesc/NVPTXInstPrinter.h @@ -1,9 +1,8 @@ //= NVPTXInstPrinter.h - Convert NVPTX MCInst to assembly syntax --*- C++ -*-=// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -11,8 +10,8 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_LIB_TARGET_NVPTX_INSTPRINTER_NVPTXINSTPRINTER_H -#define LLVM_LIB_TARGET_NVPTX_INSTPRINTER_NVPTXINSTPRINTER_H +#ifndef LLVM_LIB_TARGET_NVPTX_MCTARGETDESC_NVPTXINSTPRINTER_H +#define LLVM_LIB_TARGET_NVPTX_MCTARGETDESC_NVPTXINSTPRINTER_H #include "llvm/MC/MCInstPrinter.h" @@ -41,6 +40,8 @@ public: const char *Modifier = nullptr); void printLdStCode(const MCInst *MI, int OpNum, raw_ostream &O, const char *Modifier = nullptr); + void printMmaCode(const MCInst *MI, int OpNum, raw_ostream &O, + const char *Modifier = nullptr); void printMemOperand(const MCInst *MI, int OpNum, raw_ostream &O, const char *Modifier = nullptr); void printProtoIdent(const MCInst *MI, int OpNum, diff --git a/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp b/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp index f6cbd23f01c4..556745825a15 100644 --- a/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp +++ b/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.cpp @@ -1,9 +1,8 @@ //===-- NVPTXMCAsmInfo.cpp - NVPTX asm properties -------------------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -38,12 +37,11 @@ NVPTXMCAsmInfo::NVPTXMCAsmInfo(const Triple &TheTriple) { HiddenDeclarationVisibilityAttr = HiddenVisibilityAttr = MCSA_Invalid; ProtectedVisibilityAttr = MCSA_Invalid; - // FIXME: remove comment once debug info is properly supported. - Data8bitsDirective = "// .b8 "; + Data8bitsDirective = ".b8 "; Data16bitsDirective = nullptr; // not supported - Data32bitsDirective = "// .b32 "; - Data64bitsDirective = "// .b64 "; - ZeroDirective = "// .b8"; + Data32bitsDirective = ".b32 "; + Data64bitsDirective = ".b64 "; + ZeroDirective = ".b8"; AsciiDirective = nullptr; // not supported AscizDirective = nullptr; // not supported SupportsQuotedNames = false; diff --git a/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.h b/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.h index 9fd7600cf67f..e888526da898 100644 --- a/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.h +++ b/lib/Target/NVPTX/MCTargetDesc/NVPTXMCAsmInfo.h @@ -1,9 +1,8 @@ //===-- NVPTXMCAsmInfo.h - NVPTX asm properties ----------------*- C++ -*--===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/MCTargetDesc/NVPTXMCTargetDesc.cpp b/lib/Target/NVPTX/MCTargetDesc/NVPTXMCTargetDesc.cpp index b1a77a17ec15..c8b85b2718a6 100644 --- a/lib/Target/NVPTX/MCTargetDesc/NVPTXMCTargetDesc.cpp +++ b/lib/Target/NVPTX/MCTargetDesc/NVPTXMCTargetDesc.cpp @@ -1,9 +1,8 @@ //===-- NVPTXMCTargetDesc.cpp - NVPTX Target Descriptions -------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -11,10 +10,11 @@ // //===----------------------------------------------------------------------===// -#include "InstPrinter/NVPTXInstPrinter.h" +#include "NVPTXInstPrinter.h" #include "NVPTXMCAsmInfo.h" #include "NVPTXMCTargetDesc.h" #include "NVPTXTargetStreamer.h" +#include "TargetInfo/NVPTXTargetInfo.h" #include "llvm/MC/MCInstrInfo.h" #include "llvm/MC/MCRegisterInfo.h" #include "llvm/MC/MCSubtargetInfo.h" diff --git a/lib/Target/NVPTX/MCTargetDesc/NVPTXMCTargetDesc.h b/lib/Target/NVPTX/MCTargetDesc/NVPTXMCTargetDesc.h index 0c9ad977e7ec..e1691d2384e6 100644 --- a/lib/Target/NVPTX/MCTargetDesc/NVPTXMCTargetDesc.h +++ b/lib/Target/NVPTX/MCTargetDesc/NVPTXMCTargetDesc.h @@ -1,9 +1,8 @@ //===-- NVPTXMCTargetDesc.h - NVPTX Target Descriptions ---------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -19,9 +18,6 @@ namespace llvm { class Target; -Target &getTheNVPTXTarget32(); -Target &getTheNVPTXTarget64(); - } // End llvm namespace // Defines symbolic names for PTX registers. diff --git a/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp b/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp index f7b4cf3a0f72..17f5ba7d900b 100644 --- a/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp +++ b/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.cpp @@ -1,9 +1,8 @@ //=====- NVPTXTargetStreamer.cpp - NVPTXTargetStreamer class ------------=====// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -31,6 +30,11 @@ void NVPTXTargetStreamer::outputDwarfFileDirectives() { DwarfFiles.clear(); } +void NVPTXTargetStreamer::closeLastSection() { + if (HasSections) + getStreamer().EmitRawText("\t}"); +} + void NVPTXTargetStreamer::emitDwarfFileDirective(StringRef Directive) { DwarfFiles.emplace_back(Directive); } @@ -82,22 +86,27 @@ void NVPTXTargetStreamer::changeSection(const MCSection *CurSection, raw_ostream &OS) { assert(!SubSection && "SubSection is not null!"); const MCObjectFileInfo *FI = getStreamer().getContext().getObjectFileInfo(); - // FIXME: remove comment once debug info is properly supported. // Emit closing brace for DWARF sections only. if (isDwarfSection(FI, CurSection)) - OS << "//\t}\n"; + OS << "\t}\n"; if (isDwarfSection(FI, Section)) { // Emit DWARF .file directives in the outermost scope. outputDwarfFileDirectives(); - OS << "//\t.section"; + OS << "\t.section"; Section->PrintSwitchToSection(*getStreamer().getContext().getAsmInfo(), FI->getTargetTriple(), OS, SubSection); // DWARF sections are enclosed into braces - emit the open one. - OS << "//\t{\n"; + OS << "\t{\n"; + HasSections = true; } } void NVPTXTargetStreamer::emitRawBytes(StringRef Data) { + MCTargetStreamer::emitRawBytes(Data); + // TODO: enable this once the bug in the ptxas with the packed bytes is + // resolved. Currently, (it is confirmed by NVidia) it causes a crash in + // ptxas. +#if 0 const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo(); const char *Directive = MAI->getData8bitsDirective(); unsigned NumElements = Data.size(); @@ -121,5 +130,6 @@ void NVPTXTargetStreamer::emitRawBytes(StringRef Data) { } Streamer.EmitRawText(OS.str()); } +#endif } diff --git a/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h b/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h index f18e61cdca57..8185efadefdb 100644 --- a/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h +++ b/lib/Target/NVPTX/MCTargetDesc/NVPTXTargetStreamer.h @@ -1,9 +1,8 @@ //=====-- NVPTXTargetStreamer.h - NVPTX Target Streamer ------*- C++ -*--=====// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// @@ -19,6 +18,7 @@ class MCSection; class NVPTXTargetStreamer : public MCTargetStreamer { private: SmallVector<std::string, 4> DwarfFiles; + bool HasSections = false; public: NVPTXTargetStreamer(MCStreamer &S); @@ -26,6 +26,8 @@ public: /// Outputs the list of the DWARF '.file' directives to the streamer. void outputDwarfFileDirectives(); + /// Close last section. + void closeLastSection(); /// Record DWARF file directives for later output. /// According to PTX ISA, CUDA Toolkit documentation, 11.5.3. Debugging diff --git a/lib/Target/NVPTX/ManagedStringPool.h b/lib/Target/NVPTX/ManagedStringPool.h index 7fc0156216f5..bbcbb4598040 100644 --- a/lib/Target/NVPTX/ManagedStringPool.h +++ b/lib/Target/NVPTX/ManagedStringPool.h @@ -1,9 +1,8 @@ //===-- ManagedStringPool.h - Managed String Pool ---------------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTX.h b/lib/Target/NVPTX/NVPTX.h index 07bfc58a8da7..6530c40ea100 100644 --- a/lib/Target/NVPTX/NVPTX.h +++ b/lib/Target/NVPTX/NVPTX.h @@ -1,9 +1,8 @@ //===-- NVPTX.h - Top-level interface for NVPTX representation --*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -15,14 +14,8 @@ #ifndef LLVM_LIB_TARGET_NVPTX_NVPTX_H #define LLVM_LIB_TARGET_NVPTX_NVPTX_H -#include "MCTargetDesc/NVPTXBaseInfo.h" -#include "llvm/ADT/StringMap.h" -#include "llvm/IR/Module.h" -#include "llvm/IR/Value.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Target/TargetMachine.h" -#include <cassert> -#include <iosfwd> +#include "llvm/Pass.h" +#include "llvm/Support/CodeGen.h" namespace llvm { class NVPTXTargetMachine; @@ -55,9 +48,6 @@ BasicBlockPass *createNVPTXLowerAllocaPass(); MachineFunctionPass *createNVPTXPeephole(); MachineFunctionPass *createNVPTXProxyRegErasurePass(); -Target &getTheNVPTXTarget32(); -Target &getTheNVPTXTarget64(); - namespace NVPTX { enum DrvInterface { NVCL, diff --git a/lib/Target/NVPTX/NVPTX.td b/lib/Target/NVPTX/NVPTX.td index 3731b2f37f6c..1d947ef1ce62 100644 --- a/lib/Target/NVPTX/NVPTX.td +++ b/lib/Target/NVPTX/NVPTX.td @@ -1,9 +1,8 @@ //===- NVPTX.td - Describe the NVPTX Target Machine -----------*- tblgen -*-==// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 is the top level entry point for the NVPTX target. @@ -76,6 +75,8 @@ def PTX61 : SubtargetFeature<"ptx61", "PTXVersion", "61", "Use PTX version 6.1">; def PTX63 : SubtargetFeature<"ptx63", "PTXVersion", "63", "Use PTX version 6.3">; +def PTX64 : SubtargetFeature<"ptx64", "PTXVersion", "64", + "Use PTX version 6.4">; //===----------------------------------------------------------------------===// // NVPTX supported processors. diff --git a/lib/Target/NVPTX/NVPTXAllocaHoisting.cpp b/lib/Target/NVPTX/NVPTXAllocaHoisting.cpp index bf922eb8a195..f2c7751df1df 100644 --- a/lib/Target/NVPTX/NVPTXAllocaHoisting.cpp +++ b/lib/Target/NVPTX/NVPTXAllocaHoisting.cpp @@ -1,9 +1,8 @@ //===-- AllocaHoisting.cpp - Hoist allocas to the entry block --*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXAllocaHoisting.h b/lib/Target/NVPTX/NVPTXAllocaHoisting.h index 7a6fc7d9b14d..d7de8e3a2f46 100644 --- a/lib/Target/NVPTX/NVPTXAllocaHoisting.h +++ b/lib/Target/NVPTX/NVPTXAllocaHoisting.h @@ -1,9 +1,8 @@ //===-- AllocaHoisting.h - Hosist allocas to the entry block ----*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXAsmPrinter.cpp b/lib/Target/NVPTX/NVPTXAsmPrinter.cpp index 6284ad8b82e8..5f38b4a3c4c5 100644 --- a/lib/Target/NVPTX/NVPTXAsmPrinter.cpp +++ b/lib/Target/NVPTX/NVPTXAsmPrinter.cpp @@ -1,9 +1,8 @@ //===-- NVPTXAsmPrinter.cpp - NVPTX LLVM assembly writer ------------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -13,8 +12,8 @@ //===----------------------------------------------------------------------===// #include "NVPTXAsmPrinter.h" -#include "InstPrinter/NVPTXInstPrinter.h" #include "MCTargetDesc/NVPTXBaseInfo.h" +#include "MCTargetDesc/NVPTXInstPrinter.h" #include "MCTargetDesc/NVPTXMCAsmInfo.h" #include "MCTargetDesc/NVPTXTargetStreamer.h" #include "NVPTX.h" @@ -24,6 +23,7 @@ #include "NVPTXSubtarget.h" #include "NVPTXTargetMachine.h" #include "NVPTXUtilities.h" +#include "TargetInfo/NVPTXTargetInfo.h" #include "cl_common_defines.h" #include "llvm/ADT/APFloat.h" #include "llvm/ADT/APInt.h" @@ -473,6 +473,9 @@ void NVPTXAsmPrinter::EmitFunctionEntryLabel() { // Emit open brace for function body. OutStreamer->EmitRawText(StringRef("{\n")); setAndEmitFunctionVirtualRegisters(*MF); + // Emit initial .loc debug directive for correct relocation symbol data. + if (MMI && MMI->hasDebugInfo()) + emitInitialRawDwarfLocDirective(*MF); } bool NVPTXAsmPrinter::runOnMachineFunction(MachineFunction &F) { @@ -597,36 +600,6 @@ void NVPTXAsmPrinter::emitVirtualRegister(unsigned int vr, O << getVirtualRegisterName(vr); } -void NVPTXAsmPrinter::printVecModifiedImmediate( - const MachineOperand &MO, const char *Modifier, raw_ostream &O) { - static const char vecelem[] = { '0', '1', '2', '3', '0', '1', '2', '3' }; - int Imm = (int) MO.getImm(); - if (0 == strcmp(Modifier, "vecelem")) - O << "_" << vecelem[Imm]; - else if (0 == strcmp(Modifier, "vecv4comm1")) { - if ((Imm < 0) || (Imm > 3)) - O << "//"; - } else if (0 == strcmp(Modifier, "vecv4comm2")) { - if ((Imm < 4) || (Imm > 7)) - O << "//"; - } else if (0 == strcmp(Modifier, "vecv4pos")) { - if (Imm < 0) - Imm = 0; - O << "_" << vecelem[Imm % 4]; - } else if (0 == strcmp(Modifier, "vecv2comm1")) { - if ((Imm < 0) || (Imm > 1)) - O << "//"; - } else if (0 == strcmp(Modifier, "vecv2comm2")) { - if ((Imm < 2) || (Imm > 3)) - O << "//"; - } else if (0 == strcmp(Modifier, "vecv2pos")) { - if (Imm < 0) - Imm = 0; - O << "_" << vecelem[Imm % 2]; - } else - llvm_unreachable("Unknown Modifier on immediate operand"); -} - void NVPTXAsmPrinter::emitDeclaration(const Function *F, raw_ostream &O) { emitLinkageDirective(F, O); if (isKernelFunction(*F)) @@ -899,9 +872,8 @@ void NVPTXAsmPrinter::emitHeader(Module &M, raw_ostream &O, if (HasFullDebugInfo) break; } - // FIXME: remove comment once debug info is properly supported. if (MMI && MMI->hasDebugInfo() && HasFullDebugInfo) - O << "//, debug"; + O << ", debug"; O << "\n"; @@ -952,10 +924,13 @@ bool NVPTXAsmPrinter::doFinalization(Module &M) { clearAnnotationCache(&M); delete[] gv_array; - // FIXME: remove comment once debug info is properly supported. // Close the last emitted section - if (HasDebugInfo) - OutStreamer->EmitRawText("//\t}"); + if (HasDebugInfo) { + static_cast<NVPTXTargetStreamer *>(OutStreamer->getTargetStreamer()) + ->closeLastSection(); + // Emit empty .debug_loc section for better support of the empty files. + OutStreamer->EmitRawText("\t.section\t.debug_loc\t{\t}"); + } // Output last DWARF .file directives, if any. static_cast<NVPTXTargetStreamer *>(OutStreamer->getTargetStreamer()) @@ -2199,7 +2174,6 @@ void NVPTXAsmPrinter::printMCExpr(const MCExpr &Expr, raw_ostream &OS) { /// PrintAsmOperand - Print out an operand for an inline asm expression. /// bool NVPTXAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, - unsigned AsmVariant, const char *ExtraCode, raw_ostream &O) { if (ExtraCode && ExtraCode[0]) { if (ExtraCode[1] != 0) @@ -2208,7 +2182,7 @@ bool NVPTXAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, switch (ExtraCode[0]) { default: // See if this is a generic print operand - return AsmPrinter::PrintAsmOperand(MI, OpNo, AsmVariant, ExtraCode, O); + return AsmPrinter::PrintAsmOperand(MI, OpNo, ExtraCode, O); case 'r': break; } @@ -2219,9 +2193,10 @@ bool NVPTXAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, return false; } -bool NVPTXAsmPrinter::PrintAsmMemoryOperand( - const MachineInstr *MI, unsigned OpNo, unsigned AsmVariant, - const char *ExtraCode, raw_ostream &O) { +bool NVPTXAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, + unsigned OpNo, + const char *ExtraCode, + raw_ostream &O) { if (ExtraCode && ExtraCode[0]) return true; // Unknown modifier @@ -2233,7 +2208,7 @@ bool NVPTXAsmPrinter::PrintAsmMemoryOperand( } void NVPTXAsmPrinter::printOperand(const MachineInstr *MI, int opNum, - raw_ostream &O, const char *Modifier) { + raw_ostream &O) { const MachineOperand &MO = MI->getOperand(opNum); switch (MO.getType()) { case MachineOperand::MO_Register: @@ -2245,29 +2220,23 @@ void NVPTXAsmPrinter::printOperand(const MachineInstr *MI, int opNum, } else { emitVirtualRegister(MO.getReg(), O); } - return; + break; case MachineOperand::MO_Immediate: - if (!Modifier) - O << MO.getImm(); - else if (strstr(Modifier, "vec") == Modifier) - printVecModifiedImmediate(MO, Modifier, O); - else - llvm_unreachable( - "Don't know how to handle modifier on immediate operand"); - return; + O << MO.getImm(); + break; case MachineOperand::MO_FPImmediate: printFPConstant(MO.getFPImm(), O); break; case MachineOperand::MO_GlobalAddress: - getSymbol(MO.getGlobal())->print(O, MAI); + PrintSymbolOperand(MO, O); break; case MachineOperand::MO_MachineBasicBlock: MO.getMBB()->getSymbol()->print(O, MAI); - return; + break; default: llvm_unreachable("Operand type not supported."); diff --git a/lib/Target/NVPTX/NVPTXAsmPrinter.h b/lib/Target/NVPTX/NVPTXAsmPrinter.h index 44a09f5fe513..43ae57ac1262 100644 --- a/lib/Target/NVPTX/NVPTXAsmPrinter.h +++ b/lib/Target/NVPTX/NVPTXAsmPrinter.h @@ -1,9 +1,8 @@ //===-- NVPTXAsmPrinter.h - NVPTX LLVM assembly writer ----------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -213,8 +212,6 @@ private: MCOperand GetSymbolRef(const MCSymbol *Symbol); unsigned encodeVirtualRegister(unsigned Reg); - void printVecModifiedImmediate(const MachineOperand &MO, const char *Modifier, - raw_ostream &O); void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O, const char *Modifier = nullptr); void printModuleLevelGV(const GlobalVariable *GVar, raw_ostream &O, @@ -231,13 +228,10 @@ private: void printReturnValStr(const Function *, raw_ostream &O); void printReturnValStr(const MachineFunction &MF, raw_ostream &O); bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, - unsigned AsmVariant, const char *ExtraCode, - raw_ostream &) override; - void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O, - const char *Modifier = nullptr); + const char *ExtraCode, raw_ostream &) override; + void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O); bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, - unsigned AsmVariant, const char *ExtraCode, - raw_ostream &) override; + const char *ExtraCode, raw_ostream &) override; const MCExpr *lowerConstantForGV(const Constant *CV, bool ProcessingGeneric); void printMCExpr(const MCExpr &Expr, raw_ostream &OS); diff --git a/lib/Target/NVPTX/NVPTXAssignValidGlobalNames.cpp b/lib/Target/NVPTX/NVPTXAssignValidGlobalNames.cpp index 41e9ae827180..a8a43cee9ab7 100644 --- a/lib/Target/NVPTX/NVPTXAssignValidGlobalNames.cpp +++ b/lib/Target/NVPTX/NVPTXAssignValidGlobalNames.cpp @@ -1,9 +1,8 @@ //===-- NVPTXAssignValidGlobalNames.cpp - Assign valid names to globals ---===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXFrameLowering.cpp b/lib/Target/NVPTX/NVPTXFrameLowering.cpp index e5e6637967b2..46f08b23d31a 100644 --- a/lib/Target/NVPTX/NVPTXFrameLowering.cpp +++ b/lib/Target/NVPTX/NVPTXFrameLowering.cpp @@ -1,9 +1,8 @@ //=======- NVPTXFrameLowering.cpp - NVPTX Frame Information ---*- C++ -*-=====// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXFrameLowering.h b/lib/Target/NVPTX/NVPTXFrameLowering.h index 0a7856b9d5de..40269f58f06e 100644 --- a/lib/Target/NVPTX/NVPTXFrameLowering.h +++ b/lib/Target/NVPTX/NVPTXFrameLowering.h @@ -1,9 +1,8 @@ //===--- NVPTXFrameLowering.h - Define frame lowering for NVPTX -*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp b/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp index fd63fdbaced6..b36d9b2e240a 100644 --- a/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp +++ b/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp @@ -1,9 +1,8 @@ //===-- GenericToNVVM.cpp - Convert generic module to NVVM module - C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp b/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp index ffc6a59cd6c8..3d2447d75c77 100644 --- a/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp +++ b/lib/Target/NVPTX/NVPTXISelDAGToDAG.cpp @@ -1,9 +1,8 @@ //===-- NVPTXISelDAGToDAG.cpp - A dag to dag inst selector for NVPTX ------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -13,6 +12,7 @@ #include "NVPTXISelDAGToDAG.h" #include "NVPTXUtilities.h" +#include "MCTargetDesc/NVPTXBaseInfo.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/GlobalValue.h" #include "llvm/IR/Instructions.h" @@ -702,11 +702,11 @@ static bool canLowerToLDG(MemSDNode *N, const NVPTXSubtarget &Subtarget, // We use GetUnderlyingObjects() here instead of GetUnderlyingObject() mainly // because the former looks through phi nodes while the latter does not. We // need to look through phi nodes to handle pointer induction variables. - SmallVector<Value *, 8> Objs; - GetUnderlyingObjects(const_cast<Value *>(N->getMemOperand()->getValue()), + SmallVector<const Value *, 8> Objs; + GetUnderlyingObjects(N->getMemOperand()->getValue(), Objs, F->getDataLayout()); - return all_of(Objs, [&](Value *V) { + return all_of(Objs, [&](const Value *V) { if (auto *A = dyn_cast<const Argument>(V)) return IsKernelFn && A->onlyReadsMemory() && A->hasNoAliasAttr(); if (auto *GV = dyn_cast<const GlobalVariable>(V)) diff --git a/lib/Target/NVPTX/NVPTXISelDAGToDAG.h b/lib/Target/NVPTX/NVPTXISelDAGToDAG.h index e911ba0c167d..e4e5069b7a80 100644 --- a/lib/Target/NVPTX/NVPTXISelDAGToDAG.h +++ b/lib/Target/NVPTX/NVPTXISelDAGToDAG.h @@ -1,9 +1,8 @@ //===-- NVPTXISelDAGToDAG.h - A dag to dag inst selector for NVPTX --------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -18,6 +17,7 @@ #include "NVPTXISelLowering.h" #include "NVPTXRegisterInfo.h" #include "NVPTXTargetMachine.h" +#include "MCTargetDesc/NVPTXBaseInfo.h" #include "llvm/CodeGen/SelectionDAGISel.h" #include "llvm/IR/Intrinsics.h" #include "llvm/Support/Compiler.h" diff --git a/lib/Target/NVPTX/NVPTXISelLowering.cpp b/lib/Target/NVPTX/NVPTXISelLowering.cpp index bec8ece29050..ae1aa98da0e8 100644 --- a/lib/Target/NVPTX/NVPTXISelLowering.cpp +++ b/lib/Target/NVPTX/NVPTXISelLowering.cpp @@ -1,9 +1,8 @@ //===-- NVPTXISelLowering.cpp - NVPTX DAG Lowering Implementation ---------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -547,13 +546,19 @@ NVPTXTargetLowering::NVPTXTargetLowering(const NVPTXTargetMachine &TM, // These map to conversion instructions for scalar FP types. for (const auto &Op : {ISD::FCEIL, ISD::FFLOOR, ISD::FNEARBYINT, ISD::FRINT, - ISD::FROUND, ISD::FTRUNC}) { + ISD::FTRUNC}) { setOperationAction(Op, MVT::f16, Legal); setOperationAction(Op, MVT::f32, Legal); setOperationAction(Op, MVT::f64, Legal); setOperationAction(Op, MVT::v2f16, Expand); } + setOperationAction(ISD::FROUND, MVT::f16, Promote); + setOperationAction(ISD::FROUND, MVT::v2f16, Expand); + setOperationAction(ISD::FROUND, MVT::f32, Custom); + setOperationAction(ISD::FROUND, MVT::f64, Custom); + + // 'Expand' implements FCOPYSIGN without calling an external library. setOperationAction(ISD::FCOPYSIGN, MVT::f16, Expand); setOperationAction(ISD::FCOPYSIGN, MVT::v2f16, Expand); @@ -1503,7 +1508,7 @@ SDValue NVPTXTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI, for (unsigned j = 0, je = VTs.size(); j != je; ++j) { // New store. if (VectorInfo[j] & PVF_FIRST) { - assert(StoreOperands.empty() && "Unfinished preceeding store."); + assert(StoreOperands.empty() && "Unfinished preceding store."); StoreOperands.push_back(Chain); StoreOperands.push_back(DAG.getConstant(paramCount, dl, MVT::i32)); StoreOperands.push_back(DAG.getConstant(Offsets[j], dl, MVT::i32)); @@ -2069,6 +2074,100 @@ SDValue NVPTXTargetLowering::LowerShiftLeftParts(SDValue Op, } } +SDValue NVPTXTargetLowering::LowerFROUND(SDValue Op, SelectionDAG &DAG) const { + EVT VT = Op.getValueType(); + + if (VT == MVT::f32) + return LowerFROUND32(Op, DAG); + + if (VT == MVT::f64) + return LowerFROUND64(Op, DAG); + + llvm_unreachable("unhandled type"); +} + +// This is the the rounding method used in CUDA libdevice in C like code: +// float roundf(float A) +// { +// float RoundedA = (float) (int) ( A > 0 ? (A + 0.5f) : (A - 0.5f)); +// RoundedA = abs(A) > 0x1.0p23 ? A : RoundedA; +// return abs(A) < 0.5 ? (float)(int)A : RoundedA; +// } +SDValue NVPTXTargetLowering::LowerFROUND32(SDValue Op, + SelectionDAG &DAG) const { + SDLoc SL(Op); + SDValue A = Op.getOperand(0); + EVT VT = Op.getValueType(); + + SDValue AbsA = DAG.getNode(ISD::FABS, SL, VT, A); + + // RoundedA = (float) (int) ( A > 0 ? (A + 0.5f) : (A - 0.5f)) + SDValue Bitcast = DAG.getNode(ISD::BITCAST, SL, MVT::i32, A); + const int SignBitMask = 0x80000000; + SDValue Sign = DAG.getNode(ISD::AND, SL, MVT::i32, Bitcast, + DAG.getConstant(SignBitMask, SL, MVT::i32)); + const int PointFiveInBits = 0x3F000000; + SDValue PointFiveWithSignRaw = + DAG.getNode(ISD::OR, SL, MVT::i32, Sign, + DAG.getConstant(PointFiveInBits, SL, MVT::i32)); + SDValue PointFiveWithSign = + DAG.getNode(ISD::BITCAST, SL, VT, PointFiveWithSignRaw); + SDValue AdjustedA = DAG.getNode(ISD::FADD, SL, VT, A, PointFiveWithSign); + SDValue RoundedA = DAG.getNode(ISD::FTRUNC, SL, VT, AdjustedA); + + // RoundedA = abs(A) > 0x1.0p23 ? A : RoundedA; + EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT); + SDValue IsLarge = + DAG.getSetCC(SL, SetCCVT, AbsA, DAG.getConstantFP(pow(2.0, 23.0), SL, VT), + ISD::SETOGT); + RoundedA = DAG.getNode(ISD::SELECT, SL, VT, IsLarge, A, RoundedA); + + // return abs(A) < 0.5 ? (float)(int)A : RoundedA; + SDValue IsSmall =DAG.getSetCC(SL, SetCCVT, AbsA, + DAG.getConstantFP(0.5, SL, VT), ISD::SETOLT); + SDValue RoundedAForSmallA = DAG.getNode(ISD::FTRUNC, SL, VT, A); + return DAG.getNode(ISD::SELECT, SL, VT, IsSmall, RoundedAForSmallA, RoundedA); +} + +// The implementation of round(double) is similar to that of round(float) in +// that they both separate the value range into three regions and use a method +// specific to the region to round the values. However, round(double) first +// calculates the round of the absolute value and then adds the sign back while +// round(float) directly rounds the value with sign. +SDValue NVPTXTargetLowering::LowerFROUND64(SDValue Op, + SelectionDAG &DAG) const { + SDLoc SL(Op); + SDValue A = Op.getOperand(0); + EVT VT = Op.getValueType(); + + SDValue AbsA = DAG.getNode(ISD::FABS, SL, VT, A); + + // double RoundedA = (double) (int) (abs(A) + 0.5f); + SDValue AdjustedA = DAG.getNode(ISD::FADD, SL, VT, AbsA, + DAG.getConstantFP(0.5, SL, VT)); + SDValue RoundedA = DAG.getNode(ISD::FTRUNC, SL, VT, AdjustedA); + + // RoundedA = abs(A) < 0.5 ? (double)0 : RoundedA; + EVT SetCCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT); + SDValue IsSmall =DAG.getSetCC(SL, SetCCVT, AbsA, + DAG.getConstantFP(0.5, SL, VT), ISD::SETOLT); + RoundedA = DAG.getNode(ISD::SELECT, SL, VT, IsSmall, + DAG.getConstantFP(0, SL, VT), + RoundedA); + + // Add sign to rounded_A + RoundedA = DAG.getNode(ISD::FCOPYSIGN, SL, VT, RoundedA, A); + DAG.getNode(ISD::FTRUNC, SL, VT, A); + + // RoundedA = abs(A) > 0x1.0p52 ? A : RoundedA; + SDValue IsLarge = + DAG.getSetCC(SL, SetCCVT, AbsA, DAG.getConstantFP(pow(2.0, 52.0), SL, VT), + ISD::SETOGT); + return DAG.getNode(ISD::SELECT, SL, VT, IsLarge, A, RoundedA); +} + + + SDValue NVPTXTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const { switch (Op.getOpcode()) { @@ -2099,6 +2198,8 @@ NVPTXTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const { return LowerShiftRightParts(Op, DAG); case ISD::SELECT: return LowerSelect(Op, DAG); + case ISD::FROUND: + return LowerFROUND(Op, DAG); default: llvm_unreachable("Custom lowering not defined for operation"); } @@ -2130,7 +2231,7 @@ SDValue NVPTXTargetLowering::LowerLOAD(SDValue Op, SelectionDAG &DAG) const { LoadSDNode *Load = cast<LoadSDNode>(Op); EVT MemVT = Load->getMemoryVT(); if (!allowsMemoryAccess(*DAG.getContext(), DAG.getDataLayout(), MemVT, - Load->getAddressSpace(), Load->getAlignment())) { + *Load->getMemOperand())) { SDValue Ops[2]; std::tie(Ops[0], Ops[1]) = expandUnalignedLoad(Load, DAG); return DAG.getMergeValues(Ops, SDLoc(Op)); @@ -2173,7 +2274,7 @@ SDValue NVPTXTargetLowering::LowerSTORE(SDValue Op, SelectionDAG &DAG) const { // stores and have to handle it here. if (VT == MVT::v2f16 && !allowsMemoryAccess(*DAG.getContext(), DAG.getDataLayout(), VT, - Store->getAddressSpace(), Store->getAlignment())) + *Store->getMemOperand())) return expandUnalignedStore(Store, DAG); if (VT.isVector()) @@ -3399,6 +3500,94 @@ bool NVPTXTargetLowering::getTgtMemIntrinsic( Info.align = 16; return true; } + case Intrinsic::nvvm_wmma_m16n16k16_load_a_s8_col: + case Intrinsic::nvvm_wmma_m16n16k16_load_a_s8_col_stride: + case Intrinsic::nvvm_wmma_m16n16k16_load_a_u8_col_stride: + case Intrinsic::nvvm_wmma_m16n16k16_load_a_u8_col: + case Intrinsic::nvvm_wmma_m16n16k16_load_a_s8_row: + case Intrinsic::nvvm_wmma_m16n16k16_load_a_s8_row_stride: + case Intrinsic::nvvm_wmma_m16n16k16_load_a_u8_row_stride: + case Intrinsic::nvvm_wmma_m16n16k16_load_a_u8_row: + case Intrinsic::nvvm_wmma_m16n16k16_load_b_s8_col: + case Intrinsic::nvvm_wmma_m16n16k16_load_b_s8_col_stride: + case Intrinsic::nvvm_wmma_m16n16k16_load_b_u8_col_stride: + case Intrinsic::nvvm_wmma_m16n16k16_load_b_u8_col: + case Intrinsic::nvvm_wmma_m16n16k16_load_b_s8_row: + case Intrinsic::nvvm_wmma_m16n16k16_load_b_s8_row_stride: + case Intrinsic::nvvm_wmma_m16n16k16_load_b_u8_row_stride: + case Intrinsic::nvvm_wmma_m16n16k16_load_b_u8_row: { + Info.opc = ISD::INTRINSIC_W_CHAIN; + Info.memVT = MVT::v2i32; + Info.ptrVal = I.getArgOperand(0); + Info.offset = 0; + Info.flags = MachineMemOperand::MOLoad; + Info.align = 8; + return true; + } + + case Intrinsic::nvvm_wmma_m32n8k16_load_a_s8_col: + case Intrinsic::nvvm_wmma_m32n8k16_load_a_s8_col_stride: + case Intrinsic::nvvm_wmma_m32n8k16_load_a_u8_col_stride: + case Intrinsic::nvvm_wmma_m32n8k16_load_a_u8_col: + case Intrinsic::nvvm_wmma_m32n8k16_load_a_s8_row: + case Intrinsic::nvvm_wmma_m32n8k16_load_a_s8_row_stride: + case Intrinsic::nvvm_wmma_m32n8k16_load_a_u8_row_stride: + case Intrinsic::nvvm_wmma_m32n8k16_load_a_u8_row: + + case Intrinsic::nvvm_wmma_m8n32k16_load_b_s8_col: + case Intrinsic::nvvm_wmma_m8n32k16_load_b_s8_col_stride: + case Intrinsic::nvvm_wmma_m8n32k16_load_b_u8_col_stride: + case Intrinsic::nvvm_wmma_m8n32k16_load_b_u8_col: + case Intrinsic::nvvm_wmma_m8n32k16_load_b_s8_row: + case Intrinsic::nvvm_wmma_m8n32k16_load_b_s8_row_stride: + case Intrinsic::nvvm_wmma_m8n32k16_load_b_u8_row_stride: + case Intrinsic::nvvm_wmma_m8n32k16_load_b_u8_row: { + Info.opc = ISD::INTRINSIC_W_CHAIN; + Info.memVT = MVT::v4i32; + Info.ptrVal = I.getArgOperand(0); + Info.offset = 0; + Info.flags = MachineMemOperand::MOLoad; + Info.align = 16; + return true; + } + + case Intrinsic::nvvm_wmma_m32n8k16_load_b_s8_col: + case Intrinsic::nvvm_wmma_m32n8k16_load_b_s8_col_stride: + case Intrinsic::nvvm_wmma_m32n8k16_load_b_u8_col_stride: + case Intrinsic::nvvm_wmma_m32n8k16_load_b_u8_col: + case Intrinsic::nvvm_wmma_m32n8k16_load_b_s8_row: + case Intrinsic::nvvm_wmma_m32n8k16_load_b_s8_row_stride: + case Intrinsic::nvvm_wmma_m32n8k16_load_b_u8_row_stride: + case Intrinsic::nvvm_wmma_m32n8k16_load_b_u8_row: + + case Intrinsic::nvvm_wmma_m8n32k16_load_a_s8_col: + case Intrinsic::nvvm_wmma_m8n32k16_load_a_s8_col_stride: + case Intrinsic::nvvm_wmma_m8n32k16_load_a_u8_col_stride: + case Intrinsic::nvvm_wmma_m8n32k16_load_a_u8_col: + case Intrinsic::nvvm_wmma_m8n32k16_load_a_s8_row: + case Intrinsic::nvvm_wmma_m8n32k16_load_a_s8_row_stride: + case Intrinsic::nvvm_wmma_m8n32k16_load_a_u8_row_stride: + case Intrinsic::nvvm_wmma_m8n32k16_load_a_u8_row: + case Intrinsic::nvvm_wmma_m8n8k128_load_a_b1_row: + case Intrinsic::nvvm_wmma_m8n8k128_load_a_b1_row_stride: + case Intrinsic::nvvm_wmma_m8n8k128_load_b_b1_col: + case Intrinsic::nvvm_wmma_m8n8k128_load_b_b1_col_stride: + case Intrinsic::nvvm_wmma_m8n8k32_load_a_s4_row: + case Intrinsic::nvvm_wmma_m8n8k32_load_a_s4_row_stride: + case Intrinsic::nvvm_wmma_m8n8k32_load_a_u4_row_stride: + case Intrinsic::nvvm_wmma_m8n8k32_load_a_u4_row: + case Intrinsic::nvvm_wmma_m8n8k32_load_b_s4_col: + case Intrinsic::nvvm_wmma_m8n8k32_load_b_s4_col_stride: + case Intrinsic::nvvm_wmma_m8n8k32_load_b_u4_col_stride: + case Intrinsic::nvvm_wmma_m8n8k32_load_b_u4_col: { + Info.opc = ISD::INTRINSIC_W_CHAIN; + Info.memVT = MVT::i32; + Info.ptrVal = I.getArgOperand(0); + Info.offset = 0; + Info.flags = MachineMemOperand::MOLoad; + Info.align = 4; + return true; + } case Intrinsic::nvvm_wmma_m16n16k16_load_c_f16_col: case Intrinsic::nvvm_wmma_m16n16k16_load_c_f16_row: @@ -3442,6 +3631,44 @@ bool NVPTXTargetLowering::getTgtMemIntrinsic( return true; } + case Intrinsic::nvvm_wmma_m16n16k16_load_c_s32_col: + case Intrinsic::nvvm_wmma_m16n16k16_load_c_s32_col_stride: + case Intrinsic::nvvm_wmma_m16n16k16_load_c_s32_row: + case Intrinsic::nvvm_wmma_m16n16k16_load_c_s32_row_stride: + case Intrinsic::nvvm_wmma_m32n8k16_load_c_s32_col: + case Intrinsic::nvvm_wmma_m32n8k16_load_c_s32_col_stride: + case Intrinsic::nvvm_wmma_m32n8k16_load_c_s32_row: + case Intrinsic::nvvm_wmma_m32n8k16_load_c_s32_row_stride: + case Intrinsic::nvvm_wmma_m8n32k16_load_c_s32_col: + case Intrinsic::nvvm_wmma_m8n32k16_load_c_s32_col_stride: + case Intrinsic::nvvm_wmma_m8n32k16_load_c_s32_row: + case Intrinsic::nvvm_wmma_m8n32k16_load_c_s32_row_stride: { + Info.opc = ISD::INTRINSIC_W_CHAIN; + Info.memVT = MVT::v8i32; + Info.ptrVal = I.getArgOperand(0); + Info.offset = 0; + Info.flags = MachineMemOperand::MOLoad; + Info.align = 16; + return true; + } + + case Intrinsic::nvvm_wmma_m8n8k128_load_c_s32_col: + case Intrinsic::nvvm_wmma_m8n8k128_load_c_s32_col_stride: + case Intrinsic::nvvm_wmma_m8n8k128_load_c_s32_row: + case Intrinsic::nvvm_wmma_m8n8k128_load_c_s32_row_stride: + case Intrinsic::nvvm_wmma_m8n8k32_load_c_s32_col: + case Intrinsic::nvvm_wmma_m8n8k32_load_c_s32_col_stride: + case Intrinsic::nvvm_wmma_m8n8k32_load_c_s32_row: + case Intrinsic::nvvm_wmma_m8n8k32_load_c_s32_row_stride: { + Info.opc = ISD::INTRINSIC_W_CHAIN; + Info.memVT = MVT::v2i32; + Info.ptrVal = I.getArgOperand(0); + Info.offset = 0; + Info.flags = MachineMemOperand::MOLoad; + Info.align = 8; + return true; + } + case Intrinsic::nvvm_wmma_m16n16k16_store_d_f16_col: case Intrinsic::nvvm_wmma_m16n16k16_store_d_f16_row: case Intrinsic::nvvm_wmma_m16n16k16_store_d_f16_col_stride: @@ -3484,8 +3711,44 @@ bool NVPTXTargetLowering::getTgtMemIntrinsic( return true; } - case Intrinsic::nvvm_atomic_load_add_f32: - case Intrinsic::nvvm_atomic_load_add_f64: + case Intrinsic::nvvm_wmma_m16n16k16_store_d_s32_col: + case Intrinsic::nvvm_wmma_m16n16k16_store_d_s32_col_stride: + case Intrinsic::nvvm_wmma_m16n16k16_store_d_s32_row: + case Intrinsic::nvvm_wmma_m16n16k16_store_d_s32_row_stride: + case Intrinsic::nvvm_wmma_m32n8k16_store_d_s32_col: + case Intrinsic::nvvm_wmma_m32n8k16_store_d_s32_col_stride: + case Intrinsic::nvvm_wmma_m32n8k16_store_d_s32_row: + case Intrinsic::nvvm_wmma_m32n8k16_store_d_s32_row_stride: + case Intrinsic::nvvm_wmma_m8n32k16_store_d_s32_col: + case Intrinsic::nvvm_wmma_m8n32k16_store_d_s32_col_stride: + case Intrinsic::nvvm_wmma_m8n32k16_store_d_s32_row: + case Intrinsic::nvvm_wmma_m8n32k16_store_d_s32_row_stride: { + Info.opc = ISD::INTRINSIC_VOID; + Info.memVT = MVT::v8i32; + Info.ptrVal = I.getArgOperand(0); + Info.offset = 0; + Info.flags = MachineMemOperand::MOStore; + Info.align = 16; + return true; + } + + case Intrinsic::nvvm_wmma_m8n8k128_store_d_s32_col: + case Intrinsic::nvvm_wmma_m8n8k128_store_d_s32_col_stride: + case Intrinsic::nvvm_wmma_m8n8k128_store_d_s32_row: + case Intrinsic::nvvm_wmma_m8n8k128_store_d_s32_row_stride: + case Intrinsic::nvvm_wmma_m8n8k32_store_d_s32_col: + case Intrinsic::nvvm_wmma_m8n8k32_store_d_s32_col_stride: + case Intrinsic::nvvm_wmma_m8n8k32_store_d_s32_row: + case Intrinsic::nvvm_wmma_m8n8k32_store_d_s32_row_stride: { + Info.opc = ISD::INTRINSIC_VOID; + Info.memVT = MVT::v2i32; + Info.ptrVal = I.getArgOperand(0); + Info.offset = 0; + Info.flags = MachineMemOperand::MOStore; + Info.align = 8; + return true; + } + case Intrinsic::nvvm_atomic_load_inc_32: case Intrinsic::nvvm_atomic_load_dec_32: diff --git a/lib/Target/NVPTX/NVPTXISelLowering.h b/lib/Target/NVPTX/NVPTXISelLowering.h index 66fab2b6f480..ef645fc1e541 100644 --- a/lib/Target/NVPTX/NVPTXISelLowering.h +++ b/lib/Target/NVPTX/NVPTXISelLowering.h @@ -1,9 +1,8 @@ //===-- NVPTXISelLowering.h - NVPTX DAG Lowering Interface ------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -557,6 +556,10 @@ private: SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const; SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const; + SDValue LowerFROUND(SDValue Op, SelectionDAG &DAG) const; + SDValue LowerFROUND32(SDValue Op, SelectionDAG &DAG) const; + SDValue LowerFROUND64(SDValue Op, SelectionDAG &DAG) const; + SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const; SDValue LowerLOADi1(SDValue Op, SelectionDAG &DAG) const; diff --git a/lib/Target/NVPTX/NVPTXImageOptimizer.cpp b/lib/Target/NVPTX/NVPTXImageOptimizer.cpp index ad1d7cbb52fc..74ab2f7b8453 100644 --- a/lib/Target/NVPTX/NVPTXImageOptimizer.cpp +++ b/lib/Target/NVPTX/NVPTXImageOptimizer.cpp @@ -1,9 +1,8 @@ //===-- NVPTXImageOptimizer.cpp - Image optimization pass -----------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXInstrFormats.td b/lib/Target/NVPTX/NVPTXInstrFormats.td index ffcb5d5273a2..77961c386827 100644 --- a/lib/Target/NVPTX/NVPTXInstrFormats.td +++ b/lib/Target/NVPTX/NVPTXInstrFormats.td @@ -1,9 +1,8 @@ //===- NVPTXInstrFormats.td - NVPTX Instruction Formats-------*- tblgen -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// diff --git a/lib/Target/NVPTX/NVPTXInstrInfo.cpp b/lib/Target/NVPTX/NVPTXInstrInfo.cpp index 50815bff6c67..f928b44c91e0 100644 --- a/lib/Target/NVPTX/NVPTXInstrInfo.cpp +++ b/lib/Target/NVPTX/NVPTXInstrInfo.cpp @@ -1,9 +1,8 @@ //===- NVPTXInstrInfo.cpp - NVPTX Instruction Information -----------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXInstrInfo.h b/lib/Target/NVPTX/NVPTXInstrInfo.h index 4ab1bb481958..7c0912808f7b 100644 --- a/lib/Target/NVPTX/NVPTXInstrInfo.h +++ b/lib/Target/NVPTX/NVPTXInstrInfo.h @@ -1,9 +1,8 @@ //===- NVPTXInstrInfo.h - NVPTX Instruction Information----------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the niversity of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXInstrInfo.td b/lib/Target/NVPTX/NVPTXInstrInfo.td index 02a40b9f5262..62da3c79f465 100644 --- a/lib/Target/NVPTX/NVPTXInstrInfo.td +++ b/lib/Target/NVPTX/NVPTXInstrInfo.td @@ -1,9 +1,8 @@ //===- NVPTXInstrInfo.td - NVPTX Instruction defs -------------*- tblgen-*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -143,9 +142,12 @@ def true : Predicate<"true">; def hasPTX31 : Predicate<"Subtarget->getPTXVersion() >= 31">; def hasPTX60 : Predicate<"Subtarget->getPTXVersion() >= 60">; def hasPTX61 : Predicate<"Subtarget->getPTXVersion() >= 61">; +def hasPTX63 : Predicate<"Subtarget->getPTXVersion() >= 63">; def hasSM30 : Predicate<"Subtarget->getSmVersion() >= 30">; def hasSM70 : Predicate<"Subtarget->getSmVersion() >= 70">; +def hasSM72 : Predicate<"Subtarget->getSmVersion() >= 72">; +def hasSM75 : Predicate<"Subtarget->getSmVersion() >= 75">; def useShortPtr : Predicate<"useShortPointers()">; def useFP16Math: Predicate<"Subtarget->allowFP16Math()">; @@ -1549,6 +1551,10 @@ def LdStCode : Operand<i32> { let PrintMethod = "printLdStCode"; } +def MmaCode : Operand<i32> { + let PrintMethod = "printMmaCode"; +} + def SDTWrapper : SDTypeProfile<1, 1, [SDTCisSameAs<0, 1>, SDTCisPtrTy<0>]>; def Wrapper : SDNode<"NVPTXISD::Wrapper", SDTWrapper>; @@ -3003,15 +3009,6 @@ def : Pat<(ffloor Float32Regs:$a), def : Pat<(ffloor Float64Regs:$a), (CVT_f64_f64 Float64Regs:$a, CvtRMI)>; -def : Pat<(f16 (fround Float16Regs:$a)), - (CVT_f16_f16 Float16Regs:$a, CvtRNI)>; -def : Pat<(fround Float32Regs:$a), - (CVT_f32_f32 Float32Regs:$a, CvtRNI_FTZ)>, Requires<[doF32FTZ]>; -def : Pat<(f32 (fround Float32Regs:$a)), - (CVT_f32_f32 Float32Regs:$a, CvtRNI)>, Requires<[doNoF32FTZ]>; -def : Pat<(f64 (fround Float64Regs:$a)), - (CVT_f64_f64 Float64Regs:$a, CvtRNI)>; - def : Pat<(ftrunc Float16Regs:$a), (CVT_f16_f16 Float16Regs:$a, CvtRZI)>; def : Pat<(ftrunc Float32Regs:$a), diff --git a/lib/Target/NVPTX/NVPTXIntrinsics.td b/lib/Target/NVPTX/NVPTXIntrinsics.td index 47dcdcf6e0bd..1752d3e0575e 100644 --- a/lib/Target/NVPTX/NVPTXIntrinsics.td +++ b/lib/Target/NVPTX/NVPTXIntrinsics.td @@ -1,9 +1,8 @@ //===- NVPTXIntrinsics.td - PTX Intrinsics Instructions -------*- tblgen -*-==// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// @@ -27,7 +26,35 @@ def immDouble1 : PatLeaf<(fpimm), [{ return (d==1.0); }]>; +def AS_match { + code generic = [{ + return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_GENERIC); + }]; + code shared = [{ + return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_SHARED); + }]; + code global = [{ + return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_GLOBAL); + }]; +} +// A node that will be replaced with the current PTX version. +class PTX { + SDNodeXForm PTXVerXform = SDNodeXForm<imm, [{ + return getI32Imm(Subtarget->getPTXVersion(), SDLoc(N)); + }]>; + // (i32 0) will be XForm'ed to the currently used PTX version. + dag version = (PTXVerXform (i32 0)); +} +def ptx : PTX; + +// Generates list of n sequential register names. +// E.g. RegNames<3,"r">.ret -> ["r0", "r1", "r2" ] +class RegSeq<int n, string prefix> { + list<string> ret = !if(n, !listconcat(RegSeq<!add(n,-1), prefix>.ret, + [prefix # !add(n, -1)]), + []); +} //----------------------------------- // Synchronization and shuffle functions @@ -1007,17 +1034,11 @@ def INT_FNS_iii : INT_FNS_MBO<(ins i32imm:$mask, i32imm:$base, i32imm:$ //----------------------------------- class ATOMIC_GLOBAL_CHK <dag ops, dag frag> - : PatFrag<ops, frag, [{ - return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_GLOBAL); -}]>; + : PatFrag<ops, frag, AS_match.global>; class ATOMIC_SHARED_CHK <dag ops, dag frag> - : PatFrag<ops, frag, [{ - return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_SHARED); -}]>; + : PatFrag<ops, frag, AS_match.shared>; class ATOMIC_GENERIC_CHK <dag ops, dag frag> - : PatFrag<ops, frag, [{ - return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_GENERIC); -}]>; + : PatFrag<ops, frag, AS_match.generic>; multiclass F_ATOMIC_2_imp<NVPTXRegClass ptrclass, NVPTXRegClass regclass, string SpaceStr, string TypeStr, string OpcStr, PatFrag IntOp, @@ -1113,18 +1134,12 @@ def atomic_load_add_64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), (atomic_load_add_64 node:$a, node:$b)>; def atomic_load_add_64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), (atomic_load_add_64 node:$a, node:$b)>; -def atomic_load_add_f32_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), - (int_nvvm_atomic_load_add_f32 node:$a, node:$b)>; -def atomic_load_add_f32_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), - (int_nvvm_atomic_load_add_f32 node:$a, node:$b)>; -def atomic_load_add_f32_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), - (int_nvvm_atomic_load_add_f32 node:$a, node:$b)>; -def atomic_load_add_f64_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), - (int_nvvm_atomic_load_add_f64 node:$a, node:$b)>; -def atomic_load_add_f64_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), - (int_nvvm_atomic_load_add_f64 node:$a, node:$b)>; -def atomic_load_add_f64_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), - (int_nvvm_atomic_load_add_f64 node:$a, node:$b)>; +def atomic_load_add_g: ATOMIC_GLOBAL_CHK<(ops node:$a, node:$b), + (atomic_load_fadd node:$a, node:$b)>; +def atomic_load_add_s: ATOMIC_SHARED_CHK<(ops node:$a, node:$b), + (atomic_load_fadd node:$a, node:$b)>; +def atomic_load_add_gen: ATOMIC_GENERIC_CHK<(ops node:$a, node:$b), + (atomic_load_fadd node:$a, node:$b)>; defm INT_PTX_ATOM_ADD_G_32 : F_ATOMIC_2<Int32Regs, ".global", ".u32", ".add", atomic_load_add_32_g, i32imm, imm>; @@ -1145,18 +1160,18 @@ defm INT_PTX_ATOM_ADD_GEN_64_USE_G : F_ATOMIC_2<Int64Regs, ".global", ".u64", ".add", atomic_load_add_64_gen, i64imm, imm>; defm INT_PTX_ATOM_ADD_G_F32 : F_ATOMIC_2<Float32Regs, ".global", ".f32", ".add", - atomic_load_add_f32_g, f32imm, fpimm>; + atomic_load_add_g, f32imm, fpimm>; defm INT_PTX_ATOM_ADD_S_F32 : F_ATOMIC_2<Float32Regs, ".shared", ".f32", ".add", - atomic_load_add_f32_s, f32imm, fpimm>; + atomic_load_add_s, f32imm, fpimm>; defm INT_PTX_ATOM_ADD_GEN_F32 : F_ATOMIC_2<Float32Regs, "", ".f32", ".add", - atomic_load_add_f32_gen, f32imm, fpimm>; + atomic_load_add_gen, f32imm, fpimm>; defm INT_PTX_ATOM_ADD_G_F64 : F_ATOMIC_2<Float64Regs, ".global", ".f64", ".add", - atomic_load_add_f64_g, f64imm, fpimm, [hasAtomAddF64]>; + atomic_load_add_g, f64imm, fpimm, [hasAtomAddF64]>; defm INT_PTX_ATOM_ADD_S_F64 : F_ATOMIC_2<Float64Regs, ".shared", ".f64", ".add", - atomic_load_add_f64_s, f64imm, fpimm, [hasAtomAddF64]>; + atomic_load_add_s, f64imm, fpimm, [hasAtomAddF64]>; defm INT_PTX_ATOM_ADD_GEN_F64 : F_ATOMIC_2<Float64Regs, "", ".f64", ".add", - atomic_load_add_f64_gen, f64imm, fpimm, [hasAtomAddF64]>; + atomic_load_add_gen, f64imm, fpimm, [hasAtomAddF64]>; // atom_sub @@ -7381,383 +7396,258 @@ def INT_PTX_SREG_WARPSIZE : NVPTXInst<(outs Int32Regs:$dst), (ins), "mov.u32 \t$dst, WARP_SZ;", [(set Int32Regs:$dst, (int_nvvm_read_ptx_sreg_warpsize))]>; -// -// wmma.load.[a|b|c].sync.[row|col].m16n16k16[|.global|.shared].[f16|f32] -// +// Helper class that represents a 'fragment' of an NVPTX *MMA instruction. +// In addition to target-independent fields provided by WMMA_REGS, it adds +// the fields commonly used to implement specific PTX instruction -- register +// types and names, constraints, parts of assembly, etc. +class WMMA_REGINFO<WMMA_REGS r> + : WMMA_REGS<r.geom, r.frag, r.ptx_elt_type> { + // NVPTX register types used to carry fragment data. + NVPTXRegClass regclass = !cond( + !eq(ptx_elt_type, "f16") : Float16x2Regs, + !eq(ptx_elt_type, "f32") : Float32Regs, + !eq(ptx_elt_type, "s32") : Int32Regs, + !eq(ptx_elt_type, "s8") : Int32Regs, + !eq(ptx_elt_type, "u8") : Int32Regs, + !eq(ptx_elt_type, "s4") : Int32Regs, + !eq(ptx_elt_type, "u4") : Int32Regs, + !eq(ptx_elt_type, "b1") : Int32Regs); -class EmptyNVPTXInst : NVPTXInst<(outs), (ins), "?", []>; + // Instruction input/output arguments for the fragment. + list<NVPTXRegClass> ptx_regs = !foreach(tmp, regs, regclass); -class WMMA_LOAD_GALSTOS<string Geometry, string Abc, string Layout, - string Space, string Type, NVPTXRegClass regclass, - DAGOperand SrcOp, bit WithStride> - : EmptyNVPTXInst, - Requires<[!if(!eq(Geometry, "m16n16k16"), - hasPTX60, - hasPTX61), - hasSM70]> { - // Pattern (created by WMMA_LOAD_INTR_HELPER below) that matches the intrinsic - // for this function. - PatFrag IntrMatcher = !cast<PatFrag>("INT_WMMA_" - # Geometry # "_load_" - # !subst("c", "c_" # Type, Abc) - # "_" # Layout - # !subst(".", "_", Space) - # !if(WithStride,"_stride", "") - # "_Intr"); - dag OutsR03 = (outs regclass:$r0, regclass:$r1, regclass:$r2, regclass:$r3); - dag OutsR47 = (outs regclass:$r4, regclass:$r5, regclass:$r6, regclass:$r7); - dag Outs = !if(!eq(Abc#Type,"cf16"), OutsR03, !con(OutsR03, OutsR47)); + // List of register names for the fragment -- ["ra0", "ra1",...] + list<string> reg_names = RegSeq<!size(ptx_regs), "r"#frag>.ret; - dag StrideArg = !if(WithStride, (ins Int32Regs:$ldm), (ins)); - dag Ins = !con((ins SrcOp:$src), StrideArg); + // Generates "{{$r0, $r1,.... $rN-1}}" for use in asm string construction. + string regstring = "{{$" # !head(reg_names) + # !foldl("", !tail(reg_names), a, b, + !strconcat(a, ", $", b)) + # "}}"; - // Build a dag pattern that matches the intrinsic call. - // We want a dag that looks like this: - // (set <output args>, (intrinsic <input arguments>)) where input and - // output arguments are named patterns that would match corresponding - // input/output arguments of the instruction. - // - // First we construct (set <output arguments>) from instruction's outs dag by - // replacing dag operator 'outs' with 'set'. - dag PatOuts = !foreach(tmp, Outs, !subst(outs, set, tmp)); - // Similarly, construct (intrinsic <input arguments>) sub-dag from - // instruction's input arguments, only now we also need to replace operands - // with patterns that would match them and the operator 'ins' with the - // intrinsic. - dag PatArgs = !foreach(tmp, Ins, - !subst(imem, ADDRvar, - !subst(MEMri64, ADDRri64, - !subst(MEMri, ADDRri, - !subst(ins, IntrMatcher, tmp))))); - // Finally, consatenate both parts together. !con() requires both dags to have - // the same operator, so we wrap PatArgs in a (set ...) dag. - let Pattern = [!con(PatOuts, (set PatArgs))]; - let OutOperandList = Outs; - let InOperandList = Ins; - let AsmString = "wmma.load." - # Abc - # ".sync" - # "." # Layout - # "." # Geometry - # Space - # "." # Type # " \t" - # !if(!eq(Abc#Type, "cf16"), - "{{$r0, $r1, $r2, $r3}}", - "{{$r0, $r1, $r2, $r3, $r4, $r5, $r6, $r7}}") - # ", [$src]" - # !if(WithStride, ", $ldm", "") - # ";"; -} + // Predicates for particular fragment variant. Technically those are + // per-instruction predicates, but currently all fragments that can be used in + // a given instruction are subject to the same constraints, so an instruction + // can use predicates from any of its fragments. If/when this is no + // longer the case, we can concat all per-fragment predicates to enforce that + // all fragments of the instruction are viable. + list<Predicate> Predicates = !cond( + // fp16 -> fp16/fp32 @ m16n16k16 + !and(!eq(geom, "m16n16k16"), + !or(!eq(ptx_elt_type, "f16"), + !eq(ptx_elt_type, "f32"))) : [hasSM70, hasPTX60], -class WMMA_LOAD_INTR_HELPER<string Geometry, string Abc, string Layout, - string Space, string Type, bit WithStride> - : PatFrag <(ops),(ops)> { - // Intrinsic that matches this instruction. - Intrinsic Intr = !cast<Intrinsic>("int_nvvm_wmma" - # "_" # Geometry # "_load_" - # Abc # "_" # Type # "_" # Layout - # !if(WithStride,"_stride", "")); - code match_generic = [{ - return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_GENERIC); - }]; - code match_shared = [{ - return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_SHARED); - }]; - code match_global = [{ - return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_GLOBAL); - }]; + // fp16 -> fp16/fp32 @ m8n32k16/m32n8k16 + !and(!or(!eq(geom, "m8n32k16"), + !eq(geom, "m32n8k16")), + !or(!eq(ptx_elt_type, "f16"), + !eq(ptx_elt_type, "f32"))) : [hasSM70, hasPTX61], - let Operands = !if(WithStride, (ops node:$src, node:$ldm), (ops node:$src)); - let Fragments = [!foreach(tmp, Operands, !subst(ops, Intr, tmp))]; - let PredicateCode = !if(!eq(Space, ".shared"), match_shared, - !if(!eq(Space, ".global"), match_global, match_generic)); -} - -multiclass WMMA_LOAD_GALSTS<string Geometry, string Abc, string Layout, - string Space, string Type, NVPTXRegClass regclass, - bit WithStride> { - def _avar: WMMA_LOAD_GALSTOS<Geometry, Abc, Layout, Space, Type, regclass, - imem, WithStride>; - def _areg: WMMA_LOAD_GALSTOS<Geometry, Abc, Layout, Space, Type, regclass, - Int32Regs, WithStride>; - def _areg64: WMMA_LOAD_GALSTOS<Geometry, Abc, Layout, Space, Type, regclass, - Int64Regs, WithStride>; - def _ari: WMMA_LOAD_GALSTOS<Geometry, Abc, Layout, Space, Type, regclass, - MEMri, WithStride>; - def _ari64: WMMA_LOAD_GALSTOS<Geometry, Abc, Layout, Space, Type, regclass, - MEMri64, WithStride>; -} + // u8/s8 -> s32 @ m16n16k16/m8n32k16/m32n8k16 + !and(!or(!eq(geom,"m16n16k16"), + !eq(geom,"m8n32k16"), + !eq(geom,"m32n8k16")), + !or(!eq(ptx_elt_type, "u8"), + !eq(ptx_elt_type, "s8"), + !eq(ptx_elt_type, "s32"))) : [hasSM72, hasPTX63], -multiclass WMMA_LOAD_GALSTSh<string Geometry, string Abc, string Layout, - string Space, string Type, NVPTXRegClass regclass, - bit WithStride> { - // Define a PatFrag that matches appropriate intrinsic that loads from the - // given address space. - def _Intr: WMMA_LOAD_INTR_HELPER<Geometry, Abc, Layout, Space, Type, - WithStride>; - defm NAME: WMMA_LOAD_GALSTS<Geometry, Abc, Layout, Space, Type, regclass, - WithStride>; -} + // u4/s4/b1 -> s32 @ m8n8k32 (u4/s4), m8n8k128(b1) + !or(!eq(geom,"m8n8k128"), + !eq(geom,"m8n8k32")) : [hasSM75, hasPTX63]); -multiclass WMMA_LOAD_GALST<string Geometry, string Abc, string Layout, - string Space, string Type, NVPTXRegClass regclass> { - defm _stride: WMMA_LOAD_GALSTSh<Geometry, Abc, Layout, Space, Type, regclass, 1>; - defm NAME: WMMA_LOAD_GALSTSh<Geometry, Abc, Layout, Space, Type, regclass, 0>; + // template DAGs for instruction inputs/output. + dag Outs = !dag(outs, ptx_regs, reg_names); + dag Ins = !dag(ins, ptx_regs, reg_names); } -multiclass WMMA_LOAD_GALT<string Geometry, string Abc, string Layout, - string Type, NVPTXRegClass regclass> { - defm _global: WMMA_LOAD_GALST<Geometry, Abc, Layout, ".global", - Type, regclass>; - defm _shared: WMMA_LOAD_GALST<Geometry, Abc, Layout, ".shared", - Type, regclass>; - defm NAME: WMMA_LOAD_GALST<Geometry, Abc, Layout, "", - Type, regclass>; +// Convert dag of arguments into a dag to match given intrinsic. +class BuildPatternI<Intrinsic Intr, dag Ins> { + // Build a dag pattern that matches the intrinsic call. + dag ret = !foreach(tmp, Ins, + !subst(imem, ADDRvar, + !subst(MEMri64, ADDRri64, + !subst(MEMri, ADDRri, + !subst(ins, Intr, tmp))))); } -multiclass WMMA_LOAD_GAT<string Geometry, string Abc, - string Type, NVPTXRegClass regclass> { - defm _row: WMMA_LOAD_GALT<Geometry, Abc, "row", Type, regclass>; - defm _col: WMMA_LOAD_GALT<Geometry, Abc, "col", Type, regclass>; +// Same as above, but uses PatFrag instead of an Intrinsic. +class BuildPatternPF<PatFrag Intr, dag Ins> { + // Build a dag pattern that matches the intrinsic call. + dag ret = !foreach(tmp, Ins, + !subst(imem, ADDRvar, + !subst(MEMri64, ADDRri64, + !subst(MEMri, ADDRri, + !subst(ins, Intr, tmp))))); } -multiclass WMMA_LOAD_G<string Geometry> { - defm _load_a: WMMA_LOAD_GAT<Geometry, "a", "f16", Float16x2Regs>; - defm _load_b: WMMA_LOAD_GAT<Geometry, "b", "f16", Float16x2Regs>; - defm _load_c_f16: WMMA_LOAD_GAT<Geometry, "c", "f16", Float16x2Regs>; - defm _load_c_f32: WMMA_LOAD_GAT<Geometry, "c", "f32", Float32Regs>; +// Common WMMA-related fields used for building patterns for all MMA instructions. +class WMMA_INSTR<string _Intr, list<dag> _Args> + : NVPTXInst<(outs), (ins), "?", []> { + Intrinsic Intr = !cast<Intrinsic>(_Intr); + // Concatenate all arguments into a single dag. + dag Args = !foldl((ins), _Args, a, b, !con(a,b)); + // Pre-build the pattern to match (intrinsic arg0, arg1, ...). + dag IntrinsicPattern = BuildPatternI<!cast<Intrinsic>(Intr), Args>.ret; } -defm INT_WMMA_m32n8k16: WMMA_LOAD_G<"m32n8k16">; -defm INT_WMMA_m16n16k16: WMMA_LOAD_G<"m16n16k16">; -defm INT_WMMA_m8n32k16: WMMA_LOAD_G<"m8n32k16">; - // -// wmma.store.d.sync.[row|col].m16n16k16[|.global|.shared].[f16|f32] +// wmma.load.[a|b|c].sync.[row|col].m16n16k16[|.global|.shared].[f16|f32] // -class WMMA_STORE_D_GLSTSO<string Geometry, string Layout, string Space, - string Type, NVPTXRegClass regclass, - bit WithStride, DAGOperand DstOp> - : EmptyNVPTXInst, - Requires<[!if(!eq(Geometry, "m16n16k16"), - hasPTX60, - hasPTX61), - hasSM70]> { - PatFrag IntrMatcher = !cast<PatFrag>("INT_WMMA" - # "_" # Geometry # "_store_d" - # "_" # Type - # "_" # Layout - # !subst(".", "_", Space) - # !if(WithStride,"_stride", "") - # "_Intr"); - dag InsR03 = (ins DstOp:$src, regclass:$r0, regclass:$r1, - regclass:$r2, regclass:$r3); - dag InsR47 = (ins regclass:$r4, regclass:$r5, - regclass:$r6, regclass:$r7); - dag InsR = !if(!eq(Type,"f16"), InsR03, !con(InsR03, InsR47)); - dag StrideArg = !if(WithStride, (ins Int32Regs:$ldm), (ins)); - dag Ins = !con(InsR, StrideArg); - // Construct the pattern to match corresponding intrinsic call. See the - // details in the comments in WMMA_LOAD_ALSTOS. - dag PatArgs = !foreach(tmp, Ins, - !subst(imem, ADDRvar, - !subst(MEMri64, ADDRri64, - !subst(MEMri, ADDRri, - !subst(ins, IntrMatcher, tmp))))); - let Pattern = [PatArgs]; - let OutOperandList = (outs); - let InOperandList = Ins; - let AsmString = "wmma.store.d.sync." - # Layout - # "." # Geometry +class WMMA_LOAD<WMMA_REGINFO Frag, string Layout, string Space, bit WithStride, + DAGOperand SrcOp> + : WMMA_INSTR<WMMA_NAME_LDST<"load", Frag, Layout, WithStride>.record, + [!con((ins SrcOp:$src), + !if(WithStride, (ins Int32Regs:$ldm), (ins)))]>, + Requires<Frag.Predicates> { + // Load/store intrinsics are overloaded on pointer's address space. + // To match the right intrinsic, we need to build AS-constrained PatFrag. + // Operands is a dag equivalent in shape to Args, but using (ops node:$name, .....). + dag PFOperands = !if(WithStride, (ops node:$src, node:$ldm), (ops node:$src)); + // Build PatFrag that only matches particular address space. + PatFrag IntrFrag = PatFrag<PFOperands, + !foreach(tmp, PFOperands, !subst(ops, Intr, tmp)), + !cond(!eq(Space, ".shared"): AS_match.shared, + !eq(Space, ".global"): AS_match.global, + 1: AS_match.generic)>; + // Build AS-constrained pattern. + let IntrinsicPattern = BuildPatternPF<IntrFrag, Args>.ret; + + let OutOperandList = Frag.Outs; + let InOperandList = !con(Args, (ins MmaCode:$ptx)); + let AsmString = "wmma.load." + # Frag.frag + # ".sync" + # "${ptx:aligned}" + # "." # Layout + # "." # Frag.geom # Space - # "." # Type - # " \t[$src]," - # !if(!eq(Type,"f16"), - "{{$r0, $r1, $r2, $r3}}", - "{{$r0, $r1, $r2, $r3, $r4, $r5, $r6, $r7}}") + # "." # Frag.ptx_elt_type # " \t" + # Frag.regstring + # ", [$src]" # !if(WithStride, ", $ldm", "") # ";"; - -} - -class WMMA_STORE_INTR_HELPER<string Geometry, string Layout, string Space, - string Type, bit WithStride> - : PatFrag <(ops),(ops)> { - // Intrinsic that matches this instruction. - Intrinsic Intr = !cast<Intrinsic>("int_nvvm_wmma_" - # Geometry - # "_store_d" - # "_" # Type - # "_" # Layout - # !if(WithStride, "_stride", "")); - code match_generic = [{ - return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_GENERIC); - }]; - code match_shared = [{ - return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_SHARED); - }]; - code match_global = [{ - return ChkMemSDNodeAddressSpace(N, llvm::ADDRESS_SPACE_GLOBAL); - }]; - - dag Args = !if(!eq(Type,"f16"), - (ops node:$dst, node:$r0, node:$r1, node:$r2, node:$r3), - (ops node:$dst, node:$r0, node:$r1, node:$r2, node:$r3, - node:$r4, node:$r5, node:$r6, node:$r7)); - dag StrideArg = !if(WithStride, (ops node:$ldm), (ops)); - let Operands = !con(Args, StrideArg); - let Fragments = [!foreach(tmp, Operands, !subst(ops, Intr, tmp))]; - let PredicateCode = !if(!eq(Space, ".shared"), match_shared, - !if(!eq(Space, ".global"), match_global, match_generic)); -} - -multiclass WMMA_STORE_D_GLSTS<string Geometry, string Layout, string Space, - string Type, NVPTXRegClass regclass, - bit WithStride> { - def _avar: WMMA_STORE_D_GLSTSO<Geometry, Layout, Space, Type, regclass, - WithStride, imem>; - def _areg: WMMA_STORE_D_GLSTSO<Geometry, Layout, Space, Type, regclass, - WithStride, Int32Regs>; - def _areg64: WMMA_STORE_D_GLSTSO<Geometry, Layout, Space, Type, regclass, - WithStride, Int64Regs>; - def _ari: WMMA_STORE_D_GLSTSO<Geometry, Layout, Space, Type, regclass, - WithStride, MEMri>; - def _ari64: WMMA_STORE_D_GLSTSO<Geometry, Layout, Space, Type, regclass, - WithStride, MEMri64>; -} - -multiclass WMMA_STORE_D_GLSTSh<string Geometry, string Layout, string Space, - string Type, NVPTXRegClass regclass, - bit WithStride> { - // Define a PatFrag that matches appropriate intrinsic that loads from the - // given address space. - def _Intr: WMMA_STORE_INTR_HELPER<Geometry, Layout, Space, Type, - WithStride>; - defm NAME: WMMA_STORE_D_GLSTS<Geometry, Layout, Space, Type, regclass, - WithStride>; } -multiclass WMMA_STORE_D_GLST<string Geometry, string Layout, string Space, - string Type, NVPTXRegClass regclass > { - defm _stride: WMMA_STORE_D_GLSTSh<Geometry, Layout, Space, Type, regclass, 1>; - defm NAME: WMMA_STORE_D_GLSTSh<Geometry, Layout, Space, Type, regclass, 0>; -} +// +// wmma.store.d.sync.[row|col].m16n16k16[|.global|.shared].[f16|f32] +// +class WMMA_STORE_D<WMMA_REGINFO Frag, string Layout, string Space, + bit WithStride, DAGOperand DstOp> + : WMMA_INSTR<WMMA_NAME_LDST<"store", Frag, Layout, WithStride>.record, + [!con((ins DstOp:$dst), + Frag.Ins, + !if(WithStride, (ins Int32Regs:$ldm), (ins)))]>, + Requires<Frag.Predicates> { -multiclass WMMA_STORE_D_GLT<string Geometry, string Layout, - string Type, NVPTXRegClass regclass> { - defm _global: WMMA_STORE_D_GLST<Geometry, Layout, ".global", Type, regclass>; - defm _shared: WMMA_STORE_D_GLST<Geometry, Layout, ".shared", Type, regclass>; - defm NAME: WMMA_STORE_D_GLST<Geometry, Layout, "", Type, regclass>; -} + // Load/store intrinsics are overloaded on pointer's address space. + // To match the right intrinsic, we need to build AS-constrained PatFrag. + // Operands is a dag equivalent in shape to Args, but using (ops node:$name, .....). + dag PFOperands = !con((ops node:$dst), + !dag(ops, !foreach(tmp, Frag.regs, node), Frag.reg_names), + !if(WithStride, (ops node:$ldm), (ops))); + // Build PatFrag that only matches particular address space. + PatFrag IntrFrag = PatFrag<PFOperands, + !foreach(tmp, PFOperands, !subst(ops, Intr, tmp)), + !cond(!eq(Space, ".shared"): AS_match.shared, + !eq(Space, ".global"): AS_match.global, + 1: AS_match.generic)>; + // Build AS-constrained pattern. + let IntrinsicPattern = BuildPatternPF<IntrFrag, Args>.ret; -multiclass WMMA_STORE_D_GT<string Geometry, string Type, - NVPTXRegClass regclass> { - defm _row: WMMA_STORE_D_GLT<Geometry, "row", Type, regclass>; - defm _col: WMMA_STORE_D_GLT<Geometry, "col", Type, regclass>; -} - -multiclass WMMA_STORE_D_G<string Geometry> { - defm _store_d_f16: WMMA_STORE_D_GT<Geometry, "f16", Float16x2Regs>; - defm _store_d_f32: WMMA_STORE_D_GT<Geometry, "f32", Float32Regs>; + let InOperandList = !con(Args, (ins MmaCode:$ptx)); + let OutOperandList = (outs); + let AsmString = "wmma.store.d.sync" + # "${ptx:aligned}" + # "." # Layout + # "." # Frag.geom + # Space + # "." # Frag.ptx_elt_type + # " \t[$dst]," + # Frag.regstring + # !if(WithStride, ", $ldm", "") + # ";"; } -defm INT_WMMA_m32n8k16: WMMA_STORE_D_G<"m32n8k16">; -defm INT_WMMA_m16n16k16: WMMA_STORE_D_G<"m16n16k16">; -defm INT_WMMA_m8n32k16: WMMA_STORE_D_G<"m8n32k16">; +// Create all load/store variants +defset list<WMMA_INSTR> MMA_LDSTs = { + foreach layout = ["row", "col"] in { + foreach stride = [0, 1] in { + foreach space = [".global", ".shared", ""] in { + foreach addr = [imem, Int32Regs, Int64Regs, MEMri, MEMri64] in { + foreach frag = NVVM_MMA_OPS.all_ld_ops in + foreach _ = NVVM_MMA_SUPPORTED<[frag], layout>.ret in + def : WMMA_LOAD<WMMA_REGINFO<frag>, layout, space, stride, addr>; + foreach frag = NVVM_MMA_OPS.all_st_ops in + foreach _ = NVVM_MMA_SUPPORTED<[frag], layout>.ret in + def : WMMA_STORE_D<WMMA_REGINFO<frag>, layout, space, stride, addr>; + } // addr + } // space + } // stride + } // layout +} // defset // WMMA.MMA -class WMMA_MMA_GABDCS<string Geometry, string ALayout, string BLayout, - string DType, NVPTXRegClass d_reg, - string CType, NVPTXRegClass c_reg, - NVPTXRegClass ab_reg, - string Satfinite = ""> - : EmptyNVPTXInst, - Requires<[!if(!eq(Geometry, "m16n16k16"), - hasPTX60, - hasPTX61), - hasSM70]> { - Intrinsic Intr = !cast<Intrinsic>("int_nvvm_wmma_" - # Geometry - # "_mma" - # "_" # ALayout - # "_" # BLayout - # "_" # DType - # "_" # CType - # !subst(".", "_", Satfinite)); - dag Outs = !if(!eq(DType,"f16"), - (outs d_reg:$d0, d_reg:$d1, d_reg:$d2, d_reg:$d3), - (outs d_reg:$d0, d_reg:$d1, d_reg:$d2, d_reg:$d3, - d_reg:$d4, d_reg:$d5, d_reg:$d6, d_reg:$d7)); - dag InsExtraCArgs = !if(!eq(CType,"f16"), - (ins), - (ins c_reg:$c4, c_reg:$c5, c_reg:$c6, c_reg:$c7)); - dag Ins = !con((ins ab_reg:$a0, ab_reg:$a1, ab_reg:$a2, ab_reg:$a3, - ab_reg:$a4, ab_reg:$a5, ab_reg:$a6, ab_reg:$a7, - ab_reg:$b0, ab_reg:$b1, ab_reg:$b2, ab_reg:$b3, - ab_reg:$b4, ab_reg:$b5, ab_reg:$b6, ab_reg:$b7, - c_reg:$c0, c_reg:$c1, c_reg:$c2, c_reg:$c3), - InsExtraCArgs); - - // Construct the pattern to match corresponding intrinsic call. See the - // details in the comments in WMMA_LOAD_ALSTOS. - dag PatOuts = !foreach(tmp, Outs, !subst(outs, set, tmp)); - dag PatArgs = !foreach(tmp, Ins, !subst(ins, Intr, tmp)); - let Pattern = [!con(PatOuts, (set PatArgs))]; - let OutOperandList = Outs; - let InOperandList = Ins; - let AsmString = "wmma.mma.sync." - # ALayout +class WMMA_MMA<WMMA_REGINFO FragA, WMMA_REGINFO FragB, + WMMA_REGINFO FragC, WMMA_REGINFO FragD, + string ALayout, string BLayout, int Satfinite> + : WMMA_INSTR<WMMA_NAME_MMA<ALayout, BLayout, Satfinite, FragA, FragB, FragC, FragD>.record, + [FragA.Ins, FragB.Ins, FragC.Ins]>, + // Requires does not seem to have effect on Instruction w/o Patterns. + // We set it here anyways and propagate to the Pat<> we construct below. + Requires<FragA.Predicates> { + let OutOperandList = FragD.Outs; + let InOperandList = !con(Args, (ins MmaCode:$ptx)); + string TypeList = !cond( + !eq(FragD.ptx_elt_type, "s32") : ".s32" + # "." # FragA.ptx_elt_type + # "." # FragB.ptx_elt_type + # ".s32", + 1: "." # FragD.ptx_elt_type # "." # FragC.ptx_elt_type, + ); + let AsmString = "wmma.mma" + # !if(!eq(FragA.ptx_elt_type, "b1"), ".xor.popc", "") + # ".sync" + # "${ptx:aligned}" + # "." # ALayout # "." # BLayout - # "." # Geometry - # "." # DType - # "." # CType - # Satfinite # "\n\t\t" - # !if(!eq(DType,"f16"), - "{{$d0, $d1, $d2, $d3}}, \n\t\t", - "{{$d0, $d1, $d2, $d3, $d4, $d5, $d6, $d7}},\n\t\t") - # "{{$a0, $a1, $a2, $a3, $a4, $a5, $a6, $a7}},\n\t\t" - # "{{$b0, $b1, $b2, $b3, $b4, $b5, $b6, $b7}},\n\t\t" - # !if(!eq(CType,"f16"), - "{{$c0, $c1, $c2, $c3}};", - "{{$c0, $c1, $c2, $c3, $c4, $c5, $c6, $c7}};"); -} - -multiclass WMMA_MMA_GABDC<string Geometry, string ALayout, string BLayout, - string DType, NVPTXRegClass d_reg, - string CType, NVPTXRegClass c_reg> { - def _satfinite: WMMA_MMA_GABDCS<Geometry, ALayout, BLayout, - DType, d_reg, CType, c_reg, - Float16x2Regs, ".satfinite">; - def NAME: WMMA_MMA_GABDCS<Geometry, ALayout, BLayout, - DType, d_reg, CType, c_reg, - Float16x2Regs>; + # "." # FragA.geom + # TypeList + # !if(Satfinite, ".satfinite", "") # "\n\t\t" + # FragD.regstring # ",\n\t\t" + # FragA.regstring # ",\n\t\t" + # FragB.regstring # ",\n\t\t" + # FragC.regstring # ";"; } -multiclass WMMA_MMA_GABD<string Geometry, string ALayout, string BLayout, - string DType, NVPTXRegClass d_reg> { - defm _f16: WMMA_MMA_GABDC<Geometry, ALayout, BLayout, DType, d_reg, - "f16", Float16x2Regs>; - defm _f32: WMMA_MMA_GABDC<Geometry, ALayout, BLayout, DType, d_reg, - "f32", Float32Regs>; -} +defset list<WMMA_INSTR> MMAs = { + foreach layout_a = ["row", "col"] in { + foreach layout_b = ["row", "col"] in { + foreach satf = [0, 1] in { + foreach op = NVVM_MMA_OPS.all_mma_ops in { + foreach _ = NVVM_MMA_SUPPORTED<op, layout_a, layout_b, satf>.ret in { + def : WMMA_MMA<WMMA_REGINFO<op[0]>, + WMMA_REGINFO<op[1]>, + WMMA_REGINFO<op[2]>, + WMMA_REGINFO<op[3]>, + layout_a, layout_b, satf>; + } + } // op + } // satf + } // layout_b + } // layout_a +} // defset -multiclass WMMA_MMA_GAB<string Geometry, string ALayout, string BLayout> { - defm _f16: WMMA_MMA_GABD<Geometry, ALayout, BLayout, "f16", Float16x2Regs>; - defm _f32: WMMA_MMA_GABD<Geometry, ALayout, BLayout, "f32", Float32Regs>; -} -multiclass WMMA_MMA_GA<string Geometry, string ALayout> { - defm _col: WMMA_MMA_GAB<Geometry, ALayout, "col">; - defm _row: WMMA_MMA_GAB<Geometry, ALayout, "row">; -} - -multiclass WMMA_MMA_G<string Geometry> { - defm _col: WMMA_MMA_GA<Geometry, "col">; - defm _row: WMMA_MMA_GA<Geometry, "row">; -} +// Constructing non-flat DAGs is still a pain. I can't !subst a dag node with a +// dag, so the ptx.version must be appended *after* foreach replaces 'ins' with +// the instruction record. +class WMMA_PAT<WMMA_INSTR wi> + : Pat<wi.IntrinsicPattern, + !con(!foreach(tmp, wi.Args, !subst(ins, wi, tmp)), + (wi ptx.version))>, + Requires<wi.Predicates>; -defm INT_WMMA_MMA_m32n8k16 : WMMA_MMA_G<"m32n8k16">; -defm INT_WMMA_MMA_m16n16k16 : WMMA_MMA_G<"m16n16k16">; -defm INT_WMMA_MMA_m8n32k16 : WMMA_MMA_G<"m8n32k16">; +// Build intrinsic->instruction patterns for all MMA instructions. +foreach mma = !listconcat(MMAs, MMA_LDSTs) in + def : WMMA_PAT<mma>; diff --git a/lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp b/lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp index 52ced266b91c..0743a2986718 100644 --- a/lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp +++ b/lib/Target/NVPTX/NVPTXLowerAggrCopies.cpp @@ -1,9 +1,8 @@ //===- NVPTXLowerAggrCopies.cpp - ------------------------------*- C++ -*--===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXLowerAggrCopies.h b/lib/Target/NVPTX/NVPTXLowerAggrCopies.h index 3c39f53eb30a..59d5ef40e9ac 100644 --- a/lib/Target/NVPTX/NVPTXLowerAggrCopies.h +++ b/lib/Target/NVPTX/NVPTXLowerAggrCopies.h @@ -1,9 +1,8 @@ //===-- llvm/lib/Target/NVPTX/NVPTXLowerAggrCopies.h ------------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXLowerAlloca.cpp b/lib/Target/NVPTX/NVPTXLowerAlloca.cpp index e94c1914029d..76fb9f3fa692 100644 --- a/lib/Target/NVPTX/NVPTXLowerAlloca.cpp +++ b/lib/Target/NVPTX/NVPTXLowerAlloca.cpp @@ -1,9 +1,8 @@ //===-- NVPTXLowerAlloca.cpp - Make alloca to use local memory =====--===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -27,6 +26,7 @@ #include "NVPTX.h" #include "NVPTXUtilities.h" +#include "MCTargetDesc/NVPTXBaseInfo.h" #include "llvm/IR/Function.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" diff --git a/lib/Target/NVPTX/NVPTXLowerArgs.cpp b/lib/Target/NVPTX/NVPTXLowerArgs.cpp index 139dc7fbeeda..c5e02e34e25e 100644 --- a/lib/Target/NVPTX/NVPTXLowerArgs.cpp +++ b/lib/Target/NVPTX/NVPTXLowerArgs.cpp @@ -1,9 +1,8 @@ //===-- NVPTXLowerArgs.cpp - Lower arguments ------------------------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -92,6 +91,7 @@ #include "NVPTX.h" #include "NVPTXTargetMachine.h" #include "NVPTXUtilities.h" +#include "MCTargetDesc/NVPTXBaseInfo.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/Function.h" #include "llvm/IR/Instructions.h" @@ -170,7 +170,8 @@ void NVPTXLowerArgs::handleByValParam(Argument *Arg) { Value *ArgInParam = new AddrSpaceCastInst( Arg, PointerType::get(StructType, ADDRESS_SPACE_PARAM), Arg->getName(), FirstInst); - LoadInst *LI = new LoadInst(ArgInParam, Arg->getName(), FirstInst); + LoadInst *LI = + new LoadInst(StructType, ArgInParam, Arg->getName(), FirstInst); new StoreInst(LI, AllocA, FirstInst); } diff --git a/lib/Target/NVPTX/NVPTXMCExpr.cpp b/lib/Target/NVPTX/NVPTXMCExpr.cpp index a754a6a36dab..5ec1b2425e68 100644 --- a/lib/Target/NVPTX/NVPTXMCExpr.cpp +++ b/lib/Target/NVPTX/NVPTXMCExpr.cpp @@ -1,9 +1,8 @@ //===-- NVPTXMCExpr.cpp - NVPTX specific MC expression classes ------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// diff --git a/lib/Target/NVPTX/NVPTXMCExpr.h b/lib/Target/NVPTX/NVPTXMCExpr.h index 95741d9b0451..440fa1310003 100644 --- a/lib/Target/NVPTX/NVPTXMCExpr.h +++ b/lib/Target/NVPTX/NVPTXMCExpr.h @@ -1,9 +1,8 @@ //===-- NVPTXMCExpr.h - NVPTX specific MC expression classes ----*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// diff --git a/lib/Target/NVPTX/NVPTXMachineFunctionInfo.h b/lib/Target/NVPTX/NVPTXMachineFunctionInfo.h index 5a9115f6f7f1..cf63fc33e621 100644 --- a/lib/Target/NVPTX/NVPTXMachineFunctionInfo.h +++ b/lib/Target/NVPTX/NVPTXMachineFunctionInfo.h @@ -1,9 +1,8 @@ //===-- NVPTXMachineFunctionInfo.h - NVPTX-specific Function Info --------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXPeephole.cpp b/lib/Target/NVPTX/NVPTXPeephole.cpp index 02c32c68ee2c..629757db8707 100644 --- a/lib/Target/NVPTX/NVPTXPeephole.cpp +++ b/lib/Target/NVPTX/NVPTXPeephole.cpp @@ -1,9 +1,8 @@ //===-- NVPTXPeephole.cpp - NVPTX Peephole Optimiztions -------------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXPrologEpilogPass.cpp b/lib/Target/NVPTX/NVPTXPrologEpilogPass.cpp index 2ca0ccf2dfa7..4c5a9adf1f65 100644 --- a/lib/Target/NVPTX/NVPTXPrologEpilogPass.cpp +++ b/lib/Target/NVPTX/NVPTXPrologEpilogPass.cpp @@ -1,9 +1,8 @@ //===-- NVPTXPrologEpilogPass.cpp - NVPTX prolog/epilog inserter ----------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -73,8 +72,8 @@ bool NVPTXPrologEpilogPass::runOnMachineFunction(MachineFunction &MF) { TFI.getFrameIndexReference(MF, MI.getOperand(0).getIndex(), Reg); MI.getOperand(0).ChangeToRegister(Reg, /*isDef=*/false); MI.getOperand(0).setIsDebug(); - auto *DIExpr = DIExpression::prepend(MI.getDebugExpression(), - DIExpression::NoDeref, Offset); + auto *DIExpr = DIExpression::prepend( + MI.getDebugExpression(), DIExpression::ApplyOffset, Offset); MI.getOperand(3).setMetadata(DIExpr); continue; } diff --git a/lib/Target/NVPTX/NVPTXProxyRegErasure.cpp b/lib/Target/NVPTX/NVPTXProxyRegErasure.cpp index f60d841c1683..af50a7465d1a 100644 --- a/lib/Target/NVPTX/NVPTXProxyRegErasure.cpp +++ b/lib/Target/NVPTX/NVPTXProxyRegErasure.cpp @@ -1,9 +1,8 @@ //===- NVPTXProxyRegErasure.cpp - NVPTX Proxy Register Instruction Erasure -==// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXRegisterInfo.cpp b/lib/Target/NVPTX/NVPTXRegisterInfo.cpp index 755738329881..5cdec0925b26 100644 --- a/lib/Target/NVPTX/NVPTXRegisterInfo.cpp +++ b/lib/Target/NVPTX/NVPTXRegisterInfo.cpp @@ -1,9 +1,8 @@ //===- NVPTXRegisterInfo.cpp - NVPTX Register Information -----------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -127,6 +126,6 @@ void NVPTXRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, MI.getOperand(FIOperandNum + 1).ChangeToImmediate(Offset); } -unsigned NVPTXRegisterInfo::getFrameRegister(const MachineFunction &MF) const { +Register NVPTXRegisterInfo::getFrameRegister(const MachineFunction &MF) const { return NVPTX::VRFrame; } diff --git a/lib/Target/NVPTX/NVPTXRegisterInfo.h b/lib/Target/NVPTX/NVPTXRegisterInfo.h index 6185a0b54cac..9ef6940daf86 100644 --- a/lib/Target/NVPTX/NVPTXRegisterInfo.h +++ b/lib/Target/NVPTX/NVPTXRegisterInfo.h @@ -1,9 +1,8 @@ //===- NVPTXRegisterInfo.h - NVPTX Register Information Impl ----*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -43,7 +42,7 @@ public: unsigned FIOperandNum, RegScavenger *RS = nullptr) const override; - unsigned getFrameRegister(const MachineFunction &MF) const override; + Register getFrameRegister(const MachineFunction &MF) const override; ManagedStringPool *getStrPool() const { return const_cast<ManagedStringPool *>(&ManagedStrPool); diff --git a/lib/Target/NVPTX/NVPTXRegisterInfo.td b/lib/Target/NVPTX/NVPTXRegisterInfo.td index f04764a9e9a3..4b755dcb55ff 100644 --- a/lib/Target/NVPTX/NVPTXRegisterInfo.td +++ b/lib/Target/NVPTX/NVPTXRegisterInfo.td @@ -1,9 +1,8 @@ //===-- NVPTXRegisterInfo.td - NVPTX Register defs ---------*- tablegen -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// diff --git a/lib/Target/NVPTX/NVPTXReplaceImageHandles.cpp b/lib/Target/NVPTX/NVPTXReplaceImageHandles.cpp index 82befe4b101b..e213089e4085 100644 --- a/lib/Target/NVPTX/NVPTXReplaceImageHandles.cpp +++ b/lib/Target/NVPTX/NVPTXReplaceImageHandles.cpp @@ -1,9 +1,8 @@ //===-- NVPTXReplaceImageHandles.cpp - Replace image handles for Fermi ----===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -17,6 +16,7 @@ #include "NVPTXMachineFunctionInfo.h" #include "NVPTXSubtarget.h" #include "NVPTXTargetMachine.h" +#include "MCTargetDesc/NVPTXBaseInfo.h" #include "llvm/ADT/DenseSet.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" diff --git a/lib/Target/NVPTX/NVPTXSubtarget.cpp b/lib/Target/NVPTX/NVPTXSubtarget.cpp index acbee86ae386..357826c2d19c 100644 --- a/lib/Target/NVPTX/NVPTXSubtarget.cpp +++ b/lib/Target/NVPTX/NVPTXSubtarget.cpp @@ -1,9 +1,8 @@ //===- NVPTXSubtarget.cpp - NVPTX Subtarget Information -------------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXSubtarget.h b/lib/Target/NVPTX/NVPTXSubtarget.h index b02822a099d9..0e9fa1fd3e56 100644 --- a/lib/Target/NVPTX/NVPTXSubtarget.h +++ b/lib/Target/NVPTX/NVPTXSubtarget.h @@ -1,9 +1,8 @@ //=====-- NVPTXSubtarget.h - Define Subtarget for the NVPTX ---*- C++ -*--====// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXTargetMachine.cpp b/lib/Target/NVPTX/NVPTXTargetMachine.cpp index 8ec0ddb9b3d5..11b3fe2fa3d3 100644 --- a/lib/Target/NVPTX/NVPTXTargetMachine.cpp +++ b/lib/Target/NVPTX/NVPTXTargetMachine.cpp @@ -1,9 +1,8 @@ //===-- NVPTXTargetMachine.cpp - Define TargetMachine for NVPTX -----------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // @@ -17,6 +16,7 @@ #include "NVPTXLowerAggrCopies.h" #include "NVPTXTargetObjectFile.h" #include "NVPTXTargetTransformInfo.h" +#include "TargetInfo/NVPTXTargetInfo.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/Triple.h" #include "llvm/Analysis/TargetTransformInfo.h" @@ -167,8 +167,16 @@ public: void addMachineSSAOptimization() override; FunctionPass *createTargetRegisterAllocator(bool) override; - void addFastRegAlloc(FunctionPass *RegAllocPass) override; - void addOptimizedRegAlloc(FunctionPass *RegAllocPass) override; + void addFastRegAlloc() override; + void addOptimizedRegAlloc() override; + + bool addRegAssignmentFast() override { + llvm_unreachable("should not be used"); + } + + bool addRegAssignmentOptimized() override { + llvm_unreachable("should not be used"); + } private: // If the opt level is aggressive, add GVN; otherwise, add EarlyCSE. This @@ -323,15 +331,12 @@ FunctionPass *NVPTXPassConfig::createTargetRegisterAllocator(bool) { return nullptr; // No reg alloc } -void NVPTXPassConfig::addFastRegAlloc(FunctionPass *RegAllocPass) { - assert(!RegAllocPass && "NVPTX uses no regalloc!"); +void NVPTXPassConfig::addFastRegAlloc() { addPass(&PHIEliminationID); addPass(&TwoAddressInstructionPassID); } -void NVPTXPassConfig::addOptimizedRegAlloc(FunctionPass *RegAllocPass) { - assert(!RegAllocPass && "NVPTX uses no regalloc!"); - +void NVPTXPassConfig::addOptimizedRegAlloc() { addPass(&ProcessImplicitDefsID); addPass(&LiveVariablesID); addPass(&MachineLoopInfoID); diff --git a/lib/Target/NVPTX/NVPTXTargetMachine.h b/lib/Target/NVPTX/NVPTXTargetMachine.h index ca540b8e0389..d84600c74e29 100644 --- a/lib/Target/NVPTX/NVPTXTargetMachine.h +++ b/lib/Target/NVPTX/NVPTXTargetMachine.h @@ -1,9 +1,8 @@ //===-- NVPTXTargetMachine.h - Define TargetMachine for NVPTX ---*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVPTXTargetObjectFile.h b/lib/Target/NVPTX/NVPTXTargetObjectFile.h index c706b053ab8f..ab2a93b75922 100644 --- a/lib/Target/NVPTX/NVPTXTargetObjectFile.h +++ b/lib/Target/NVPTX/NVPTXTargetObjectFile.h @@ -1,9 +1,8 @@ //===-- NVPTXTargetObjectFile.h - NVPTX Object Info -------------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// diff --git a/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp b/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp index 307654aed37f..be0416f90fca 100644 --- a/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp +++ b/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp @@ -1,9 +1,8 @@ //===-- NVPTXTargetTransformInfo.cpp - NVPTX specific TTI -----------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// @@ -39,7 +38,6 @@ static bool readsLaneId(const IntrinsicInst *II) { static bool isNVVMAtomic(const IntrinsicInst *II) { switch (II->getIntrinsicID()) { default: return false; - case Intrinsic::nvvm_atomic_load_add_f32: case Intrinsic::nvvm_atomic_load_inc_32: case Intrinsic::nvvm_atomic_load_dec_32: diff --git a/lib/Target/NVPTX/NVPTXTargetTransformInfo.h b/lib/Target/NVPTX/NVPTXTargetTransformInfo.h index 14e93f7447dd..b179a28fa713 100644 --- a/lib/Target/NVPTX/NVPTXTargetTransformInfo.h +++ b/lib/Target/NVPTX/NVPTXTargetTransformInfo.h @@ -1,9 +1,8 @@ //===-- NVPTXTargetTransformInfo.h - NVPTX specific TTI ---------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// /// \file @@ -17,8 +16,8 @@ #ifndef LLVM_LIB_TARGET_NVPTX_NVPTXTARGETTRANSFORMINFO_H #define LLVM_LIB_TARGET_NVPTX_NVPTXTARGETTRANSFORMINFO_H -#include "NVPTX.h" #include "NVPTXTargetMachine.h" +#include "MCTargetDesc/NVPTXBaseInfo.h" #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/CodeGen/BasicTTIImpl.h" #include "llvm/CodeGen/TargetLowering.h" diff --git a/lib/Target/NVPTX/NVPTXUtilities.cpp b/lib/Target/NVPTX/NVPTXUtilities.cpp index e464f474b1d5..665eb1383253 100644 --- a/lib/Target/NVPTX/NVPTXUtilities.cpp +++ b/lib/Target/NVPTX/NVPTXUtilities.cpp @@ -1,13 +1,13 @@ //===- NVPTXUtilities.cpp - Utility Functions -----------------------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 contains miscellaneous utility functions +// //===----------------------------------------------------------------------===// #include "NVPTXUtilities.h" diff --git a/lib/Target/NVPTX/NVPTXUtilities.h b/lib/Target/NVPTX/NVPTXUtilities.h index a0cc4e78ac21..bf1524194cfb 100644 --- a/lib/Target/NVPTX/NVPTXUtilities.h +++ b/lib/Target/NVPTX/NVPTXUtilities.h @@ -1,9 +1,8 @@ //===-- NVPTXUtilities - Utilities -----------------------------*- C++ -*-====// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVVMIntrRange.cpp b/lib/Target/NVPTX/NVVMIntrRange.cpp index 11277f5ba596..5cf7b6691e63 100644 --- a/lib/Target/NVPTX/NVVMIntrRange.cpp +++ b/lib/Target/NVPTX/NVVMIntrRange.cpp @@ -1,9 +1,8 @@ //===- NVVMIntrRange.cpp - Set !range metadata for NVVM intrinsics --------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/NVVMReflect.cpp b/lib/Target/NVPTX/NVVMReflect.cpp index 64c262664fda..634a052e2ee7 100644 --- a/lib/Target/NVPTX/NVVMReflect.cpp +++ b/lib/Target/NVPTX/NVVMReflect.cpp @@ -1,9 +1,8 @@ //===- NVVMReflect.cpp - NVVM Emulate conditional compilation -------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// // diff --git a/lib/Target/NVPTX/TargetInfo/NVPTXTargetInfo.cpp b/lib/Target/NVPTX/TargetInfo/NVPTXTargetInfo.cpp index 803d643844f8..2c71ec58ec42 100644 --- a/lib/Target/NVPTX/TargetInfo/NVPTXTargetInfo.cpp +++ b/lib/Target/NVPTX/TargetInfo/NVPTXTargetInfo.cpp @@ -1,14 +1,12 @@ //===-- NVPTXTargetInfo.cpp - NVPTX Target Implementation -----------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// 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 // //===----------------------------------------------------------------------===// -#include "NVPTX.h" -#include "llvm/IR/Module.h" +#include "TargetInfo/NVPTXTargetInfo.h" #include "llvm/Support/TargetRegistry.h" using namespace llvm; diff --git a/lib/Target/NVPTX/TargetInfo/NVPTXTargetInfo.h b/lib/Target/NVPTX/TargetInfo/NVPTXTargetInfo.h new file mode 100644 index 000000000000..5c5691349ae9 --- /dev/null +++ b/lib/Target/NVPTX/TargetInfo/NVPTXTargetInfo.h @@ -0,0 +1,21 @@ +//===-- NVPTXTargetInfo.h - NVPTX Target Implementation ---------*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_NVPTX_TARGETINFO_NVPTXTARGETINFO_H +#define LLVM_LIB_TARGET_NVPTX_TARGETINFO_NVPTXTARGETINFO_H + +namespace llvm { + +class Target; + +Target &getTheNVPTXTarget32(); +Target &getTheNVPTXTarget64(); + +} // namespace llvm + +#endif // LLVM_LIB_TARGET_NVPTX_TARGETINFO_NVPTXTARGETINFO_H |
