1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00

Revert "Allow invokable sub-classes of IntrinsicInst"

This reverts commit d87b9b81ccb95217181ce75515c6c68bbb408ca4.

Post commit review raised concerns, reverting while discussion happens.
This commit is contained in:
Philip Reames 2021-04-20 15:37:49 -07:00
parent 2608e4a8c5
commit 5209f18c1c
12 changed files with 39 additions and 49 deletions

View File

@ -154,8 +154,8 @@ public:
// instruction to a special delegation helper. // instruction to a special delegation helper.
#define HANDLE_INST(NUM, OPCODE, CLASS) \ #define HANDLE_INST(NUM, OPCODE, CLASS) \
RetTy visit##OPCODE(CLASS &I) { \ RetTy visit##OPCODE(CLASS &I) { \
if (NUM == Instruction::Call || NUM == Instruction::Invoke) \ if (NUM == Instruction::Call) \
return delegateCallBase(I); \ return delegateCallInst(I); \
else \ else \
DELEGATE(CLASS); \ DELEGATE(CLASS); \
} }
@ -215,12 +215,7 @@ public:
RetTy visitVAStartInst(VAStartInst &I) { DELEGATE(IntrinsicInst); } RetTy visitVAStartInst(VAStartInst &I) { DELEGATE(IntrinsicInst); }
RetTy visitVAEndInst(VAEndInst &I) { DELEGATE(IntrinsicInst); } RetTy visitVAEndInst(VAEndInst &I) { DELEGATE(IntrinsicInst); }
RetTy visitVACopyInst(VACopyInst &I) { DELEGATE(IntrinsicInst); } RetTy visitVACopyInst(VACopyInst &I) { DELEGATE(IntrinsicInst); }
RetTy visitIntrinsicInst(IntrinsicInst &I) { RetTy visitIntrinsicInst(IntrinsicInst &I) { DELEGATE(CallInst); }
if (isa<CallInst>(I))
return static_cast<SubClass*>(this)->visitCallInst(cast<CallInst>(I));
else
return static_cast<SubClass*>(this)->visitInvokeInst(cast<InvokeInst>(I));
}
RetTy visitCallInst(CallInst &I) { DELEGATE(CallBase); } RetTy visitCallInst(CallInst &I) { DELEGATE(CallBase); }
RetTy visitInvokeInst(InvokeInst &I) { DELEGATE(CallBase); } RetTy visitInvokeInst(InvokeInst &I) { DELEGATE(CallBase); }
RetTy visitCallBrInst(CallBrInst &I) { DELEGATE(CallBase); } RetTy visitCallBrInst(CallBrInst &I) { DELEGATE(CallBase); }
@ -285,7 +280,7 @@ public:
private: private:
// Special helper function to delegate to CallInst subclass visitors. // Special helper function to delegate to CallInst subclass visitors.
RetTy delegateCallBase(CallBase &I) { RetTy delegateCallInst(CallInst &I) {
if (const Function *F = I.getCalledFunction()) { if (const Function *F = I.getCalledFunction()) {
switch (F->getIntrinsicID()) { switch (F->getIntrinsicID()) {
default: DELEGATE(IntrinsicInst); default: DELEGATE(IntrinsicInst);
@ -301,16 +296,13 @@ private:
case Intrinsic::not_intrinsic: break; case Intrinsic::not_intrinsic: break;
} }
} }
if (isa<CallInst>(I)) DELEGATE(CallInst);
return static_cast<SubClass*>(this)->visitCallInst(cast<CallInst>(I));
else
return static_cast<SubClass*>(this)->visitInvokeInst(cast<InvokeInst>(I));
} }
// An overload that will never actually be called, it is used only from dead // An overload that will never actually be called, it is used only from dead
// code in the dispatching from opcodes to instruction subclasses. // code in the dispatching from opcodes to instruction subclasses.
RetTy delegateCallBase(Instruction &I) { RetTy delegateCallInst(Instruction &I) {
llvm_unreachable("delegateCallBase called for non-CallBase"); llvm_unreachable("delegateCallInst called for non-CallInst");
} }
}; };

View File

