The patch adds SPIRVPrepareFunctions pass, which modifies function signatures containing aggregate arguments and/or return values before IR translation. Information about the original signatures is stored in metadata. It is used during call lowering to restore correct SPIR-V types of function arguments and return values. This pass also substitutes some llvm intrinsic calls to function calls, generating the necessary functions in the module, as the SPIRV translator does. The patch also includes changes in other modules, fixing errors and enabling many SPIR-V features that were omitted earlier. And 15 LIT tests are also added to demonstrate the new functionality. Differential Revision: https://reviews.llvm.org/D129730 Co-authored-by: Aleksandr Bezzubikov <zuban32s@gmail.com> Co-authored-by: Michal Paszkowski <michal.paszkowski@outlook.com> Co-authored-by: Andrey Tretyakov <andrey1.tretyakov@intel.com> Co-authored-by: Konrad Trifunovic <konrad.trifunovic@intel.com>
68 lines
2.5 KiB
C++
68 lines
2.5 KiB
C++
//===-- SPIRVSubtarget.cpp - SPIR-V Subtarget Information ------*- 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the SPIR-V specific subclass of TargetSubtargetInfo.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "SPIRVSubtarget.h"
|
|
#include "SPIRV.h"
|
|
#include "SPIRVGlobalRegistry.h"
|
|
#include "SPIRVLegalizerInfo.h"
|
|
#include "SPIRVRegisterBankInfo.h"
|
|
#include "SPIRVTargetMachine.h"
|
|
#include "llvm/MC/TargetRegistry.h"
|
|
#include "llvm/Support/Host.h"
|
|
|
|
using namespace llvm;
|
|
|
|
#define DEBUG_TYPE "spirv-subtarget"
|
|
|
|
#define GET_SUBTARGETINFO_TARGET_DESC
|
|
#define GET_SUBTARGETINFO_CTOR
|
|
#include "SPIRVGenSubtargetInfo.inc"
|
|
|
|
// Compare version numbers, but allow 0 to mean unspecified.
|
|
static bool isAtLeastVer(uint32_t Target, uint32_t VerToCompareTo) {
|
|
return Target == 0 || Target >= VerToCompareTo;
|
|
}
|
|
|
|
static unsigned computePointerSize(const Triple &TT) {
|
|
const auto Arch = TT.getArch();
|
|
// TODO: unify this with pointers legalization.
|
|
assert(TT.isSPIRV());
|
|
return Arch == Triple::spirv32 ? 32 : 64;
|
|
}
|
|
|
|
SPIRVSubtarget::SPIRVSubtarget(const Triple &TT, const std::string &CPU,
|
|
const std::string &FS,
|
|
const SPIRVTargetMachine &TM)
|
|
: SPIRVGenSubtargetInfo(TT, CPU, /*TuneCPU=*/CPU, FS),
|
|
PointerSize(computePointerSize(TT)), SPIRVVersion(0), InstrInfo(),
|
|
FrameLowering(initSubtargetDependencies(CPU, FS)), TLInfo(TM, *this) {
|
|
GR = std::make_unique<SPIRVGlobalRegistry>(PointerSize);
|
|
CallLoweringInfo = std::make_unique<SPIRVCallLowering>(TLInfo, GR.get());
|
|
Legalizer = std::make_unique<SPIRVLegalizerInfo>(*this);
|
|
RegBankInfo = std::make_unique<SPIRVRegisterBankInfo>();
|
|
InstSelector.reset(
|
|
createSPIRVInstructionSelector(TM, *this, *RegBankInfo.get()));
|
|
}
|
|
|
|
SPIRVSubtarget &SPIRVSubtarget::initSubtargetDependencies(StringRef CPU,
|
|
StringRef FS) {
|
|
ParseSubtargetFeatures(CPU, /*TuneCPU=*/CPU, FS);
|
|
if (SPIRVVersion == 0)
|
|
SPIRVVersion = 14;
|
|
return *this;
|
|
}
|
|
|
|
// If the SPIR-V version is >= 1.4 we can call OpPtrEqual and OpPtrNotEqual.
|
|
bool SPIRVSubtarget::canDirectlyComparePointers() const {
|
|
return isAtLeastVer(SPIRVVersion, 14);
|
|
}
|