This adds a late Machine Pass to work around a Cortex CPU Erratum affecting Cortex-A57 and Cortex-A72: - Cortex-A57 Erratum 1742098 - Cortex-A72 Erratum 1655431 The pass inserts instructions to make the inputs to the fused AES instruction pairs no longer trigger the erratum. Here the pass errs on the side of caution, inserting the instructions wherever we cannot prove that the inputs came from a safe instruction. The pass is used: - for Cortex-A57 and Cortex-A72, - for "generic" cores (which are used when using `-march=`), - when the user specifies `-mfix-cortex-a57-aes-1742098` or `mfix-cortex-a72-aes-1655431` in the command-line arguments to clang. Reviewed By: dmgreen, simon_tatham Differential Revision: https://reviews.llvm.org/D119720
86 lines
3.3 KiB
C++
86 lines
3.3 KiB
C++
//===-- ARM.h - Top-level interface for ARM representation ------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains the entry points for global functions defined in the LLVM
|
|
// ARM back-end.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_ARM_ARM_H
|
|
#define LLVM_LIB_TARGET_ARM_ARM_H
|
|
|
|
#include "llvm/IR/LegacyPassManager.h"
|
|
#include "llvm/Support/CodeGen.h"
|
|
#include <functional>
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
|
|
class ARMAsmPrinter;
|
|
class ARMBaseTargetMachine;
|
|
class ARMRegisterBankInfo;
|
|
class ARMSubtarget;
|
|
class Function;
|
|
class FunctionPass;
|
|
class InstructionSelector;
|
|
class MachineInstr;
|
|
class MCInst;
|
|
class PassRegistry;
|
|
|
|
Pass *createMVETailPredicationPass();
|
|
FunctionPass *createARMLowOverheadLoopsPass();
|
|
FunctionPass *createARMBlockPlacementPass();
|
|
Pass *createARMParallelDSPPass();
|
|
FunctionPass *createARMISelDag(ARMBaseTargetMachine &TM,
|
|
CodeGenOpt::Level OptLevel);
|
|
FunctionPass *createA15SDOptimizerPass();
|
|
FunctionPass *createARMLoadStoreOptimizationPass(bool PreAlloc = false);
|
|
FunctionPass *createARMExpandPseudoPass();
|
|
FunctionPass *createARMBranchTargetsPass();
|
|
FunctionPass *createARMConstantIslandPass();
|
|
FunctionPass *createMLxExpansionPass();
|
|
FunctionPass *createThumb2ITBlockPass();
|
|
FunctionPass *createMVEVPTBlockPass();
|
|
FunctionPass *createMVETPAndVPTOptimisationsPass();
|
|
FunctionPass *createARMOptimizeBarriersPass();
|
|
FunctionPass *createThumb2SizeReductionPass(
|
|
std::function<bool(const Function &)> Ftor = nullptr);
|
|
InstructionSelector *
|
|
createARMInstructionSelector(const ARMBaseTargetMachine &TM, const ARMSubtarget &STI,
|
|
const ARMRegisterBankInfo &RBI);
|
|
Pass *createMVEGatherScatterLoweringPass();
|
|
FunctionPass *createARMSLSHardeningPass();
|
|
FunctionPass *createARMIndirectThunks();
|
|
Pass *createMVELaneInterleavingPass();
|
|
FunctionPass *createARMFixCortexA57AES1742098Pass();
|
|
|
|
void LowerARMMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI,
|
|
ARMAsmPrinter &AP);
|
|
|
|
void initializeARMParallelDSPPass(PassRegistry &);
|
|
void initializeARMLoadStoreOptPass(PassRegistry &);
|
|
void initializeARMPreAllocLoadStoreOptPass(PassRegistry &);
|
|
void initializeARMBranchTargetsPass(PassRegistry &);
|
|
void initializeARMConstantIslandsPass(PassRegistry &);
|
|
void initializeARMExpandPseudoPass(PassRegistry &);
|
|
void initializeThumb2SizeReducePass(PassRegistry &);
|
|
void initializeThumb2ITBlockPass(PassRegistry &);
|
|
void initializeMVEVPTBlockPass(PassRegistry &);
|
|
void initializeMVETPAndVPTOptimisationsPass(PassRegistry &);
|
|
void initializeARMLowOverheadLoopsPass(PassRegistry &);
|
|
void initializeARMBlockPlacementPass(PassRegistry &);
|
|
void initializeMVETailPredicationPass(PassRegistry &);
|
|
void initializeMVEGatherScatterLoweringPass(PassRegistry &);
|
|
void initializeARMSLSHardeningPass(PassRegistry &);
|
|
void initializeMVELaneInterleavingPass(PassRegistry &);
|
|
void initializeARMFixCortexA57AES1742098Pass(PassRegistry &);
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_LIB_TARGET_ARM_ARM_H
|