@ -13,10 +13,10 @@
// if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(Inst)) // if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(Inst))
// ... MCI->getDest() ... MCI->getSource() ... // ... MCI->getDest() ... MCI->getSource() ...
// //
// All intrinsic function calls are instances of the call or invoke instruction, // All intrinsic function calls are instances of the call instruction, so these
// so these are all subclasses of the CallBase class. Note that none of these // are all subclasses of the CallInst class. Note that none of these classes
// classes has state or virtual methods, which is an important part of this // has state or virtual methods, which is an important part of this gross/neat
// gross/neat hack working. // hack working.
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
@ -42,7 +42,7 @@ namespace llvm {
/// A wrapper class for inspecting calls to intrinsic functions. /// A wrapper class for inspecting calls to intrinsic functions.
/// This allows the standard isa/dyncast/cast functionality to work with calls /// This allows the standard isa/dyncast/cast functionality to work with calls
/// to intrinsic functions. /// to intrinsic functions.
class IntrinsicInst : public CallBase { class IntrinsicInst : public CallInst {
public: public:
IntrinsicInst() = delete; IntrinsicInst() = delete;
IntrinsicInst(const IntrinsicInst &) = delete; IntrinsicInst(const IntrinsicInst &) = delete;
@ -107,13 +107,13 @@ public:
} }
// Methods for support type inquiry through isa, cast, and dyn_cast: // Methods for support type inquiry through isa, cast, and dyn_cast:
static bool classof(const CallBase *I) { static bool classof(const CallInst *I) {
if (const Function *CF = I->getCalledFunction()) if (const Function *CF = I->getCalledFunction())
return CF->isIntrinsic(); return CF->isIntrinsic();
return false; return false;
} }
static bool classof(const Value *V) { static bool classof(const Value *V) {
return isa<CallBase>(V) && classof(cast<CallBase>(V)); return isa<CallInst>(V) && classof(cast<CallInst>(V));
} }
}; };

View File

@ -83,7 +83,7 @@ void llvm::findDevirtualizableCallsForTypeTest(
// Find llvm.assume intrinsics for this llvm.type.test call. // Find llvm.assume intrinsics for this llvm.type.test call.
for (const Use &CIU : CI->uses()) for (const Use &CIU : CI->uses())
if (auto *Assume = dyn_cast<AssumeInst>(CIU.getUser())) if (auto *Assume = dyn_cast<AssumeInst>(CIU.getUser()))
Assumes.push_back(cast<CallInst>(Assume)); Assumes.push_back(Assume);
// If we found any, search for virtual calls based on %p and add them to // If we found any, search for virtual calls based on %p and add them to
// DevirtCalls. // DevirtCalls.

View File

@ -1338,15 +1338,15 @@ bool FastISel::selectIntrinsicCall(const IntrinsicInst *II) {
return true; return true;
} }
case Intrinsic::experimental_stackmap: case Intrinsic::experimental_stackmap:
return selectStackmap(cast<CallInst>(II)); return selectStackmap(II);
case Intrinsic::experimental_patchpoint_void: case Intrinsic::experimental_patchpoint_void:
case Intrinsic::experimental_patchpoint_i64: case Intrinsic::experimental_patchpoint_i64:
return selectPatchpoint(cast<CallInst>(II)); return selectPatchpoint(II);
case Intrinsic::xray_customevent: case Intrinsic::xray_customevent:
return selectXRayCustomEvent(cast<CallInst>(II)); return selectXRayCustomEvent(II);
case Intrinsic::xray_typedevent: case Intrinsic::xray_typedevent:
return selectXRayTypedEvent(cast<CallInst>(II)); return selectXRayTypedEvent(II);
} }
return fastLowerIntrinsicCall(II); return fastLowerIntrinsicCall(II);

View File

