mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-28 14:10:55 +00:00
[CodeGen] Fix some Clang-tidy modernize-use-default-member-init and Include What You Use warnings; other minor fixes (NFC).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314363 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2036b38fe1
commit
5c883452a8
@ -1,4 +1,4 @@
|
||||
//===- MILexer.cpp - Machine instructions lexer implementation ----------===//
|
||||
//===- MILexer.cpp - Machine instructions lexer implementation ------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -12,27 +12,33 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "MILexer.h"
|
||||
#include "llvm/ADT/APSInt.h"
|
||||
#include "llvm/ADT/None.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/ADT/StringSwitch.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <cctype>
|
||||
#include <string>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
|
||||
typedef function_ref<void(StringRef::iterator Loc, const Twine &)>
|
||||
ErrorCallbackType;
|
||||
using ErrorCallbackType =
|
||||
function_ref<void(StringRef::iterator Loc, const Twine &)>;
|
||||
|
||||
/// This class provides a way to iterate and get characters from the source
|
||||
/// string.
|
||||
class Cursor {
|
||||
const char *Ptr;
|
||||
const char *End;
|
||||
const char *Ptr = nullptr;
|
||||
const char *End = nullptr;
|
||||
|
||||
public:
|
||||
Cursor(NoneType) : Ptr(nullptr), End(nullptr) {}
|
||||
Cursor(NoneType) {}
|
||||
|
||||
explicit Cursor(StringRef Str) {
|
||||
Ptr = Str.data();
|
||||
|
@ -1,4 +1,4 @@
|
||||
//===- MILexer.h - Lexer for machine instructions -------------------------===//
|
||||
//===- MILexer.h - Lexer for machine instructions ---------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -18,7 +18,7 @@
|
||||
#include "llvm/ADT/APSInt.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include <functional>
|
||||
#include <string>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
@ -133,14 +133,14 @@ struct MIToken {
|
||||
};
|
||||
|
||||
private:
|
||||
TokenKind Kind;
|
||||
TokenKind Kind = Error;
|
||||
StringRef Range;
|
||||
StringRef StringValue;
|
||||
std::string StringValueStorage;
|
||||
APSInt IntVal;
|
||||
|
||||
public:
|
||||
MIToken() : Kind(Error) {}
|
||||
MIToken() = default;
|
||||
|
||||
MIToken &reset(TokenKind Kind, StringRef Range);
|
||||
|
||||
@ -204,4 +204,4 @@ StringRef lexMIToken(
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
#endif // LLVM_LIB_CODEGEN_MIRPARSER_MILEXER_H
|
||||
|
@ -1,5 +1,5 @@
|
||||
//=== ScalarizeMaskedMemIntrin.cpp - Scalarize unsupported masked mem ===//
|
||||
//=== instrinsics ===//
|
||||
//===- ScalarizeMaskedMemIntrin.cpp - Scalarize unsupported masked mem ----===//
|
||||
// instrinsics
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -14,10 +14,26 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/Analysis/TargetTransformInfo.h"
|
||||
#include "llvm/IR/BasicBlock.h"
|
||||
#include "llvm/IR/Constant.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/IRBuilder.h"
|
||||
#include "llvm/IR/InstrTypes.h"
|
||||
#include "llvm/IR/Instruction.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/IR/Value.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Target/TargetSubtargetInfo.h"
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
@ -26,13 +42,15 @@ using namespace llvm;
|
||||
namespace {
|
||||
|
||||
class ScalarizeMaskedMemIntrin : public FunctionPass {
|
||||
const TargetTransformInfo *TTI;
|
||||
const TargetTransformInfo *TTI = nullptr;
|
||||
|
||||
public:
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
explicit ScalarizeMaskedMemIntrin() : FunctionPass(ID), TTI(nullptr) {
|
||||
|
||||
explicit ScalarizeMaskedMemIntrin() : FunctionPass(ID) {
|
||||
initializeScalarizeMaskedMemIntrinPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
bool runOnFunction(Function &F) override;
|
||||
|
||||
StringRef getPassName() const override {
|
||||
@ -47,9 +65,11 @@ private:
|
||||
bool optimizeBlock(BasicBlock &BB, bool &ModifiedDT);
|
||||
bool optimizeCallInst(CallInst *CI, bool &ModifiedDT);
|
||||
};
|
||||
} // namespace
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
char ScalarizeMaskedMemIntrin::ID = 0;
|
||||
|
||||
INITIALIZE_PASS(ScalarizeMaskedMemIntrin, DEBUG_TYPE,
|
||||
"Scalarize unsupported masked memory intrinsics", false, false)
|
||||
|
||||
@ -157,7 +177,6 @@ static void scalarizeMaskedLoad(CallInst *CI) {
|
||||
Value *PrevPhi = UndefVal;
|
||||
|
||||
for (unsigned Idx = 0; Idx < VectorWidth; ++Idx) {
|
||||
|
||||
// Fill the "else" block, created in the previous iteration
|
||||
//
|
||||
// %res.phi.else3 = phi <16 x i32> [ %11, %cond.load1 ], [ %res.phi.else, %else ]
|
||||
@ -289,7 +308,6 @@ static void scalarizeMaskedStore(CallInst *CI) {
|
||||
}
|
||||
|
||||
for (unsigned Idx = 0; Idx < VectorWidth; ++Idx) {
|
||||
|
||||
// Fill the "else" block, created in the previous iteration
|
||||
//
|
||||
// %mask_1 = extractelement <16 x i1> %mask, i32 Idx
|
||||
@ -409,7 +427,6 @@ static void scalarizeMaskedGather(CallInst *CI) {
|
||||
Value *PrevPhi = UndefVal;
|
||||
|
||||
for (unsigned Idx = 0; Idx < VectorWidth; ++Idx) {
|
||||
|
||||
// Fill the "else" block, created in the previous iteration
|
||||
//
|
||||
// %Mask1 = extractelement <16 x i1> %Mask, i32 1
|
||||
@ -611,13 +628,12 @@ bool ScalarizeMaskedMemIntrin::optimizeBlock(BasicBlock &BB, bool &ModifiedDT) {
|
||||
|
||||
bool ScalarizeMaskedMemIntrin::optimizeCallInst(CallInst *CI,
|
||||
bool &ModifiedDT) {
|
||||
|
||||
IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI);
|
||||
if (II) {
|
||||
switch (II->getIntrinsicID()) {
|
||||
default:
|
||||
break;
|
||||
case Intrinsic::masked_load: {
|
||||
case Intrinsic::masked_load:
|
||||
// Scalarize unsupported vector masked load
|
||||
if (!TTI->isLegalMaskedLoad(CI->getType())) {
|
||||
scalarizeMaskedLoad(CI);
|
||||
@ -625,24 +641,21 @@ bool ScalarizeMaskedMemIntrin::optimizeCallInst(CallInst *CI,
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case Intrinsic::masked_store: {
|
||||
case Intrinsic::masked_store:
|
||||
if (!TTI->isLegalMaskedStore(CI->getArgOperand(0)->getType())) {
|
||||
scalarizeMaskedStore(CI);
|
||||
ModifiedDT = true;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case Intrinsic::masked_gather: {
|
||||
case Intrinsic::masked_gather:
|
||||
if (!TTI->isLegalMaskedGather(CI->getType())) {
|
||||
scalarizeMaskedGather(CI);
|
||||
ModifiedDT = true;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case Intrinsic::masked_scatter: {
|
||||
case Intrinsic::masked_scatter:
|
||||
if (!TTI->isLegalMaskedScatter(CI->getArgOperand(0)->getType())) {
|
||||
scalarizeMaskedScatter(CI);
|
||||
ModifiedDT = true;
|
||||
@ -650,7 +663,6 @@ bool ScalarizeMaskedMemIntrin::optimizeCallInst(CallInst *CI,
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -1,4 +1,4 @@
|
||||
//===-- SelectionDAGBuilder.cpp - Selection-DAG building ------------------===//
|
||||
//===- SelectionDAGBuilder.cpp - Selection-DAG building -------------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -12,52 +12,88 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "SelectionDAGBuilder.h"
|
||||
#include "SDNodeDbgValue.h"
|
||||
#include "llvm/ADT/APFloat.h"
|
||||
#include "llvm/ADT/APInt.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/None.h"
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/ADT/SmallSet.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/ADT/Triple.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/Analysis/AliasAnalysis.h"
|
||||
#include "llvm/Analysis/BranchProbabilityInfo.h"
|
||||
#include "llvm/Analysis/ConstantFolding.h"
|
||||
#include "llvm/Analysis/EHPersonalities.h"
|
||||
#include "llvm/Analysis/Loads.h"
|
||||
#include "llvm/Analysis/MemoryLocation.h"
|
||||
#include "llvm/Analysis/TargetLibraryInfo.h"
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/Analysis/VectorUtils.h"
|
||||
#include "llvm/CodeGen/Analysis.h"
|
||||
#include "llvm/CodeGen/FastISel.h"
|
||||
#include "llvm/CodeGen/FunctionLoweringInfo.h"
|
||||
#include "llvm/CodeGen/GCMetadata.h"
|
||||
#include "llvm/CodeGen/GCStrategy.h"
|
||||
#include "llvm/CodeGen/ISDOpcodes.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineInstr.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineJumpTableInfo.h"
|
||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||
#include "llvm/CodeGen/MachineModuleInfo.h"
|
||||
#include "llvm/CodeGen/MachineOperand.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/MachineValueType.h"
|
||||
#include "llvm/CodeGen/RuntimeLibcalls.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
||||
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
|
||||
#include "llvm/CodeGen/StackMaps.h"
|
||||
#include "llvm/CodeGen/ValueTypes.h"
|
||||
#include "llvm/CodeGen/WinEHFuncInfo.h"
|
||||
#include "llvm/IR/Argument.h"
|
||||
#include "llvm/IR/Attributes.h"
|
||||
#include "llvm/IR/BasicBlock.h"
|
||||
#include "llvm/IR/CFG.h"
|
||||
#include "llvm/IR/CallSite.h"
|
||||
#include "llvm/IR/CallingConv.h"
|
||||
#include "llvm/IR/Constant.h"
|
||||
#include "llvm/IR/ConstantRange.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/DebugInfo.h"
|
||||
#include "llvm/IR/DebugInfoMetadata.h"
|
||||
#include "llvm/IR/DebugLoc.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/DIBuilder.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
#include "llvm/IR/GetElementPtrTypeIterator.h"
|
||||
#include "llvm/IR/GlobalVariable.h"
|
||||
#include "llvm/IR/InlineAsm.h"
|
||||
#include "llvm/IR/InstrTypes.h"
|
||||
#include "llvm/IR/Instruction.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/IR/Operator.h"
|
||||
#include "llvm/IR/Statepoint.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/IR/User.h"
|
||||
#include "llvm/IR/Value.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCSymbol.h"
|
||||
#include "llvm/Support/AtomicOrdering.h"
|
||||
#include "llvm/Support/BranchProbability.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/CodeGen.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
@ -66,10 +102,23 @@
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Target/TargetIntrinsicInfo.h"
|
||||
#include "llvm/Target/TargetLowering.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetOpcodes.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
#include "llvm/Target/TargetSubtargetInfo.h"
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
#include <iterator>
|
||||
#include <limits>
|
||||
#include <numeric>
|
||||
#include <tuple>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "isel"
|
||||
@ -84,6 +133,7 @@ LimitFPPrecision("limit-float-precision",
|
||||
"for some float libcalls"),
|
||||
cl::location(LimitFloatPrecision),
|
||||
cl::init(0));
|
||||
|
||||
// Limit the width of DAG chains. This is important in general to prevent
|
||||
// DAG-based analysis from blowing up. For example, alias analysis and
|
||||
// load clustering may not complete in reasonable time. It is difficult to
|
||||
@ -102,7 +152,7 @@ static const unsigned MaxParallelChains = 64;
|
||||
|
||||
// True if the Value passed requires ABI mangling as it is a parameter to a
|
||||
// function or a return value from a function which is not an intrinsic.
|
||||
static bool isABIRegCopy(const Value * V) {
|
||||
static bool isABIRegCopy(const Value *V) {
|
||||
const bool IsRetInst = V && isa<ReturnInst>(V);
|
||||
const bool IsCallInst = V && isa<CallInst>(V);
|
||||
const bool IsInLineAsm =
|
||||
@ -555,7 +605,6 @@ static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &DL,
|
||||
SDValue Val, SDValue *Parts, unsigned NumParts,
|
||||
MVT PartVT, const Value *V,
|
||||
bool IsABIRegCopy) {
|
||||
|
||||
EVT ValueVT = Val.getValueType();
|
||||
assert(ValueVT.isVector() && "Not a vector");
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
@ -601,7 +650,6 @@ static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &DL,
|
||||
Val = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, DL, PartVT, Val,
|
||||
DAG.getConstant(0, DL, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
|
||||
} else {
|
||||
assert(PartVT.getSizeInBits() > ValueVT.getSizeInBits() &&
|
||||
"lossy conversion of vector to scalar type");
|
||||
@ -678,8 +726,6 @@ static void getCopyToPartsVector(SelectionDAG &DAG, const SDLoc &DL,
|
||||
}
|
||||
}
|
||||
|
||||
RegsForValue::RegsForValue() { IsABIMangled = false; }
|
||||
|
||||
RegsForValue::RegsForValue(const SmallVector<unsigned, 4> ®s, MVT regvt,
|
||||
EVT valuevt, bool IsABIMangledValue)
|
||||
: ValueVTs(1, valuevt), RegVTs(1, regvt), Regs(regs),
|
||||
@ -1622,7 +1668,6 @@ static bool InBlock(const Value *V, const BasicBlock *BB) {
|
||||
/// EmitBranchForMergedCondition - Helper method for FindMergedConditions.
|
||||
/// This function emits a branch and is used at the leaves of an OR or an
|
||||
/// AND operator tree.
|
||||
///
|
||||
void
|
||||
SelectionDAGBuilder::EmitBranchForMergedCondition(const Value *Cond,
|
||||
MachineBasicBlock *TBB,
|
||||
@ -1866,7 +1911,6 @@ void SelectionDAGBuilder::visitBr(const BranchInst &I) {
|
||||
// je foo
|
||||
// cmp D, E
|
||||
// jle foo
|
||||
//
|
||||
if (const BinaryOperator *BOp = dyn_cast<BinaryOperator>(CondVal)) {
|
||||
Instruction::BinaryOps Opcode = BOp->getOpcode();
|
||||
if (!DAG.getTargetLoweringInfo().isJumpExpensive() && BOp->hasOneUse() &&
|
||||
@ -2778,7 +2822,7 @@ void SelectionDAGBuilder::visitFCmp(const User &I) {
|
||||
// Check if the condition of the select has one use or two users that are both
|
||||
// selects with the same condition.
|
||||
static bool hasOnlySelectUsers(const Value *Cond) {
|
||||
return all_of(Cond->users(), [](const Value *V) {
|
||||
return llvm::all_of(Cond->users(), [](const Value *V) {
|
||||
return isa<SelectInst>(V);
|
||||
});
|
||||
}
|
||||
@ -3808,10 +3852,8 @@ void SelectionDAGBuilder::visitMaskedStore(const CallInst &I,
|
||||
// are looking for. If first operand of the GEP is a splat vector - we
|
||||
// extract the spalt value and use it as a uniform base.
|
||||
// In all other cases the function returns 'false'.
|
||||
//
|
||||
static bool getUniformBase(const Value* &Ptr, SDValue& Base, SDValue& Index,
|
||||
SelectionDAGBuilder* SDB) {
|
||||
|
||||
SelectionDAG& DAG = SDB->DAG;
|
||||
LLVMContext &Context = *DAG.getContext();
|
||||
|
||||
@ -4369,7 +4411,6 @@ static SDValue expandExp(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
|
||||
/// limited-precision mode.
|
||||
static SDValue expandLog(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
|
||||
const TargetLowering &TLI) {
|
||||
|
||||
// TODO: What fast-math-flags should be set on the floating-point nodes?
|
||||
|
||||
if (Op.getValueType() == MVT::f32 &&
|
||||
@ -4468,7 +4509,6 @@ static SDValue expandLog(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
|
||||
/// limited-precision mode.
|
||||
static SDValue expandLog2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
|
||||
const TargetLowering &TLI) {
|
||||
|
||||
// TODO: What fast-math-flags should be set on the floating-point nodes?
|
||||
|
||||
if (Op.getValueType() == MVT::f32 &&
|
||||
@ -4566,7 +4606,6 @@ static SDValue expandLog2(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
|
||||
/// limited-precision mode.
|
||||
static SDValue expandLog10(const SDLoc &dl, SDValue Op, SelectionDAG &DAG,
|
||||
const TargetLowering &TLI) {
|
||||
|
||||
// TODO: What fast-math-flags should be set on the floating-point nodes?
|
||||
|
||||
if (Op.getValueType() == MVT::f32 &&
|
||||
@ -4694,7 +4733,6 @@ static SDValue expandPow(const SDLoc &dl, SDValue LHS, SDValue RHS,
|
||||
return DAG.getNode(ISD::FPOW, dl, LHS.getValueType(), LHS, RHS);
|
||||
}
|
||||
|
||||
|
||||
/// ExpandPowI - Expand a llvm.powi intrinsic.
|
||||
static SDValue ExpandPowI(const SDLoc &DL, SDValue LHS, SDValue RHS,
|
||||
SelectionDAG &DAG) {
|
||||
@ -4788,7 +4826,7 @@ bool SelectionDAGBuilder::EmitFuncArgumentDbgValue(
|
||||
Optional<MachineOperand> Op;
|
||||
// Some arguments' frame index is recorded during argument lowering.
|
||||
int FI = FuncInfo.getArgumentFrameIndex(Arg);
|
||||
if (FI != INT_MAX)
|
||||
if (FI != std::numeric_limits<int>::max())
|
||||
Op = MachineOperand::CreateFI(FI);
|
||||
|
||||
if (!Op && N.getNode()) {
|
||||
@ -5128,7 +5166,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
|
||||
// Check if this variable can be described by a frame index, typically
|
||||
// either as a static alloca or a byval parameter.
|
||||
int FI = INT_MAX;
|
||||
int FI = std::numeric_limits<int>::max();
|
||||
if (const auto *AI =
|
||||
dyn_cast<AllocaInst>(Address->stripInBoundsConstantOffsets())) {
|
||||
if (AI->isStaticAlloca()) {
|
||||
@ -5144,7 +5182,7 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
// llvm.dbg.addr is control dependent and always generates indirect
|
||||
// DBG_VALUE instructions. llvm.dbg.declare is handled as a frame index in
|
||||
// the MachineFunction variable table.
|
||||
if (FI != INT_MAX) {
|
||||
if (FI != std::numeric_limits<int>::max()) {
|
||||
if (Intrinsic == Intrinsic::dbg_addr)
|
||||
DAG.AddDbgValue(DAG.getFrameIndexDbgValue(Variable, Expression, FI, dl,
|
||||
SDNodeOrder),
|
||||
@ -5250,12 +5288,11 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
case Intrinsic::eh_unwind_init:
|
||||
DAG.getMachineFunction().setCallsUnwindInit(true);
|
||||
return nullptr;
|
||||
case Intrinsic::eh_dwarf_cfa: {
|
||||
case Intrinsic::eh_dwarf_cfa:
|
||||
setValue(&I, DAG.getNode(ISD::EH_DWARF_CFA, sdl,
|
||||
TLI.getPointerTy(DAG.getDataLayout()),
|
||||
getValue(I.getArgOperand(0))));
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::eh_sjlj_callsite: {
|
||||
MachineModuleInfo &MMI = DAG.getMachineFunction().getMMI();
|
||||
ConstantInt *CI = dyn_cast<ConstantInt>(I.getArgOperand(0));
|
||||
@ -5284,17 +5321,14 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
DAG.setRoot(Op.getValue(1));
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::eh_sjlj_longjmp: {
|
||||
case Intrinsic::eh_sjlj_longjmp:
|
||||
DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_LONGJMP, sdl, MVT::Other,
|
||||
getRoot(), getValue(I.getArgOperand(0))));
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::eh_sjlj_setup_dispatch: {
|
||||
case Intrinsic::eh_sjlj_setup_dispatch:
|
||||
DAG.setRoot(DAG.getNode(ISD::EH_SJLJ_SETUP_DISPATCH, sdl, MVT::Other,
|
||||
getRoot()));
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
case Intrinsic::masked_gather:
|
||||
visitMaskedGather(I);
|
||||
return nullptr;
|
||||
@ -5572,11 +5606,10 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
DAG.setRoot(Res.getValue(1));
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::stackrestore: {
|
||||
case Intrinsic::stackrestore:
|
||||
Res = getValue(I.getArgOperand(0));
|
||||
DAG.setRoot(DAG.getNode(ISD::STACKRESTORE, sdl, MVT::Other, getRoot(), Res));
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::get_dynamic_area_offset: {
|
||||
SDValue Op = getRoot();
|
||||
EVT PtrTy = TLI.getPointerTy(DAG.getDataLayout());
|
||||
@ -5693,12 +5726,11 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
DAG.setRoot(Res);
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::adjust_trampoline: {
|
||||
case Intrinsic::adjust_trampoline:
|
||||
setValue(&I, DAG.getNode(ISD::ADJUST_TRAMPOLINE, sdl,
|
||||
TLI.getPointerTy(DAG.getDataLayout()),
|
||||
getValue(I.getArgOperand(0))));
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::gcroot: {
|
||||
MachineFunction &MF = DAG.getMachineFunction();
|
||||
const Function *F = MF.getFunction();
|
||||
@ -5720,11 +5752,10 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
setValue(&I, DAG.getNode(ISD::FLT_ROUNDS_, sdl, MVT::i32));
|
||||
return nullptr;
|
||||
|
||||
case Intrinsic::expect: {
|
||||
case Intrinsic::expect:
|
||||
// Just replace __builtin_expect(exp, c) with EXP.
|
||||
setValue(&I, getValue(I.getArgOperand(0)));
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
case Intrinsic::debugtrap:
|
||||
case Intrinsic::trap: {
|
||||
@ -5842,27 +5873,22 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
case Intrinsic::donothing:
|
||||
// ignore
|
||||
return nullptr;
|
||||
case Intrinsic::experimental_stackmap: {
|
||||
case Intrinsic::experimental_stackmap:
|
||||
visitStackmap(I);
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::experimental_patchpoint_void:
|
||||
case Intrinsic::experimental_patchpoint_i64: {
|
||||
case Intrinsic::experimental_patchpoint_i64:
|
||||
visitPatchpoint(&I);
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::experimental_gc_statepoint: {
|
||||
case Intrinsic::experimental_gc_statepoint:
|
||||
LowerStatepoint(ImmutableStatepoint(&I));
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::experimental_gc_result: {
|
||||
case Intrinsic::experimental_gc_result:
|
||||
visitGCResult(cast<GCResultInst>(I));
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::experimental_gc_relocate: {
|
||||
case Intrinsic::experimental_gc_relocate:
|
||||
visitGCRelocate(cast<GCRelocateInst>(I));
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::instrprof_increment:
|
||||
llvm_unreachable("instrprof failed to lower an increment");
|
||||
case Intrinsic::instrprof_value_profile:
|
||||
@ -5901,7 +5927,8 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
// Get the symbol that defines the frame offset.
|
||||
auto *Fn = cast<Function>(I.getArgOperand(0)->stripPointerCasts());
|
||||
auto *Idx = cast<ConstantInt>(I.getArgOperand(2));
|
||||
unsigned IdxVal = unsigned(Idx->getLimitedValue(INT_MAX));
|
||||
unsigned IdxVal =
|
||||
unsigned(Idx->getLimitedValue(std::numeric_limits<int>::max()));
|
||||
MCSymbol *FrameAllocSym =
|
||||
MF.getMMI().getContext().getOrCreateFrameAllocSymbol(
|
||||
GlobalValue::dropLLVMManglingEscape(Fn->getName()), IdxVal);
|
||||
@ -5982,12 +6009,10 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
case Intrinsic::experimental_vector_reduce_umax:
|
||||
case Intrinsic::experimental_vector_reduce_umin:
|
||||
case Intrinsic::experimental_vector_reduce_fmax:
|
||||
case Intrinsic::experimental_vector_reduce_fmin: {
|
||||
case Intrinsic::experimental_vector_reduce_fmin:
|
||||
visitVectorReduce(I, Intrinsic);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
|
||||
@ -6247,7 +6272,6 @@ void SelectionDAGBuilder::LowerCallTo(ImmutableCallSite CS, SDValue Callee,
|
||||
|
||||
static SDValue getMemCmpLoad(const Value *PtrVal, MVT LoadVT,
|
||||
SelectionDAGBuilder &Builder) {
|
||||
|
||||
// Check to see if this load can be trivially constant folded, e.g. if the
|
||||
// input is from a string literal.
|
||||
if (const Constant *LoadInput = dyn_cast<Constant>(PtrVal)) {
|
||||
@ -6793,7 +6817,7 @@ public:
|
||||
RegsForValue AssignedRegs;
|
||||
|
||||
explicit SDISelAsmOperandInfo(const TargetLowering::AsmOperandInfo &info)
|
||||
: TargetLowering::AsmOperandInfo(info), CallOperand(nullptr,0) {
|
||||
: TargetLowering::AsmOperandInfo(info), CallOperand(nullptr, 0) {
|
||||
}
|
||||
|
||||
/// Whether or not this operand accesses memory
|
||||
@ -6825,7 +6849,7 @@ public:
|
||||
// If this is an indirect operand, the operand is a pointer to the
|
||||
// accessed type.
|
||||
if (isIndirect) {
|
||||
llvm::PointerType *PtrTy = dyn_cast<PointerType>(OpTy);
|
||||
PointerType *PtrTy = dyn_cast<PointerType>(OpTy);
|
||||
if (!PtrTy)
|
||||
report_fatal_error("Indirect operand for inline asm not a pointer!");
|
||||
OpTy = PtrTy->getElementType();
|
||||
@ -6857,7 +6881,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
typedef SmallVector<SDISelAsmOperandInfo,16> SDISelAsmOperandInfoVector;
|
||||
using SDISelAsmOperandInfoVector = SmallVector<SDISelAsmOperandInfo, 16>;
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
@ -6937,7 +6961,6 @@ static SDValue getAddressForMemoryInput(SDValue Chain, const SDLoc &Location,
|
||||
/// allocation. This produces generally horrible, but correct, code.
|
||||
///
|
||||
/// OpInfo describes the operand.
|
||||
///
|
||||
static void GetRegistersForValue(SelectionDAG &DAG, const TargetLowering &TLI,
|
||||
const SDLoc &DL,
|
||||
SDISelAsmOperandInfo &OpInfo) {
|
||||
@ -7072,6 +7095,7 @@ static bool createVirtualRegs(SmallVector<unsigned, 4> &Regs, unsigned NumRegs,
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
class ExtraFlags {
|
||||
unsigned Flags = 0;
|
||||
|
||||
@ -7087,7 +7111,7 @@ public:
|
||||
Flags |= IA->getDialect() * InlineAsm::Extra_AsmDialect;
|
||||
}
|
||||
|
||||
void update(const llvm::TargetLowering::AsmOperandInfo &OpInfo) {
|
||||
void update(const TargetLowering::AsmOperandInfo &OpInfo) {
|
||||
// Ideally, we would only check against memory constraints. However, the
|
||||
// meaning of an Other constraint can be target-specific and we can't easily
|
||||
// reason about it. Therefore, be conservative and set MayLoad/MayStore
|
||||
@ -7105,10 +7129,10 @@ public:
|
||||
|
||||
unsigned get() const { return Flags; }
|
||||
};
|
||||
} // namespace
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
/// visitInlineAsm - Handle a call to an InlineAsm object.
|
||||
///
|
||||
void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
const InlineAsm *IA = cast<InlineAsm>(CS.getCalledValue());
|
||||
|
||||
@ -7267,13 +7291,13 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
RegsForValue RetValRegs;
|
||||
|
||||
// IndirectStoresToEmit - The set of stores to emit after the inline asm node.
|
||||
std::vector<std::pair<RegsForValue, Value*> > IndirectStoresToEmit;
|
||||
std::vector<std::pair<RegsForValue, Value *>> IndirectStoresToEmit;
|
||||
|
||||
for (unsigned i = 0, e = ConstraintOperands.size(); i != e; ++i) {
|
||||
SDISelAsmOperandInfo &OpInfo = ConstraintOperands[i];
|
||||
|
||||
switch (OpInfo.Type) {
|
||||
case InlineAsm::isOutput: {
|
||||
case InlineAsm::isOutput:
|
||||
if (OpInfo.ConstraintType != TargetLowering::C_RegisterClass &&
|
||||
OpInfo.ConstraintType != TargetLowering::C_Register) {
|
||||
// Memory output, or 'other' output (e.g. 'X' constraint).
|
||||
@ -7324,7 +7348,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
: InlineAsm::Kind_RegDef,
|
||||
false, 0, getCurSDLoc(), DAG, AsmNodeOperands);
|
||||
break;
|
||||
}
|
||||
|
||||
case InlineAsm::isInput: {
|
||||
SDValue InOperandVal = OpInfo.CallOperand;
|
||||
|
||||
@ -7457,7 +7481,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
dl, DAG, AsmNodeOperands);
|
||||
break;
|
||||
}
|
||||
case InlineAsm::isClobber: {
|
||||
case InlineAsm::isClobber:
|
||||
// Add the clobbered value to the operand list, so that the register
|
||||
// allocator is aware that the physreg got clobbered.
|
||||
if (!OpInfo.AssignedRegs.Regs.empty())
|
||||
@ -7466,7 +7490,6 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
AsmNodeOperands);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Finish up input operands. Set the input chain and add the flag last.
|
||||
@ -7513,7 +7536,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<std::pair<SDValue, const Value *> > StoresToEmit;
|
||||
std::vector<std::pair<SDValue, const Value *>> StoresToEmit;
|
||||
|
||||
// Process indirect outputs, first output all of the flagged copies out of
|
||||
// physregs.
|
||||
@ -7963,14 +7986,12 @@ void SelectionDAGBuilder::visitVectorReduce(const CallInst &I,
|
||||
case Intrinsic::experimental_vector_reduce_umin:
|
||||
Res = DAG.getNode(ISD::VECREDUCE_UMIN, dl, VT, Op1);
|
||||
break;
|
||||
case Intrinsic::experimental_vector_reduce_fmax: {
|
||||
case Intrinsic::experimental_vector_reduce_fmax:
|
||||
Res = DAG.getNode(ISD::VECREDUCE_FMAX, dl, VT, Op1, SDFlags);
|
||||
break;
|
||||
}
|
||||
case Intrinsic::experimental_vector_reduce_fmin: {
|
||||
case Intrinsic::experimental_vector_reduce_fmin:
|
||||
Res = DAG.getNode(ISD::VECREDUCE_FMIN, dl, VT, Op1, SDFlags);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
llvm_unreachable("Unhandled vector reduce intrinsic");
|
||||
}
|
||||
@ -8385,9 +8406,9 @@ static bool isOnlyUsedInEntryBlock(const Argument *A, bool FastISel) {
|
||||
return true;
|
||||
}
|
||||
|
||||
typedef DenseMap<const Argument *,
|
||||
std::pair<const AllocaInst *, const StoreInst *>>
|
||||
ArgCopyElisionMapTy;
|
||||
using ArgCopyElisionMapTy =
|
||||
DenseMap<const Argument *,
|
||||
std::pair<const AllocaInst *, const StoreInst *>>;
|
||||
|
||||
/// Scan the entry block of the function in FuncInfo for arguments that look
|
||||
/// like copies into a local alloca. Record any copied arguments in
|
||||
@ -8880,7 +8901,6 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
|
||||
/// directly add them, because expansion might result in multiple MBB's for one
|
||||
/// BB. As such, the start of the BB might correspond to a different MBB than
|
||||
/// the end.
|
||||
///
|
||||
void
|
||||
SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
|
||||
const TerminatorInst *TI = LLVMBB->getTerminator();
|
||||
@ -9694,7 +9714,7 @@ void SelectionDAGBuilder::splitWorkItem(SwitchWorkList &WorkList,
|
||||
I++;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
while (true) {
|
||||
// Our binary search tree differs from a typical BST in that ours can have up
|
||||
// to three values in each leaf. The pivot selection above doesn't take that
|
||||
// into account, which means the tree might require more nodes and be less
|
||||
|
@ -1,4 +1,4 @@
|
||||
//===-- SelectionDAGBuilder.h - Selection-DAG building --------*- C++ -*---===//
|
||||
//===- SelectionDAGBuilder.h - Selection-DAG building -----------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -16,67 +16,75 @@
|
||||
|
||||
#include "StatepointLowering.h"
|
||||
#include "llvm/ADT/APInt.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Analysis/AliasAnalysis.h"
|
||||
#include "llvm/CodeGen/ISDOpcodes.h"
|
||||
#include "llvm/CodeGen/MachineValueType.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
||||
#include "llvm/CodeGen/ValueTypes.h"
|
||||
#include "llvm/IR/CallSite.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DebugLoc.h"
|
||||
#include "llvm/IR/Instruction.h"
|
||||
#include "llvm/IR/Statepoint.h"
|
||||
#include "llvm/Support/BranchProbability.h"
|
||||
#include "llvm/Support/CodeGen.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Target/TargetLowering.h"
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class AddrSpaceCastInst;
|
||||
class AllocaInst;
|
||||
class AtomicCmpXchgInst;
|
||||
class AtomicRMWInst;
|
||||
class BasicBlock;
|
||||
class BitCastInst;
|
||||
class BranchInst;
|
||||
class CallInst;
|
||||
class CatchPadInst;
|
||||
class CatchReturnInst;
|
||||
class CatchSwitchInst;
|
||||
class CleanupPadInst;
|
||||
class CleanupReturnInst;
|
||||
class Constant;
|
||||
class ConstantInt;
|
||||
class ConstrainedFPIntrinsic;
|
||||
class DbgValueInst;
|
||||
class ExtractElementInst;
|
||||
class FCmpInst;
|
||||
class FPExtInst;
|
||||
class FPToSIInst;
|
||||
class FPToUIInst;
|
||||
class FPTruncInst;
|
||||
class Function;
|
||||
class DataLayout;
|
||||
class DIExpression;
|
||||
class DILocalVariable;
|
||||
class DILocation;
|
||||
class FenceInst;
|
||||
class FunctionLoweringInfo;
|
||||
class GetElementPtrInst;
|
||||
class GCFunctionInfo;
|
||||
class ICmpInst;
|
||||
class IntToPtrInst;
|
||||
class GCRelocateInst;
|
||||
class GCResultInst;
|
||||
class IndirectBrInst;
|
||||
class InvokeInst;
|
||||
class InsertElementInst;
|
||||
class Instruction;
|
||||
class LandingPadInst;
|
||||
class LLVMContext;
|
||||
class LoadInst;
|
||||
class MachineBasicBlock;
|
||||
class MachineInstr;
|
||||
class MachineRegisterInfo;
|
||||
class MDNode;
|
||||
class MVT;
|
||||
class PHINode;
|
||||
class PtrToIntInst;
|
||||
class ResumeInst;
|
||||
class ReturnInst;
|
||||
class SDDbgValue;
|
||||
class SExtInst;
|
||||
class SelectInst;
|
||||
class ShuffleVectorInst;
|
||||
class SIToFPInst;
|
||||
class StoreInst;
|
||||
class SwitchInst;
|
||||
class DataLayout;
|
||||
class TargetLibraryInfo;
|
||||
class TargetLowering;
|
||||
class TruncInst;
|
||||
class UIToFPInst;
|
||||
class UnreachableInst;
|
||||
class TargetMachine;
|
||||
class Type;
|
||||
class VAArgInst;
|
||||
class ZExtInst;
|
||||
class UnreachableInst;
|
||||
class Use;
|
||||
class User;
|
||||
class Value;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// SelectionDAGBuilder - This is the common target-independent lowering
|
||||
@ -84,7 +92,7 @@ class ZExtInst;
|
||||
///
|
||||
class SelectionDAGBuilder {
|
||||
/// CurInst - The current instruction being visited
|
||||
const Instruction *CurInst;
|
||||
const Instruction *CurInst = nullptr;
|
||||
|
||||
DenseMap<const Value*, SDValue> NodeMap;
|
||||
|
||||
@ -94,13 +102,15 @@ class SelectionDAGBuilder {
|
||||
|
||||
/// DanglingDebugInfo - Helper type for DanglingDebugInfoMap.
|
||||
class DanglingDebugInfo {
|
||||
const DbgValueInst* DI;
|
||||
const DbgValueInst* DI = nullptr;
|
||||
DebugLoc dl;
|
||||
unsigned SDNodeOrder;
|
||||
unsigned SDNodeOrder = 0;
|
||||
|
||||
public:
|
||||
DanglingDebugInfo() : DI(nullptr), dl(DebugLoc()), SDNodeOrder(0) { }
|
||||
DanglingDebugInfo() = default;
|
||||
DanglingDebugInfo(const DbgValueInst *di, DebugLoc DL, unsigned SDNO)
|
||||
: DI(di), dl(std::move(DL)), SDNodeOrder(SDNO) {}
|
||||
|
||||
const DbgValueInst* getDI() { return DI; }
|
||||
DebugLoc getdl() { return dl; }
|
||||
unsigned getSDNodeOrder() { return SDNodeOrder; }
|
||||
@ -120,8 +130,8 @@ public:
|
||||
/// State used while lowering a statepoint sequence (gc_statepoint,
|
||||
/// gc_relocate, and gc_result). See StatepointLowering.hpp/cpp for details.
|
||||
StatepointLoweringState StatepointLowering;
|
||||
private:
|
||||
|
||||
private:
|
||||
/// PendingExports - CopyToReg nodes that copy values to virtual registers
|
||||
/// for export to other blocks need to be emitted before any terminator
|
||||
/// instruction, but they have no other ordering requirements. We bunch them
|
||||
@ -189,23 +199,22 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
typedef std::vector<CaseCluster> CaseClusterVector;
|
||||
typedef CaseClusterVector::iterator CaseClusterIt;
|
||||
using CaseClusterVector = std::vector<CaseCluster>;
|
||||
using CaseClusterIt = CaseClusterVector::iterator;
|
||||
|
||||
struct CaseBits {
|
||||
uint64_t Mask;
|
||||
MachineBasicBlock* BB;
|
||||
unsigned Bits;
|
||||
uint64_t Mask = 0;
|
||||
MachineBasicBlock* BB = nullptr;
|
||||
unsigned Bits = 0;
|
||||
BranchProbability ExtraProb;
|
||||
|
||||
CaseBits() = default;
|
||||
CaseBits(uint64_t mask, MachineBasicBlock* bb, unsigned bits,
|
||||
BranchProbability Prob):
|
||||
Mask(mask), BB(bb), Bits(bits), ExtraProb(Prob) { }
|
||||
|
||||
CaseBits() : Mask(0), BB(nullptr), Bits(0) {}
|
||||
Mask(mask), BB(bb), Bits(bits), ExtraProb(Prob) {}
|
||||
};
|
||||
|
||||
typedef std::vector<CaseBits> CaseBitsVector;
|
||||
using CaseBitsVector = std::vector<CaseBits>;
|
||||
|
||||
/// Sort Clusters and merge adjacent cases.
|
||||
void sortAndRangeify(CaseClusterVector &Clusters);
|
||||
@ -214,16 +223,6 @@ private:
|
||||
/// SelectionDAGBuilder and SDISel for the code generation of additional basic
|
||||
/// blocks needed by multi-case switch statements.
|
||||
struct CaseBlock {
|
||||
CaseBlock(ISD::CondCode cc, const Value *cmplhs, const Value *cmprhs,
|
||||
const Value *cmpmiddle, MachineBasicBlock *truebb,
|
||||
MachineBasicBlock *falsebb, MachineBasicBlock *me,
|
||||
SDLoc dl,
|
||||
BranchProbability trueprob = BranchProbability::getUnknown(),
|
||||
BranchProbability falseprob = BranchProbability::getUnknown())
|
||||
: CC(cc), CmpLHS(cmplhs), CmpMHS(cmpmiddle), CmpRHS(cmprhs),
|
||||
TrueBB(truebb), FalseBB(falsebb), ThisBB(me), DL(dl),
|
||||
TrueProb(trueprob), FalseProb(falseprob) {}
|
||||
|
||||
// CC - the condition code to use for the case block's setcc node
|
||||
ISD::CondCode CC;
|
||||
|
||||
@ -244,12 +243,19 @@ private:
|
||||
|
||||
// TrueProb/FalseProb - branch weights.
|
||||
BranchProbability TrueProb, FalseProb;
|
||||
|
||||
CaseBlock(ISD::CondCode cc, const Value *cmplhs, const Value *cmprhs,
|
||||
const Value *cmpmiddle, MachineBasicBlock *truebb,
|
||||
MachineBasicBlock *falsebb, MachineBasicBlock *me,
|
||||
SDLoc dl,
|
||||
BranchProbability trueprob = BranchProbability::getUnknown(),
|
||||
BranchProbability falseprob = BranchProbability::getUnknown())
|
||||
: CC(cc), CmpLHS(cmplhs), CmpMHS(cmpmiddle), CmpRHS(cmprhs),
|
||||
TrueBB(truebb), FalseBB(falsebb), ThisBB(me), DL(dl),
|
||||
TrueProb(trueprob), FalseProb(falseprob) {}
|
||||
};
|
||||
|
||||
struct JumpTable {
|
||||
JumpTable(unsigned R, unsigned J, MachineBasicBlock *M,
|
||||
MachineBasicBlock *D): Reg(R), JTI(J), MBB(M), Default(D) {}
|
||||
|
||||
/// Reg - the virtual register containing the index of the jump table entry
|
||||
//. to jump to.
|
||||
unsigned Reg;
|
||||
@ -260,39 +266,38 @@ private:
|
||||
/// Default - the MBB of the default bb, which is a successor of the range
|
||||
/// check MBB. This is when updating PHI nodes in successors.
|
||||
MachineBasicBlock *Default;
|
||||
|
||||
JumpTable(unsigned R, unsigned J, MachineBasicBlock *M,
|
||||
MachineBasicBlock *D): Reg(R), JTI(J), MBB(M), Default(D) {}
|
||||
};
|
||||
struct JumpTableHeader {
|
||||
JumpTableHeader(APInt F, APInt L, const Value *SV, MachineBasicBlock *H,
|
||||
bool E = false)
|
||||
: First(std::move(F)), Last(std::move(L)), SValue(SV), HeaderBB(H),
|
||||
Emitted(E) {}
|
||||
APInt First;
|
||||
APInt Last;
|
||||
const Value *SValue;
|
||||
MachineBasicBlock *HeaderBB;
|
||||
bool Emitted;
|
||||
|
||||
JumpTableHeader(APInt F, APInt L, const Value *SV, MachineBasicBlock *H,
|
||||
bool E = false)
|
||||
: First(std::move(F)), Last(std::move(L)), SValue(SV), HeaderBB(H),
|
||||
Emitted(E) {}
|
||||
};
|
||||
typedef std::pair<JumpTableHeader, JumpTable> JumpTableBlock;
|
||||
using JumpTableBlock = std::pair<JumpTableHeader, JumpTable>;
|
||||
|
||||
struct BitTestCase {
|
||||
BitTestCase(uint64_t M, MachineBasicBlock* T, MachineBasicBlock* Tr,
|
||||
BranchProbability Prob):
|
||||
Mask(M), ThisBB(T), TargetBB(Tr), ExtraProb(Prob) { }
|
||||
uint64_t Mask;
|
||||
MachineBasicBlock *ThisBB;
|
||||
MachineBasicBlock *TargetBB;
|
||||
BranchProbability ExtraProb;
|
||||
|
||||
BitTestCase(uint64_t M, MachineBasicBlock* T, MachineBasicBlock* Tr,
|
||||
BranchProbability Prob):
|
||||
Mask(M), ThisBB(T), TargetBB(Tr), ExtraProb(Prob) {}
|
||||
};
|
||||
|
||||
typedef SmallVector<BitTestCase, 3> BitTestInfo;
|
||||
using BitTestInfo = SmallVector<BitTestCase, 3>;
|
||||
|
||||
struct BitTestBlock {
|
||||
BitTestBlock(APInt F, APInt R, const Value *SV, unsigned Rg, MVT RgVT,
|
||||
bool E, bool CR, MachineBasicBlock *P, MachineBasicBlock *D,
|
||||
BitTestInfo C, BranchProbability Pr)
|
||||
: First(std::move(F)), Range(std::move(R)), SValue(SV), Reg(Rg),
|
||||
RegVT(RgVT), Emitted(E), ContiguousRange(CR), Parent(P), Default(D),
|
||||
Cases(std::move(C)), Prob(Pr) {}
|
||||
APInt First;
|
||||
APInt Range;
|
||||
const Value *SValue;
|
||||
@ -305,6 +310,13 @@ private:
|
||||
BitTestInfo Cases;
|
||||
BranchProbability Prob;
|
||||
BranchProbability DefaultProb;
|
||||
|
||||
BitTestBlock(APInt F, APInt R, const Value *SV, unsigned Rg, MVT RgVT,
|
||||
bool E, bool CR, MachineBasicBlock *P, MachineBasicBlock *D,
|
||||
BitTestInfo C, BranchProbability Pr)
|
||||
: First(std::move(F)), Range(std::move(R)), SValue(SV), Reg(Rg),
|
||||
RegVT(RgVT), Emitted(E), ContiguousRange(CR), Parent(P), Default(D),
|
||||
Cases(std::move(C)), Prob(Pr) {}
|
||||
};
|
||||
|
||||
/// Return the range of value in [First..Last].
|
||||
@ -341,7 +353,7 @@ private:
|
||||
const ConstantInt *LT;
|
||||
BranchProbability DefaultProb;
|
||||
};
|
||||
typedef SmallVector<SwitchWorkListItem, 4> SwitchWorkList;
|
||||
using SwitchWorkList = SmallVector<SwitchWorkListItem, 4>;
|
||||
|
||||
/// Determine the rank by weight of CC in [First,Last]. If CC has more weight
|
||||
/// than each cluster in the range, its rank is 0.
|
||||
@ -471,8 +483,7 @@ private:
|
||||
/// the same function, use the same failure basic block).
|
||||
class StackProtectorDescriptor {
|
||||
public:
|
||||
StackProtectorDescriptor()
|
||||
: ParentMBB(nullptr), SuccessMBB(nullptr), FailureMBB(nullptr) {}
|
||||
StackProtectorDescriptor() = default;
|
||||
|
||||
/// Returns true if all fields of the stack protector descriptor are
|
||||
/// initialized implying that we should/are ready to emit a stack protector.
|
||||
@ -538,15 +549,15 @@ private:
|
||||
/// replace it with a compare/branch to the successor mbbs
|
||||
/// SuccessMBB/FailureMBB depending on whether or not the stack protector
|
||||
/// was violated.
|
||||
MachineBasicBlock *ParentMBB;
|
||||
MachineBasicBlock *ParentMBB = nullptr;
|
||||
|
||||
/// A basic block visited on stack protector check success that contains the
|
||||
/// terminators of ParentMBB.
|
||||
MachineBasicBlock *SuccessMBB;
|
||||
MachineBasicBlock *SuccessMBB = nullptr;
|
||||
|
||||
/// This basic block visited on stack protector check failure that will
|
||||
/// contain a call to __stack_chk_fail().
|
||||
MachineBasicBlock *FailureMBB;
|
||||
MachineBasicBlock *FailureMBB = nullptr;
|
||||
|
||||
/// Add a successor machine basic block to ParentMBB. If the successor mbb
|
||||
/// has not been created yet (i.e. if SuccMBB = 0), then the machine basic
|
||||
@ -559,25 +570,29 @@ private:
|
||||
|
||||
private:
|
||||
const TargetMachine &TM;
|
||||
|
||||
public:
|
||||
/// Lowest valid SDNodeOrder. The special case 0 is reserved for scheduling
|
||||
/// nodes without a corresponding SDNode.
|
||||
static const unsigned LowestSDNodeOrder = 1;
|
||||
|
||||
SelectionDAG &DAG;
|
||||
const DataLayout *DL;
|
||||
AliasAnalysis *AA;
|
||||
const DataLayout *DL = nullptr;
|
||||
AliasAnalysis *AA = nullptr;
|
||||
const TargetLibraryInfo *LibInfo;
|
||||
|
||||
/// SwitchCases - Vector of CaseBlock structures used to communicate
|
||||
/// SwitchInst code generation information.
|
||||
std::vector<CaseBlock> SwitchCases;
|
||||
|
||||
/// JTCases - Vector of JumpTable structures used to communicate
|
||||
/// SwitchInst code generation information.
|
||||
std::vector<JumpTableBlock> JTCases;
|
||||
|
||||
/// BitTestCases - Vector of BitTestBlock structures used to communicate
|
||||
/// SwitchInst code generation information.
|
||||
std::vector<BitTestBlock> BitTestCases;
|
||||
|
||||
/// A StackProtectorDescriptor structure used to communicate stack protector
|
||||
/// information in between SelectBasicBlock and FinishBasicBlock.
|
||||
StackProtectorDescriptor SPDescriptor;
|
||||
@ -594,22 +609,19 @@ public:
|
||||
GCFunctionInfo *GFI;
|
||||
|
||||
/// LPadToCallSiteMap - Map a landing pad to the call site indexes.
|
||||
DenseMap<MachineBasicBlock*, SmallVector<unsigned, 4> > LPadToCallSiteMap;
|
||||
DenseMap<MachineBasicBlock *, SmallVector<unsigned, 4>> LPadToCallSiteMap;
|
||||
|
||||
/// HasTailCall - This is set to true if a call in the current
|
||||
/// block has been translated as a tail call. In this case,
|
||||
/// no subsequent DAG nodes should be created.
|
||||
///
|
||||
bool HasTailCall;
|
||||
bool HasTailCall = false;
|
||||
|
||||
LLVMContext *Context;
|
||||
|
||||
SelectionDAGBuilder(SelectionDAG &dag, FunctionLoweringInfo &funcinfo,
|
||||
CodeGenOpt::Level ol)
|
||||
: CurInst(nullptr), SDNodeOrder(LowestSDNodeOrder), TM(dag.getTarget()),
|
||||
DAG(dag), DL(nullptr), AA(nullptr), FuncInfo(funcinfo),
|
||||
HasTailCall(false) {
|
||||
}
|
||||
: SDNodeOrder(LowestSDNodeOrder), TM(dag.getTarget()), DAG(dag),
|
||||
FuncInfo(funcinfo) {}
|
||||
|
||||
void init(GCFunctionInfo *gfi, AliasAnalysis *AA,
|
||||
const TargetLibraryInfo *li);
|
||||
@ -658,6 +670,7 @@ public:
|
||||
// resolveDanglingDebugInfo - if we saw an earlier dbg_value referring to V,
|
||||
// generate the debug data structures now that we've seen its definition.
|
||||
void resolveDanglingDebugInfo(const Value *V, SDValue Val);
|
||||
|
||||
SDValue getValue(const Value *V);
|
||||
bool findValue(const Value *V) const;
|
||||
|
||||
@ -982,13 +995,11 @@ struct RegsForValue {
|
||||
|
||||
/// Records if this value needs to be treated in an ABI dependant manner,
|
||||
/// different to normal type legalization.
|
||||
bool IsABIMangled;
|
||||
|
||||
RegsForValue();
|
||||
bool IsABIMangled = false;
|
||||
|
||||
RegsForValue() = default;
|
||||
RegsForValue(const SmallVector<unsigned, 4> ®s, MVT regvt, EVT valuevt,
|
||||
bool IsABIMangledValue = false);
|
||||
|
||||
RegsForValue(LLVMContext &Context, const TargetLowering &TLI,
|
||||
const DataLayout &DL, unsigned Reg, Type *Ty,
|
||||
bool IsABIMangledValue = false);
|
||||
@ -1028,4 +1039,4 @@ struct RegsForValue {
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
#endif // LLVM_LIB_CODEGEN_SELECTIONDAG_SELECTIONDAGBUILDER_H
|
||||
|
@ -1,4 +1,4 @@
|
||||
//===-- StatepointLowering.cpp - SDAGBuilder's statepoint code -----------===//
|
||||
//===- StatepointLowering.cpp - SDAGBuilder's statepoint code -------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -14,21 +14,44 @@
|
||||
|
||||
#include "StatepointLowering.h"
|
||||
#include "SelectionDAGBuilder.h"
|
||||
#include "llvm/ADT/SmallSet.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/None.h"
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
#include "llvm/CodeGen/FunctionLoweringInfo.h"
|
||||
#include "llvm/CodeGen/GCMetadata.h"
|
||||
#include "llvm/CodeGen/GCStrategy.h"
|
||||
#include "llvm/CodeGen/ISDOpcodes.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineMemOperand.h"
|
||||
#include "llvm/CodeGen/MachineValueType.h"
|
||||
#include "llvm/CodeGen/RuntimeLibcalls.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
||||
#include "llvm/CodeGen/StackMaps.h"
|
||||
#include "llvm/IR/CallingConv.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/Instruction.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#include "llvm/IR/Intrinsics.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/IR/Statepoint.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Target/TargetLowering.h"
|
||||
#include <algorithm>
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetOpcodes.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
#include <cassert>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <iterator>
|
||||
#include <tuple>
|
||||
#include <utility>
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "statepoint-lowering"
|
||||
@ -200,7 +223,6 @@ static Optional<int> findPreviousSpillSlot(const Value *Val,
|
||||
/// values on the stack between calls.
|
||||
static void reservePreviousStackSlotForValue(const Value *IncomingValue,
|
||||
SelectionDAGBuilder &Builder) {
|
||||
|
||||
SDValue Incoming = Builder.getValue(IncomingValue);
|
||||
|
||||
if (isa<ConstantSDNode>(Incoming) || isa<FrameIndexSDNode>(Incoming)) {
|
||||
@ -292,7 +314,6 @@ removeDuplicateGCPtrs(SmallVectorImpl<const Value *> &Bases,
|
||||
static std::pair<SDValue, SDNode *> lowerCallFromStatepointLoweringInfo(
|
||||
SelectionDAGBuilder::StatepointLoweringInfo &SI,
|
||||
SelectionDAGBuilder &Builder, SmallVectorImpl<SDValue> &PendingExports) {
|
||||
|
||||
SDValue ReturnValue, CallEndVal;
|
||||
std::tie(ReturnValue, CallEndVal) =
|
||||
Builder.lowerInvokable(SI.CLI, SI.EHPadBB);
|
||||
|
@ -1,4 +1,4 @@
|
||||
//===-- StatepointLowering.h - SDAGBuilder's statepoint code -*- C++ -*---===//
|
||||
//===- StatepointLowering.h - SDAGBuilder's statepoint code ---*- C++ -*---===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
@ -16,11 +16,16 @@
|
||||
#define LLVM_LIB_CODEGEN_SELECTIONDAG_STATEPOINTLOWERING_H
|
||||
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/SmallBitVector.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
||||
#include "llvm/CodeGen/ValueTypes.h"
|
||||
#include <cassert>
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class CallInst;
|
||||
class SelectionDAGBuilder;
|
||||
|
||||
/// This class tracks both per-statepoint and per-selectiondag information.
|
||||
@ -30,7 +35,7 @@ class SelectionDAGBuilder;
|
||||
/// works in concert with information in FunctionLoweringInfo.
|
||||
class StatepointLoweringState {
|
||||
public:
|
||||
StatepointLoweringState() : NextSlotToAllocate(0) {}
|
||||
StatepointLoweringState() = default;
|
||||
|
||||
/// Reset all state tracking for a newly encountered safepoint. Also
|
||||
/// performs some consistency checking.
|
||||
@ -69,7 +74,7 @@ public:
|
||||
/// before the next statepoint. If we weren't expecting to see
|
||||
/// it, we'll report an assertion.
|
||||
void relocCallVisited(const CallInst &RelocCall) {
|
||||
auto I = find(PendingGCRelocateCalls, &RelocCall);
|
||||
auto I = llvm::find(PendingGCRelocateCalls, &RelocCall);
|
||||
assert(I != PendingGCRelocateCalls.end() &&
|
||||
"Visited unexpected gcrelocate call");
|
||||
PendingGCRelocateCalls.erase(I);
|
||||
@ -108,11 +113,12 @@ private:
|
||||
SmallBitVector AllocatedStackSlots;
|
||||
|
||||
/// Points just beyond the last slot known to have been allocated
|
||||
unsigned NextSlotToAllocate;
|
||||
unsigned NextSlotToAllocate = 0;
|
||||
|
||||
/// Keep track of pending gcrelocate calls for consistency check
|
||||
SmallVector<const CallInst *, 10> PendingGCRelocateCalls;
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // LLVM_LIB_CODEGEN_SELECTIONDAG_STATEPOINTLOWERING_H
|
||||
|
Loading…
Reference in New Issue
Block a user