[llvm] r279886 - [IRTranslator] Do not abort when the target wants to fall back.
Quentin Colombet via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 26 16:49:06 PDT 2016
Author: qcolombet
Date: Fri Aug 26 18:49:05 2016
New Revision: 279886
URL: http://llvm.org/viewvc/llvm-project?rev=279886&view=rev
Log:
[IRTranslator] Do not abort when the target wants to fall back.
Every pass in the GlobalISel pipeline will need to do something similar.
Modified:
llvm/trunk/include/llvm/CodeGen/GlobalISel/IRTranslator.h
llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp
Modified: llvm/trunk/include/llvm/CodeGen/GlobalISel/IRTranslator.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/GlobalISel/IRTranslator.h?rev=279886&r1=279885&r2=279886&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/GlobalISel/IRTranslator.h (original)
+++ llvm/trunk/include/llvm/CodeGen/GlobalISel/IRTranslator.h Fri Aug 26 18:49:05 2016
@@ -35,6 +35,7 @@ class MachineBasicBlock;
class MachineFunction;
class MachineInstr;
class MachineRegisterInfo;
+class TargetPassConfig;
// Technically the pass should run on an hypothetical MachineModule,
// since it should translate Global into some sort of MachineGlobal.
@@ -313,6 +314,9 @@ private:
const DataLayout *DL;
+ /// Current target configuration. Controls how the pass handles errors.
+ const TargetPassConfig *TPC;
+
// * Insert all the code needed to materialize the constants
// at the proper place. E.g., Entry block or dominator block
// of each constant depending on how fancy we want to be.
@@ -341,6 +345,8 @@ public:
return "IRTranslator";
}
+ void getAnalysisUsage(AnalysisUsage &AU) const override;
+
// Algo:
// CallLowering = MF.subtarget.getCallLowering()
// F = MF.getParent()
Modified: llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp?rev=279886&r1=279885&r2=279886&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp (original)
+++ llvm/trunk/lib/CodeGen/GlobalISel/IRTranslator.cpp Fri Aug 26 18:49:05 2016
@@ -17,6 +17,7 @@
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
+#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IntrinsicInst.h"
@@ -30,13 +31,22 @@
using namespace llvm;
char IRTranslator::ID = 0;
-INITIALIZE_PASS(IRTranslator, DEBUG_TYPE, "IRTranslator LLVM IR -> MI",
+INITIALIZE_PASS_BEGIN(IRTranslator, DEBUG_TYPE, "IRTranslator LLVM IR -> MI",
+ false, false)
+INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
+INITIALIZE_PASS_END(IRTranslator, DEBUG_TYPE, "IRTranslator LLVM IR -> MI",
false, false)
IRTranslator::IRTranslator() : MachineFunctionPass(ID), MRI(nullptr) {
initializeIRTranslatorPass(*PassRegistry::getPassRegistry());
}
+void IRTranslator::getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.addRequired<TargetPassConfig>();
+ MachineFunctionPass::getAnalysisUsage(AU);
+}
+
+
unsigned IRTranslator::getOrCreateVReg(const Value &Val) {
unsigned &ValReg = ValToVReg[&Val];
// Check if this is the first time we see Val.
@@ -51,8 +61,14 @@ unsigned IRTranslator::getOrCreateVReg(c
if (auto CV = dyn_cast<Constant>(&Val)) {
bool Success = translate(*CV, VReg);
- if (!Success)
+ if (!Success) {
+ if (!TPC->isGlobalISelAbortEnabled()) {
+ MIRBuilder.getMF().getProperties().set(
+ MachineFunctionProperties::Property::FailedISel);
+ return 0;
+ }
report_fatal_error("unable to translate constant");
+ }
}
}
return ValReg;
@@ -67,6 +83,10 @@ unsigned IRTranslator::getMemOpAlignment
} else if (const LoadInst *LI = dyn_cast<LoadInst>(&I)) {
Alignment = LI->getAlignment();
ValTy = LI->getType();
+ } else if (!TPC->isGlobalISelAbortEnabled()) {
+ MIRBuilder.getMF().getProperties().set(
+ MachineFunctionProperties::Property::FailedISel);
+ return 1;
} else
llvm_unreachable("unhandled memory instruction");
@@ -154,6 +174,10 @@ bool IRTranslator::translateBr(const Use
bool IRTranslator::translateLoad(const User &U) {
const LoadInst &LI = cast<LoadInst>(U);
+
+ if (!TPC->isGlobalISelAbortEnabled() && !LI.isSimple())
+ return false;
+
assert(LI.isSimple() && "only simple loads are supported at the moment");
MachineFunction &MF = MIRBuilder.getMF();
@@ -171,6 +195,10 @@ bool IRTranslator::translateLoad(const U
bool IRTranslator::translateStore(const User &U) {
const StoreInst &SI = cast<StoreInst>(U);
+
+ if (!TPC->isGlobalISelAbortEnabled() && !SI.isSimple())
+ return false;
+
assert(SI.isSimple() && "only simple loads are supported at the moment");
MachineFunction &MF = MIRBuilder.getMF();
@@ -353,6 +381,9 @@ bool IRTranslator::translateCall(const U
}
bool IRTranslator::translateStaticAlloca(const AllocaInst &AI) {
+ if (!TPC->isGlobalISelAbortEnabled() && !AI.isStaticAlloca())
+ return false;
+
assert(AI.isStaticAlloca() && "only handle static allocas now");
MachineFunction &MF = MIRBuilder.getMF();
unsigned ElementSize = DL->getTypeStoreSize(AI.getAllocatedType());
@@ -408,6 +439,8 @@ bool IRTranslator::translate(const Instr
case Instruction::OPCODE: return translate##OPCODE(Inst);
#include "llvm/IR/Instruction.def"
default:
+ if (!TPC->isGlobalISelAbortEnabled())
+ return false;
llvm_unreachable("unknown opcode");
}
}
@@ -429,9 +462,13 @@ bool IRTranslator::translate(const Const
case Instruction::OPCODE: return translate##OPCODE(*CE);
#include "llvm/IR/Instruction.def"
default:
+ if (!TPC->isGlobalISelAbortEnabled())
+ return false;
llvm_unreachable("unknown opcode");
}
- } else
+ } else if (!TPC->isGlobalISelAbortEnabled())
+ return false;
+ else
llvm_unreachable("unhandled constant kind");
return true;
@@ -456,6 +493,7 @@ bool IRTranslator::runOnMachineFunction(
EntryBuilder.setMF(MF);
MRI = &MF.getRegInfo();
DL = &F.getParent()->getDataLayout();
+ TPC = &getAnalysis<TargetPassConfig>();
assert(PendingPHIs.empty() && "stale PHIs");
@@ -467,8 +505,14 @@ bool IRTranslator::runOnMachineFunction(
VRegArgs.push_back(getOrCreateVReg(Arg));
bool Succeeded =
CLI->lowerFormalArguments(MIRBuilder, F.getArgumentList(), VRegArgs);
- if (!Succeeded)
+ if (!Succeeded) {
+ if (!TPC->isGlobalISelAbortEnabled()) {
+ MIRBuilder.getMF().getProperties().set(
+ MachineFunctionProperties::Property::FailedISel);
+ return false;
+ }
report_fatal_error("Unable to lower arguments");
+ }
// Now that we've got the ABI handling code, it's safe to set a location for
// any Constants we find in the IR.
@@ -486,7 +530,10 @@ bool IRTranslator::runOnMachineFunction(
bool Succeeded = translate(Inst);
if (!Succeeded) {
DEBUG(dbgs() << "Cannot translate: " << Inst << '\n');
- report_fatal_error("Unable to translate instruction");
+ if (TPC->isGlobalISelAbortEnabled())
+ report_fatal_error("Unable to translate instruction");
+ MF.getProperties().set(MachineFunctionProperties::Property::FailedISel);
+ break;
}
}
}
More information about the llvm-commits
mailing list