Latency information for ARM v6. It's rough and not yet hooked up. Right now we are only using branch latency to determine if-conversion limits.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73747 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2009-06-19 01:51:50 +00:00
parent 6b7bb42c36
commit 8557c2bcb8
8 changed files with 147 additions and 52 deletions

View File

@ -45,62 +45,72 @@ def FeatureThumb2 : SubtargetFeature<"thumb2", "ThumbMode", "Thumb2",
// ARM Processors supported.
//
class Proc<string Name, list<SubtargetFeature> Features>
: Processor<Name, NoItineraries, Features>;
include "ARMSchedule.td"
class ProcNoItin<string Name, list<SubtargetFeature> Features>
: Processor<Name, GenericItineraries, Features>;
// V4 Processors.
def : Proc<"generic", []>;
def : Proc<"arm8", []>;
def : Proc<"arm810", []>;
def : Proc<"strongarm", []>;
def : Proc<"strongarm110", []>;
def : Proc<"strongarm1100", []>;
def : Proc<"strongarm1110", []>;
def : ProcNoItin<"generic", []>;
def : ProcNoItin<"arm8", []>;
def : ProcNoItin<"arm810", []>;
def : ProcNoItin<"strongarm", []>;
def : ProcNoItin<"strongarm110", []>;
def : ProcNoItin<"strongarm1100", []>;
def : ProcNoItin<"strongarm1110", []>;
// V4T Processors.
def : Proc<"arm7tdmi", [ArchV4T]>;
def : Proc<"arm7tdmi-s", [ArchV4T]>;
def : Proc<"arm710t", [ArchV4T]>;
def : Proc<"arm720t", [ArchV4T]>;
def : Proc<"arm9", [ArchV4T]>;
def : Proc<"arm9tdmi", [ArchV4T]>;
def : Proc<"arm920", [ArchV4T]>;
def : Proc<"arm920t", [ArchV4T]>;
def : Proc<"arm922t", [ArchV4T]>;
def : Proc<"arm940t", [ArchV4T]>;
def : Proc<"ep9312", [ArchV4T]>;
def : ProcNoItin<"arm7tdmi", [ArchV4T]>;
def : ProcNoItin<"arm7tdmi-s", [ArchV4T]>;
def : ProcNoItin<"arm710t", [ArchV4T]>;
def : ProcNoItin<"arm720t", [ArchV4T]>;
def : ProcNoItin<"arm9", [ArchV4T]>;
def : ProcNoItin<"arm9tdmi", [ArchV4T]>;
def : ProcNoItin<"arm920", [ArchV4T]>;
def : ProcNoItin<"arm920t", [ArchV4T]>;
def : ProcNoItin<"arm922t", [ArchV4T]>;
def : ProcNoItin<"arm940t", [ArchV4T]>;
def : ProcNoItin<"ep9312", [ArchV4T]>;
// V5T Processors.
def : Proc<"arm10tdmi", [ArchV5T]>;
def : Proc<"arm1020t", [ArchV5T]>;
def : ProcNoItin<"arm10tdmi", [ArchV5T]>;
def : ProcNoItin<"arm1020t", [ArchV5T]>;
// V5TE Processors.
def : Proc<"arm9e", [ArchV5TE]>;
def : Proc<"arm926ej-s", [ArchV5TE]>;
def : Proc<"arm946e-s", [ArchV5TE]>;
def : Proc<"arm966e-s", [ArchV5TE]>;
def : Proc<"arm968e-s", [ArchV5TE]>;
def : Proc<"arm10e", [ArchV5TE]>;
def : Proc<"arm1020e", [ArchV5TE]>;
def : Proc<"arm1022e", [ArchV5TE]>;
def : Proc<"xscale", [ArchV5TE]>;
def : Proc<"iwmmxt", [ArchV5TE]>;
def : ProcNoItin<"arm9e", [ArchV5TE]>;
def : ProcNoItin<"arm926ej-s", [ArchV5TE]>;
def : ProcNoItin<"arm946e-s", [ArchV5TE]>;
def : ProcNoItin<"arm966e-s", [ArchV5TE]>;
def : ProcNoItin<"arm968e-s", [ArchV5TE]>;
def : ProcNoItin<"arm10e", [ArchV5TE]>;
def : ProcNoItin<"arm1020e", [ArchV5TE]>;
def : ProcNoItin<"arm1022e", [ArchV5TE]>;
def : ProcNoItin<"xscale", [ArchV5TE]>;
def : ProcNoItin<"iwmmxt", [ArchV5TE]>;
// V6 Processors.
def : Proc<"arm1136j-s", [ArchV6]>;
def : Proc<"arm1136jf-s", [ArchV6, FeatureVFP2]>;
def : Proc<"arm1176jz-s", [ArchV6]>;
def : Proc<"arm1176jzf-s", [ArchV6, FeatureVFP2]>;
def : Proc<"mpcorenovfp", [ArchV6]>;
def : Proc<"mpcore", [ArchV6, FeatureVFP2]>;
def : Processor<"arm1136j-s", V6Itineraries,
[ArchV6]>;
def : Processor<"arm1136jf-s", V6Itineraries,
[ArchV6, FeatureVFP2]>;
def : Processor<"arm1176jz-s", V6Itineraries,
[ArchV6]>;
def : Processor<"arm1176jzf-s", V6Itineraries,
[ArchV6, FeatureVFP2]>;
def : Processor<"mpcorenovfp", V6Itineraries,
[ArchV6]>;
def : Processor<"mpcore", V6Itineraries,
[ArchV6, FeatureVFP2]>;
// V6T2 Processors.
def : Proc<"arm1156t2-s", [ArchV6T2, FeatureThumb2]>;
def : Proc<"arm1156t2f-s", [ArchV6T2, FeatureThumb2, FeatureVFP2]>;
def : Processor<"arm1156t2-s", V6Itineraries,
[ArchV6T2, FeatureThumb2]>;
def : Processor<"arm1156t2f-s", V6Itineraries,
[ArchV6T2, FeatureThumb2, FeatureVFP2]>;
// V7 Processors.
def : Proc<"cortex-a8", [ArchV7A, FeatureThumb2, FeatureNEON]>;
def : Proc<"cortex-a9", [ArchV7A, FeatureThumb2, FeatureNEON]>;
def : ProcNoItin<"cortex-a8", [ArchV7A, FeatureThumb2, FeatureNEON]>;
def : ProcNoItin<"cortex-a9", [ArchV7A, FeatureThumb2, FeatureNEON]>;
//===----------------------------------------------------------------------===//
// Register File Description