@ -244,7 +244,7 @@ void ShadowStackGCLowering::CollectRoots(Function &F) {
if (Function *F = CI->getCalledFunction()) if (Function *F = CI->getCalledFunction())
if (F->getIntrinsicID() == Intrinsic::gcroot) { if (F->getIntrinsicID() == Intrinsic::gcroot) {
std::pair<CallInst *, AllocaInst *> Pair = std::make_pair( std::pair<CallInst *, AllocaInst *> Pair = std::make_pair(
cast<CallInst>(CI), CI,
cast<AllocaInst>(CI->getArgOperand(0)->stripPointerCasts())); cast<AllocaInst>(CI->getArgOperand(0)->stripPointerCasts()));
if (IsNullValue(CI->getArgOperand(1))) if (IsNullValue(CI->getArgOperand(1)))
Roots.push_back(Pair); Roots.push_back(Pair);

View File

@ -255,7 +255,7 @@ static const CallInst *findStackProtectorIntrinsic(Function &F) {
for (const Instruction &I : BB) for (const Instruction &I : BB)
if (const auto *II = dyn_cast<IntrinsicInst>(&I)) if (const auto *II = dyn_cast<IntrinsicInst>(&I))
if (II->getIntrinsicID() == Intrinsic::stackprotector) if (II->getIntrinsicID() == Intrinsic::stackprotector)
return cast<CallInst>(II); return II;
return nullptr; return nullptr;
} }

View File

@ -1143,7 +1143,7 @@ void Interpreter::visitIntrinsicInst(IntrinsicInst &I) {
bool atBegin(Parent->begin() == Me); bool atBegin(Parent->begin() == Me);
if (!atBegin) if (!atBegin)
--Me; --Me;
IL->LowerIntrinsicCall(cast<CallInst>(&I)); IL->LowerIntrinsicCall(&I);
// Restore the CurInst pointer to the first instruction newly inserted, if // Restore the CurInst pointer to the first instruction newly inserted, if
// any. // any.

View File

@ -3482,8 +3482,7 @@ bool AArch64FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {
return false; return false;
const char *IntrMemName = isa<MemCpyInst>(II) ? "memcpy" : "memmove"; const char *IntrMemName = isa<MemCpyInst>(II) ? "memcpy" : "memmove";
return lowerCallTo(cast<CallInst>(II), IntrMemName, return lowerCallTo(II, IntrMemName, II->getNumArgOperands() - 1);
II->getNumArgOperands() - 1);
} }
case Intrinsic::memset: { case Intrinsic::memset: {
const MemSetInst *MSI = cast<MemSetInst>(II); const MemSetInst *MSI = cast<MemSetInst>(II);
@ -3499,8 +3498,7 @@ bool AArch64FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {
// address spaces. // address spaces.
return false; return false;
return lowerCallTo(cast<CallInst>(II), "memset", return lowerCallTo(II, "memset", II->getNumArgOperands() - 1);
II->getNumArgOperands() - 1);
} }
case Intrinsic::sin: case Intrinsic::sin:
case Intrinsic::cos: case Intrinsic::cos:

View File

@ -1660,7 +1660,7 @@ bool MipsFastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {
if (!MTI->getLength()->getType()->isIntegerTy(32)) if (!MTI->getLength()->getType()->isIntegerTy(32))
return false; return false;
const char *IntrMemName = isa<MemCpyInst>(II) ? "memcpy" : "memmove"; const char *IntrMemName = isa<MemCpyInst>(II) ? "memcpy" : "memmove";
return lowerCallTo(cast<CallInst>(II), IntrMemName, II->getNumArgOperands() - 1); return lowerCallTo(II, IntrMemName, II->getNumArgOperands() - 1);
} }
case Intrinsic::memset: { case Intrinsic::memset: {
const MemSetInst *MSI = cast<MemSetInst>(II); const MemSetInst *MSI = cast<MemSetInst>(II);
@ -1669,7 +1669,7 @@ bool MipsFastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {
return false; return false;
if (!MSI->getLength()->getType()->isIntegerTy(32)) if (!MSI->getLength()->getType()->isIntegerTy(32))
return false; return false;
return lowerCallTo(cast<CallInst>(II), "memset", II->getNumArgOperands() - 1); return lowerCallTo(II, "memset", II->getNumArgOperands() - 1);
} }
} }
return false; return false;

View File

@ -2738,7 +2738,7 @@ bool X86FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {
if (MCI->getSourceAddressSpace() > 255 || MCI->getDestAddressSpace() > 255) if (MCI->getSourceAddressSpace() > 255 || MCI->getDestAddressSpace() > 255)
return false; return false;
return lowerCallTo(cast<CallInst>(II), "memcpy", II->getNumArgOperands() - 1); return lowerCallTo(II, "memcpy", II->getNumArgOperands() - 1);
} }
case Intrinsic::memset: { case Intrinsic::memset: {
const MemSetInst *MSI = cast<MemSetInst>(II); const MemSetInst *MSI = cast<MemSetInst>(II);
@ -2753,7 +2753,7 @@ bool X86FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {
if (MSI->getDestAddressSpace() > 255) if (MSI->getDestAddressSpace() > 255)
return false; return false;
return lowerCallTo(cast<CallInst>(II), "memset", II->getNumArgOperands() - 1); return lowerCallTo(II, "memset", II->getNumArgOperands() - 1);
} }
case Intrinsic::stackprotector: { case Intrinsic::stackprotector: {
// Emit code to store the stack guard onto the stack. // Emit code to store the stack guard onto the stack.

View File

@ -140,7 +140,6 @@ public:
Instruction *visitAddrSpaceCast(AddrSpaceCastInst &CI); Instruction *visitAddrSpaceCast(AddrSpaceCastInst &CI);
Instruction *foldItoFPtoI(CastInst &FI); Instruction *foldItoFPtoI(CastInst &FI);
Instruction *visitSelectInst(SelectInst &SI); Instruction *visitSelectInst(SelectInst &SI);
Instruction *visitCallBase(CallBase &Call);
Instruction *visitCallInst(CallInst &CI); Instruction *visitCallInst(CallInst &CI);
Instruction *visitInvokeInst(InvokeInst &II); Instruction *visitInvokeInst(InvokeInst &II);
Instruction *visitCallBrInst(CallBrInst &CBI); Instruction *visitCallBrInst(CallBrInst &CBI);
@ -223,6 +222,7 @@ private:
Instruction &CtxI, Value *&OperationResult, Instruction &CtxI, Value *&OperationResult,
Constant *&OverflowResult); Constant *&OverflowResult);
Instruction *visitCallBase(CallBase &Call);
Instruction *tryOptimizeCall(CallInst *CI); Instruction *tryOptimizeCall(CallInst *CI);
bool transformConstExprCastCall(CallBase &Call); bool transformConstExprCastCall(CallBase &Call);
Instruction *transformCallThroughTrampoline(CallBase &Call, Instruction *transformCallThroughTrampoline(CallBase &Call,

View File

@ -4142,7 +4142,7 @@ struct VarArgAMD64Helper : public VarArgHelper {
Value *VAArgTLSOriginCopy = nullptr; Value *VAArgTLSOriginCopy = nullptr;
Value *VAArgOverflowSize = nullptr; Value *VAArgOverflowSize = nullptr;
SmallVector<IntrinsicInst*, 16> VAStartInstrumentationList; SmallVector<CallInst*, 16> VAStartInstrumentationList;
enum ArgKind { AK_GeneralPurpose, AK_FloatingPoint, AK_Memory }; enum ArgKind { AK_GeneralPurpose, AK_FloatingPoint, AK_Memory };
@ -4351,7 +4351,7 @@ struct VarArgAMD64Helper : public VarArgHelper {
// Instrument va_start. // Instrument va_start.
// Copy va_list shadow from the backup copy of the TLS contents. // Copy va_list shadow from the backup copy of the TLS contents.
for (size_t i = 0, n = VAStartInstrumentationList.size(); i < n; i++) { for (size_t i = 0, n = VAStartInstrumentationList.size(); i < n; i++) {
auto *OrigInst = VAStartInstrumentationList[i]; CallInst *OrigInst = VAStartInstrumentationList[i];
IRBuilder<> IRB(OrigInst->getNextNode()); IRBuilder<> IRB(OrigInst->getNextNode());
Value *VAListTag = OrigInst->getArgOperand(0); Value *VAListTag = OrigInst->getArgOperand(0);
@ -4405,7 +4405,7 @@ struct VarArgMIPS64Helper : public VarArgHelper {
Value *VAArgTLSCopy = nullptr; Value *VAArgTLSCopy = nullptr;
Value *VAArgSize = nullptr; Value *VAArgSize = nullptr;
SmallVector<IntrinsicInst*, 16> VAStartInstrumentationList; SmallVector<CallInst*, 16> VAStartInstrumentationList;
VarArgMIPS64Helper(Function &F, MemorySanitizer &MS, VarArgMIPS64Helper(Function &F, MemorySanitizer &MS,
MemorySanitizerVisitor &MSV) : F(F), MS(MS), MSV(MSV) {} MemorySanitizerVisitor &MSV) : F(F), MS(MS), MSV(MSV) {}
@ -4494,7 +4494,7 @@ struct VarArgMIPS64Helper : public VarArgHelper {
// Instrument va_start. // Instrument va_start.
// Copy va_list shadow from the backup copy of the TLS contents. // Copy va_list shadow from the backup copy of the TLS contents.
for (size_t i = 0, n = VAStartInstrumentationList.size(); i < n; i++) { for (size_t i = 0, n = VAStartInstrumentationList.size(); i < n; i++) {
auto *OrigInst = VAStartInstrumentationList[i]; CallInst *OrigInst = VAStartInstrumentationList[i];
IRBuilder<> IRB(OrigInst->getNextNode()); IRBuilder<> IRB(OrigInst->getNextNode());
Value *VAListTag = OrigInst->getArgOperand(0); Value *VAListTag = OrigInst->getArgOperand(0);
Type *RegSaveAreaPtrTy = Type::getInt64PtrTy(*MS.C); Type *RegSaveAreaPtrTy = Type::getInt64PtrTy(*MS.C);
@ -4533,7 +4533,7 @@ struct VarArgAArch64Helper : public VarArgHelper {
Value *VAArgTLSCopy = nullptr; Value *VAArgTLSCopy = nullptr;
Value *VAArgOverflowSize = nullptr; Value *VAArgOverflowSize = nullptr;
SmallVector<IntrinsicInst*, 16> VAStartInstrumentationList; SmallVector<CallInst*, 16> VAStartInstrumentationList;
enum ArgKind { AK_GeneralPurpose, AK_FloatingPoint, AK_Memory }; enum ArgKind { AK_GeneralPurpose, AK_FloatingPoint, AK_Memory };
@ -4688,7 +4688,7 @@ struct VarArgAArch64Helper : public VarArgHelper {
// Instrument va_start, copy va_list shadow from the backup copy of // Instrument va_start, copy va_list shadow from the backup copy of
// the TLS contents. // the TLS contents.
for (size_t i = 0, n = VAStartInstrumentationList.size(); i < n; i++) { for (size_t i = 0, n = VAStartInstrumentationList.size(); i < n; i++) {
auto *OrigInst = VAStartInstrumentationList[i]; CallInst *OrigInst = VAStartInstrumentationList[i];
IRBuilder<> IRB(OrigInst->getNextNode()); IRBuilder<> IRB(OrigInst->getNextNode());
Value *VAListTag = OrigInst->getArgOperand(0); Value *VAListTag = OrigInst->getArgOperand(0);
@ -4783,7 +4783,7 @@ struct VarArgPowerPC64Helper : public VarArgHelper {
Value *VAArgTLSCopy = nullptr; Value *VAArgTLSCopy = nullptr;
Value *VAArgSize = nullptr; Value *VAArgSize = nullptr;
SmallVector<IntrinsicInst*, 16> VAStartInstrumentationList; SmallVector<CallInst*, 16> VAStartInstrumentationList;
VarArgPowerPC64Helper(Function &F, MemorySanitizer &MS, VarArgPowerPC64Helper(Function &F, MemorySanitizer &MS,
MemorySanitizerVisitor &MSV) : F(F), MS(MS), MSV(MSV) {} MemorySanitizerVisitor &MSV) : F(F), MS(MS), MSV(MSV) {}
@ -4932,7 +4932,7 @@ struct VarArgPowerPC64Helper : public VarArgHelper {
// Instrument va_start. // Instrument va_start.
// Copy va_list shadow from the backup copy of the TLS contents. // Copy va_list shadow from the backup copy of the TLS contents.
for (size_t i = 0, n = VAStartInstrumentationList.size(); i < n; i++) { for (size_t i = 0, n = VAStartInstrumentationList.size(); i < n; i++) {
auto *OrigInst = VAStartInstrumentationList[i]; CallInst *OrigInst = VAStartInstrumentationList[i];
IRBuilder<> IRB(OrigInst->getNextNode()); IRBuilder<> IRB(OrigInst->getNextNode());
Value *VAListTag = OrigInst->getArgOperand(0); Value *VAListTag = OrigInst->getArgOperand(0);
Type *RegSaveAreaPtrTy = Type::getInt64PtrTy(*MS.C); Type *RegSaveAreaPtrTy = Type::getInt64PtrTy(*MS.C);
@ -4972,7 +4972,7 @@ struct VarArgSystemZHelper : public VarArgHelper {
Value *VAArgTLSOriginCopy = nullptr; Value *VAArgTLSOriginCopy = nullptr;
Value *VAArgOverflowSize = nullptr; Value *VAArgOverflowSize = nullptr;
SmallVector<IntrinsicInst *, 16> VAStartInstrumentationList; SmallVector<CallInst *, 16> VAStartInstrumentationList;
enum class ArgKind { enum class ArgKind {
GeneralPurpose, GeneralPurpose,
@ -5255,7 +5255,7 @@ struct VarArgSystemZHelper : public VarArgHelper {
// Copy va_list shadow from the backup copy of the TLS contents. // Copy va_list shadow from the backup copy of the TLS contents.
for (size_t VaStartNo = 0, VaStartNum = VAStartInstrumentationList.size(); for (size_t VaStartNo = 0, VaStartNum = VAStartInstrumentationList.size();
VaStartNo < VaStartNum; VaStartNo++) { VaStartNo < VaStartNum; VaStartNo++) {
auto *OrigInst = VAStartInstrumentationList[VaStartNo]; CallInst *OrigInst = VAStartInstrumentationList[VaStartNo];
IRBuilder<> IRB(OrigInst->getNextNode()); IRBuilder<> IRB(OrigInst->getNextNode());
Value *VAListTag = OrigInst->getArgOperand(0); Value *VAListTag = OrigInst->getArgOperand(0);
copyRegSaveArea(IRB, VAListTag); copyRegSaveArea(IRB, VAListTag);