From: Quentin Colombet Date: Sat, 27 Aug 2016 00:18:31 +0000 (+0000) Subject: [GlobalISel] Add a fallback path to SDISel. X-Git-Tag: llvmorg-4.0.0-rc1~11339 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=374796d67853db94589da4aec48443e28e1a1590;p=platform%2Fupstream%2Fllvm.git [GlobalISel] Add a fallback path to SDISel. When global-isel fails on a MachineFunction MF, MF will be cleaned up and given to SDISel. Thanks to this fallback, we can already perform correctness test even if we support only a small portion of the functions in a test. llvm-svn: 279891 --- diff --git a/llvm/include/llvm/CodeGen/Passes.h b/llvm/include/llvm/CodeGen/Passes.h index e5bf29e..26fb834 100644 --- a/llvm/include/llvm/CodeGen/Passes.h +++ b/llvm/include/llvm/CodeGen/Passes.h @@ -53,6 +53,8 @@ namespace llvm { /// using the MIR serialization format. MachineFunctionPass *createPrintMIRPass(raw_ostream &OS); + MachineFunctionPass *createResetMachineFunctionPass(); + /// createCodeGenPreparePass - Transform the code to expose more pattern /// matching during instruction selection. FunctionPass *createCodeGenPreparePass(const TargetMachine *TM = nullptr); diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index a411273..8a5b390 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -292,6 +292,7 @@ void initializeRegionPrinterPass(PassRegistry&); void initializeRegionViewerPass(PassRegistry&); void initializeRegisterCoalescerPass(PassRegistry&); void initializeRenameIndependentSubregsPass(PassRegistry&); +void initializeResetMachineFunctionPass(PassRegistry &); void initializeReversePostOrderFunctionAttrsLegacyPassPass(PassRegistry&); void initializeRewriteStatepointsForGCPass(PassRegistry&); void initializeRewriteSymbolsLegacyPassPass(PassRegistry&); diff --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt index cc9ed95..f68bac9 100644 --- a/llvm/lib/CodeGen/CMakeLists.txt +++ b/llvm/lib/CodeGen/CMakeLists.txt @@ -105,6 +105,7 @@ add_llvm_library(LLVMCodeGen RegisterUsageInfo.cpp RegUsageInfoCollector.cpp RegUsageInfoPropagate.cpp + ResetMachineFunctionPass.cpp SafeStack.cpp SafeStackColoring.cpp SafeStackLayout.cpp diff --git a/llvm/lib/CodeGen/LLVMTargetMachine.cpp b/llvm/lib/CodeGen/LLVMTargetMachine.cpp index 844e1ff..e11eb01 100644 --- a/llvm/lib/CodeGen/LLVMTargetMachine.cpp +++ b/llvm/lib/CodeGen/LLVMTargetMachine.cpp @@ -168,6 +168,15 @@ addPassesToGenerateCode(LLVMTargetMachine *TM, PassManagerBase &PM, if (PassConfig->addGlobalInstructionSelect()) return nullptr; + // Pass to reset the MachineFunction if the ISel failed. + PM.add(createResetMachineFunctionPass()); + + // Provide a fallback path when we do not want to abort on + // not-yet-supported input. + if (LLVM_UNLIKELY(!PassConfig->isGlobalISelAbortEnabled()) && + PassConfig->addInstSelector()) + return nullptr; + } else if (PassConfig->addInstSelector()) return nullptr; diff --git a/llvm/lib/CodeGen/ResetMachineFunctionPass.cpp b/llvm/lib/CodeGen/ResetMachineFunctionPass.cpp new file mode 100644 index 0000000..3b7729a --- /dev/null +++ b/llvm/lib/CodeGen/ResetMachineFunctionPass.cpp @@ -0,0 +1,53 @@ +//===-- ResetMachineFunctionPass.cpp - Machine Loop Invariant Code Motion Pass ---------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// +//===----------------------------------------------------------------------===// + +#include "llvm/CodeGen/Passes.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFunctionPass.h" +#include "llvm/Support/Debug.h" +using namespace llvm; + +#define DEBUG_TYPE "reset-machine-function" + +namespace { + class ResetMachineFunction : public MachineFunctionPass { + public: + static char ID; // Pass identification, replacement for typeid + ResetMachineFunction() : + MachineFunctionPass(ID) { + } + + const char *getPassName() const override { + return "ResetMachineFunction"; + } + + bool runOnMachineFunction(MachineFunction &MF) override { + if (MF.getProperties().hasProperty( + MachineFunctionProperties::Property::FailedISel)) { + DEBUG(dbgs() << "Reseting: " << MF.getName() << '\n'); + MF.reset(); + return true; + } + return false; + } + + }; +} // end anonymous namespace + +char ResetMachineFunction::ID = 0; +INITIALIZE_PASS(ResetMachineFunction, DEBUG_TYPE, + "reset machine function if ISel failed", false, false) + +MachineFunctionPass * +llvm::createResetMachineFunctionPass() { + return new ResetMachineFunction(); +} diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll new file mode 100644 index 0000000..1dcf63a --- /dev/null +++ b/llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll @@ -0,0 +1,19 @@ +; RUN: not llc -O0 -global-isel -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefix=ERROR +; RUN: llc -O0 -global-isel -global-isel-abort=false -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefix=FALLBACK +; This file checks that the fallback path to selection dag works. +; The test is fragile in the sense that it must be updated to expose +; something that fails with global-isel. +; When we cannot produce a test case anymore, that means we can remove +; the fallback path. + +target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" +target triple = "aarch64-apple-ios" + +; ERROR: Unable to lower arguments +; FALLBACK: ldr q0, +; FALLBACK-NEXT: bl ___fixunstfti +define i128 @ABIi128(i128 %arg1) { + %farg1 = bitcast i128 %arg1 to fp128 + %res = fptoui fp128 %farg1 to i128 + ret i128 %res +}