View File

@ -292,6 +292,21 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
setIfCvtBlockSizeLimit(Subtarget->isThumb() ? 0 : 10);
setIfCvtDupBlockSizeLimit(Subtarget->isThumb() ? 0 : 2);
if (!Subtarget->isThumb()) {
// Use branch latency information to determine if-conversion limits.
const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();
const InstrItineraryData &InstrItins = Subtarget->getInstrItineraryData();
unsigned Latency = InstrItins.getLatency(TII->get(ARM::BL).getSchedClass());
if (Latency > 1) {
setIfCvtBlockSizeLimit(Latency-1);
if (Latency > 2)
setIfCvtDupBlockSizeLimit(Latency-2);
} else {
setIfCvtBlockSizeLimit(10);
setIfCvtDupBlockSizeLimit(2);
}
}
maxStoresPerMemcpy = 1; //// temporary - rewrite interface to use type
// Do not enable CodePlacementOpt for now: it currently runs after the
// ARMConstantIslandPass and messes up branch relaxation and placement

View File

@ -539,7 +539,7 @@ let isReturn = 1, isTerminator = 1 in
LdStMulFrm, "ldm${p}${addr:submode} $addr, $dst1",
[]>;
let isCall = 1,
let isCall = 1, Itinerary = IIC_Br,
Defs = [R0, R1, R2, R3, R12, LR,
D0, D1, D2, D3, D4, D5, D6, D7, CPSR] in {
def BL : ABXI<0b1011, (outs), (ins i32imm:$func, variable_ops),
@ -567,7 +567,7 @@ let isCall = 1,
}
}
let isBranch = 1, isTerminator = 1 in {
let isBranch = 1, isTerminator = 1, Itinerary = IIC_Br in {
// B is "predicable" since it can be xformed into a Bcc.
let isBarrier = 1 in {
let isPredicable = 1 in

View File

@ -0,0 +1,35 @@
//===- ARMSchedule.td - ARM Scheduling Definitions ---------*- tablegen -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//===----------------------------------------------------------------------===//
// Functional units across ARM processors
//
def FU_iALU : FuncUnit; // Integer alu unit
def FU_iLdSt : FuncUnit; // Integer load / store unit
def FU_FpALU : FuncUnit; // FP alu unit
def FU_FpLdSt : FuncUnit; // FP load / store unit
def FU_Br : FuncUnit; // Branch unit
//===----------------------------------------------------------------------===//
// Instruction Itinerary classes used for ARM
//
def IIC_iALU : InstrItinClass;
def IIC_iLoad : InstrItinClass;
def IIC_iStore : InstrItinClass;
def IIC_fpALU : InstrItinClass;
def IIC_fpLoad : InstrItinClass;
def IIC_fpStore : InstrItinClass;
def IIC_Br : InstrItinClass;
//===----------------------------------------------------------------------===//
// Processor instruction itineraries.
def GenericItineraries : ProcessorItineraries<[]>;
include "ARMScheduleV6.td"

View File

@ -0,0 +1,22 @@
//===- ARMSchedule.td - ARM v6 Scheduling Definitions ------*- tablegen -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines the itinerary class data for the ARM v6 processors.
//
//===----------------------------------------------------------------------===//
def V6Itineraries : ProcessorItineraries<[
InstrItinData<IIC_iALU , [InstrStage<1, [FU_iALU]>]>,
InstrItinData<IIC_iLoad , [InstrStage<2, [FU_iLdSt]>]>,
InstrItinData<IIC_iStore , [InstrStage<1, [FU_iLdSt]>]>,
InstrItinData<IIC_fpALU , [InstrStage<6, [FU_FpALU]>]>,
InstrItinData<IIC_fpLoad , [InstrStage<2, [FU_FpLdSt]>]>,
InstrItinData<IIC_fpStore , [InstrStage<1, [FU_FpLdSt]>]>,
InstrItinData<IIC_Br , [InstrStage<3, [FU_Br]>]>
]>;

View File

@ -14,6 +14,7 @@
#ifndef ARMSUBTARGET_H
#define ARMSUBTARGET_H
#include "llvm/Target/TargetInstrItineraries.h"
#include "llvm/Target/TargetSubtarget.h"
#include <string>
@ -58,6 +59,9 @@ protected:
/// CPUString - String name of used CPU.
std::string CPUString;
/// Selected instruction itineraries (one entry per itinerary class.)
InstrItineraryData InstrItins;
public:
enum {
isELF, isDarwin
@ -110,6 +114,10 @@ protected:
const std::string & getCPUString() const { return CPUString; }
/// getInstrItins - Return the instruction itineraies based on subtarget
/// selection.
const InstrItineraryData &getInstrItineraryData() const { return InstrItins; }
/// getStackAlignment - Returns the minimum alignment known to hold of the
/// stack frame on entry to the function and which must be maintained by every
/// function for this subtarget.

View File

@ -102,7 +102,8 @@ ARMTargetMachine::ARMTargetMachine(const Module &M, const std::string &FS,
InstrInfo(Subtarget),
FrameInfo(Subtarget),
JITInfo(),
TLInfo(*this) {
TLInfo(*this),
InstrItins(Subtarget.getInstrItineraryData()) {
DefRelocModel = getRelocationModel();
}

View File

@ -28,13 +28,14 @@ namespace llvm {
class Module;
class ARMTargetMachine : public LLVMTargetMachine {
ARMSubtarget Subtarget;
const TargetData DataLayout; // Calculates type size & alignment
ARMInstrInfo InstrInfo;
ARMFrameInfo FrameInfo;
ARMJITInfo JITInfo;
ARMTargetLowering TLInfo;
Reloc::Model DefRelocModel; // Reloc model before it's overridden.
ARMSubtarget Subtarget;
const TargetData DataLayout; // Calculates type size & alignment
ARMInstrInfo InstrInfo;
ARMFrameInfo FrameInfo;
ARMJITInfo JITInfo;
ARMTargetLowering TLInfo;
InstrItineraryData InstrItins;
Reloc::Model DefRelocModel; // Reloc model before it's overridden.
protected:
// To avoid having target depend on the asmprinter stuff libraries, asmprinter
@ -59,6 +60,9 @@ public:
virtual ARMTargetLowering *getTargetLowering() const {
return const_cast<ARMTargetLowering*>(&TLInfo);
}
virtual const InstrItineraryData getInstrItineraryData() const {
return InstrItins;
}
static void registerAsmPrinter(AsmPrinterCtorFn F) {
AsmPrinterCtor = F;