mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
7bfbc12128
[DebugInfo] Add debug locations to constant SD nodes This adds debug location to constant nodes of Selection DAG and updates all places that create constants to pass debug locations (see PR13269). Can't guarantee that all locations are correct, but in a lot of cases choice is obvious, so most of them should be. At least all tests pass. Tests for these changes do not cover everything, instead just check it for SDNodes, ARM and AArch64 where it's easy to get incorrect locations on constants. This is not complete fix as FastISel contains workaround for wrong debug locations, which drops locations from instructions on processing constants, but there isn't currently a way to use debug locations from constants there as llvm::Constant doesn't cache it (yet). Although this is a bit different issue, not directly related to these changes. Differential Revision: http://reviews.llvm.org/D9084 llvm-svn: 235989
101 lines
3.3 KiB
C++
101 lines
3.3 KiB
C++
//===-- 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.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines an instruction selector for the NVPTX target.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_NVPTX_NVPTXISELDAGTODAG_H
|
|
#define LLVM_LIB_TARGET_NVPTX_NVPTXISELDAGTODAG_H
|
|
|
|
#include "NVPTX.h"
|
|
#include "NVPTXISelLowering.h"
|
|
#include "NVPTXRegisterInfo.h"
|
|
#include "NVPTXTargetMachine.h"
|
|
#include "llvm/CodeGen/SelectionDAGISel.h"
|
|
#include "llvm/IR/Intrinsics.h"
|
|
#include "llvm/Support/Compiler.h"
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
|
|
class LLVM_LIBRARY_VISIBILITY NVPTXDAGToDAGISel : public SelectionDAGISel {
|
|
const NVPTXTargetMachine &TM;
|
|
|
|
// If true, generate mul.wide from sext and mul
|
|
bool doMulWide;
|
|
|
|
int getDivF32Level() const;
|
|
bool usePrecSqrtF32() const;
|
|
bool useF32FTZ() const;
|
|
bool allowFMA() const;
|
|
|
|
public:
|
|
explicit NVPTXDAGToDAGISel(NVPTXTargetMachine &tm,
|
|
CodeGenOpt::Level OptLevel);
|
|
|
|
// Pass Name
|
|
const char *getPassName() const override {
|
|
return "NVPTX DAG->DAG Pattern Instruction Selection";
|
|
}
|
|
bool runOnMachineFunction(MachineFunction &MF) override;
|
|
const NVPTXSubtarget *Subtarget;
|
|
|
|
bool SelectInlineAsmMemoryOperand(const SDValue &Op,
|
|
unsigned ConstraintID,
|
|
std::vector<SDValue> &OutOps) override;
|
|
private:
|
|
// Include the pieces autogenerated from the target description.
|
|
#include "NVPTXGenDAGISel.inc"
|
|
|
|
SDNode *Select(SDNode *N) override;
|
|
SDNode *SelectIntrinsicNoChain(SDNode *N);
|
|
SDNode *SelectIntrinsicChain(SDNode *N);
|
|
SDNode *SelectTexSurfHandle(SDNode *N);
|
|
SDNode *SelectLoad(SDNode *N);
|
|
SDNode *SelectLoadVector(SDNode *N);
|
|
SDNode *SelectLDGLDU(SDNode *N);
|
|
SDNode *SelectStore(SDNode *N);
|
|
SDNode *SelectStoreVector(SDNode *N);
|
|
SDNode *SelectLoadParam(SDNode *N);
|
|
SDNode *SelectStoreRetval(SDNode *N);
|
|
SDNode *SelectStoreParam(SDNode *N);
|
|
SDNode *SelectAddrSpaceCast(SDNode *N);
|
|
SDNode *SelectTextureIntrinsic(SDNode *N);
|
|
SDNode *SelectSurfaceIntrinsic(SDNode *N);
|
|
SDNode *SelectBFE(SDNode *N);
|
|
|
|
inline SDValue getI32Imm(unsigned Imm, SDLoc DL) {
|
|
return CurDAG->getTargetConstant(Imm, DL, MVT::i32);
|
|
}
|
|
|
|
// Match direct address complex pattern.
|
|
bool SelectDirectAddr(SDValue N, SDValue &Address);
|
|
|
|
bool SelectADDRri_imp(SDNode *OpNode, SDValue Addr, SDValue &Base,
|
|
SDValue &Offset, MVT mvt);
|
|
bool SelectADDRri(SDNode *OpNode, SDValue Addr, SDValue &Base,
|
|
SDValue &Offset);
|
|
bool SelectADDRri64(SDNode *OpNode, SDValue Addr, SDValue &Base,
|
|
SDValue &Offset);
|
|
|
|
bool SelectADDRsi_imp(SDNode *OpNode, SDValue Addr, SDValue &Base,
|
|
SDValue &Offset, MVT mvt);
|
|
bool SelectADDRsi(SDNode *OpNode, SDValue Addr, SDValue &Base,
|
|
SDValue &Offset);
|
|
bool SelectADDRsi64(SDNode *OpNode, SDValue Addr, SDValue &Base,
|
|
SDValue &Offset);
|
|
|
|
bool ChkMemSDNodeAddressSpace(SDNode *N, unsigned int spN) const;
|
|
|
|
};
|
|
}
|
|
|
|
#endif
|