CGIR.xcc

Benoit Dupont de Dinechin (Benoit.Dupont-de-Dinechinst.com). Christophe Guillon (Christophe.Guillonst.com).

Copyright 2002 - 2007 STMicroelectronics. Copyright 1995 - 1998 Commissariat a l'Energie Atomique.

This program is free software; you can redistribute it and/or modify it under the terms of either (at your option): the GNU General Public License (GPL) version 2; the GNU Lesser General Public License (LGPL) version 2.1; any later version of these licences as published by the Free Software Foundation.

Host compiler CGIR types.

typedef uint32_t CGIR_LAB;
typedef uint32_t CGIR_SYM;
typedef struct WN *CGIR_WN;
typedef struct tn *CGIR_TN;
typedef struct op *CGIR_OP;
typedef struct bb *CGIR_BB;
typedef struct LOOP_DESCR *CGIR_LD;
typedef struct region_id *CGIR_RID;
CGIROperationFlags— Used to pass OperationFlag to CGIR_OP.
typedef enum {
  CGIROperationFlags_SafeAccess = 0x1,
  CGIROperationFlags_Hoisted = 0x2,
  CGIROperationFlags_Volatile = 0x4,
  CGIROperationFlags_Prefetch = 0x8,
  CGIROperationFlags_Preload = 0x10,
  CGIROperationFlags_Barrier = 0x20,
  CGIROperationFlags_SpillCode = 0x40,
  CGIROperationFlags_SafePerfs = 0x80,
} enum_CGIROperationFlags;
typedef uint8_t CGIROperationFlags;
CGIRBasicBlockFlags— Used to pass BasicBlockFlag to CGIR_OP.
typedef enum {
  CGIRBasicBlockFlags_Allocated = 0x1,
  CGIRBasicBlockFlags_Scheduled = 0x2,
} CGIRBasicBlockFlags;

uint32_t CGIR_LAB_identity(CGIR_LAB cgir_lab); -- Identity of a CGIR_LAB.

#define CGIR_LAB_identity(cgir_lab) \
  (uint32_t)(cgir_lab)

uint32_t CGIR_SYM_identity(CGIR_SYM cgir_sym); -- Identity of a CGIR_SYM.

#define CGIR_SYM_identity(cgir_sym) \
  (uint32_t)(cgir_sym)

uint32_t CGIR_TN_identity(CGIR_TN cgir_tn); -- Identity of a CGIR_TN.

#define CGIR_TN_identity(cgir_tn) \
  (uint32_t)(cgir_tn)

uint32_t CGIR_OP_identity(CGIR_OP cgir_op); -- Identity of a CGIR_OP.

#define CGIR_OP_identity(cgir_op) \
      (uint32_t)(cgir_op)

uint32_t CGIR_BB_identity(CGIR_BB cgir_bb); -- Identity of a CGIR_BB.

#define CGIR_BB_identity(cgir_bb) \
  (uint32_t)(cgir_bb)

uint32_t CGIR_LD_identity(CGIR_LD cgir_ld); -- Identity of a CGIR_LD.

#define CGIR_LD_identity(cgir_ld) \
  (uint32_t)(cgir_ld)
CGIR_LAB_make— Update a CGIR_LAB.
static CGIR_LAB
CGIR_LAB_make(CGIR_LAB cgir_lab, const char *name);
CGIR_SYM_make— Update a CGIR_SYM.
static CGIR_SYM
CGIR_SYM_make(CGIR_SYM cgir_sym, const char *name, bool isSpill, NativeType lai_nativeType);
CGIR_TN_make— Update a CGIR_TN.
static CGIR_TN
CGIR_TN_make(CGIR_TN cgir_tn, CGIRType cgir_type, ...);
CGIR_OP_make— Update a CGIR_OP from a LIR Operation.
static CGIR_OP
CGIR_OP_make(CGIR_OP cgir_op, Operator lai_operator, CGIR_TN arguments[], CGIR_TN results[], CGIR_OP orig_op);

void CGIR_BB_make -- Update a CGIR_BB.

static CGIR_BB
CGIR_BB_make(CGIR_BB cgir_bb, CGIR_LAB labels[], CGIR_OP operations[], CGIR_RID cgir_rid, float frequency);
CGIR_LD_make— Update a CGIR_LD.
static CGIR_LD
CGIR_LD_make(CGIR_LD cgir_ld, CGIR_BB head_bb, CGIR_TN trip_count_tn, int unrolled);
CGIR_BB_chain— Chain two CGIR_BBs in the CGIR.
static void
CGIR_BB_chain(CGIR_BB cgir_bb, CGIR_BB succ_cgir_bb);
CGIR_BB_unchain— Unchain a CGIR_BB in the CGIR.
static void
CGIR_BB_unchain(CGIR_BB cgir_bb);
CGIR_BB_link— Link two CGIR_BBs in the CGIR with the given branch probability.
static void
CGIR_BB_link(CGIR_BB tail_cgir_bb, CGIR_BB head_cgir_bb, float probability);

void CGIR_BB_unlink(CGIR_BB cgir_bb, bool preds, bool succs);

Unlink the predecessors and/or the successors of a CGIR_BB in the CGIR.
static void
CGIR_BB_unlink(CGIR_BB cgir_bb, bool preds, bool succs);

void CGIR_BB_discard(CGIR_BB cgir_bb);

Discard a CGIR_BB in the CGIR.
static void
CGIR_BB_discard(CGIR_BB cgir_bb);
CGIR_CallBack— Call back functions.
struct CGIR_CallBack_ {
  CGIR_LAB (*LAB_make)(CGIR_LAB cgir_lab, const char *name);
  CGIR_SYM (*SYM_make)(CGIR_SYM cgir_sym, const char *name, bool isSpill, NativeType lai_nativeType);
  CGIR_TN (*TN_make)(CGIR_TN cgir_tn, CGIRType cgir_type, ...);
  CGIR_OP (*OP_make)(CGIR_OP cgir_op, Operator lai_operator, CGIR_TN arguments[], CGIR_TN results[], CGIR_OP orig_op);
  void (*OP_more)(CGIR_OP cgir_op, int iteration, int startDate, unsigned flags);
  CGIR_BB (*BB_make)(CGIR_BB cgir_bb, CGIR_LAB labels[], CGIR_OP operations[], CGIR_RID cgir_rid, float frequency);
  void (*BB_more)(CGIR_BB cgir_bb, CGIR_BB loop_bb, intptr_t traceId, int unrolled, unsigned flags);
  CGIR_LD (*LD_make)(CGIR_LD cgir_ld, CGIR_BB head_bb, CGIR_TN trip_count_tn, int unrolled);
  void (*BB_chain)(CGIR_BB cgir_bb, CGIR_BB succ_cgir_bb);
  void (*BB_unchain)(CGIR_BB cgir_bb);
  void (*BB_link)(CGIR_BB tail_cgir_bb, CGIR_BB head_cgir_bb, float probability);
  void (*BB_unlink)(CGIR_BB cgir_bb, bool preds, bool succs);
  void (*BB_discard)(CGIR_BB cgir_bb);
};
O64_Interface— O64 Interface object. All functions for the LAO Interface are available from this object.
struct O64_Interface_ {
  int size;
  void (*Interface_Initialize)(void);
  void (*Interface_Finalize)(void);
  struct Interface_* (*Interface_getInstance)(void);
  void (*Interface_setMaxIssue)(struct Interface_* this, Processor processor,
                                int maxIssue);
  void (*Interface_setMinTaken)(struct Interface_* this, Processor processor,
                                int minTaken);
  void (*Interface_setReserved)(struct Interface_* this, Convention convention,
                                Register reserved);
  bool (*Interface_setArgStage)(struct Interface_* this, Processor processor,
                                Operator operator, int index, int stage);
  bool (*Interface_setResStage)(struct Interface_* this, Processor processor,
                                Operator operator, int index, int stage);
  Label (*Interface_makeLabel)(struct Interface_* this, CGIR_LAB cgir_lab,
                               const char *name);
  Label (*Interface_findLabel)(struct Interface_* this, CGIR_LAB cgir_lab);
  Symbol (*Interface_makeSymbol)(struct Interface_* this, CGIR_SYM cgir_sym,
                                 const char *name);
  void (*Interface_Symbol_setClasses)(struct Interface_* this, Symbol symbol,
                                      SymbolClass sclass, SymbolStore sstore,
                                      SymbolExport sexport);
  Symbol (*Interface_findSymbol)(struct Interface_* this, CGIR_SYM cgir_sym);
  Temporary (*Interface_makeDedicatedTemporary)(struct Interface_* this, CGIR_TN cgir_tn,
                                                Register registre);
  Temporary (*Interface_makeAssignedTemporary)(struct Interface_* this, CGIR_TN cgir_tn,
                                               Register registre);
  Temporary (*Interface_makeVirtualTemporary)(struct Interface_* this, CGIR_TN cgir_tn,
                                              RegFile regFile);
  Temporary (*Interface_makeAbsoluteTemporary)(struct Interface_* this, CGIR_TN cgir_tn,
                                               Immediate immediate, int64_t value);
  Temporary (*Interface_makeSymbolTemporary)(struct Interface_* this, CGIR_TN cgir_tn,
                                             Immediate immediate, Symbol symbol,
                                             int64_t offset);
  Temporary (*Interface_makeLabelTemporary)(struct Interface_* this, CGIR_TN cgir_tn,
                                            Immediate immediate, Label label);
  void (*Interface_Temporary_setWidth)(struct Interface_* this, Temporary temporary,
                                       unsigned width);
  void (*Interface_Temporary_setRemater)(struct Interface_* this, Temporary temporary,
                                         Temporary value);
  void (*Interface_Temporary_setHomeable)(struct Interface_* this, Temporary temporary,
                                          Temporary location);
  void (*Interface_Temporary_setDedicated)(struct Interface_* this, Temporary temporary);
  Temporary (*Interface_findTemporary)(struct Interface_* this, CGIR_TN cgir_tn);
  uint32_t (*Interface_Temporary_identity)(Temporary temporary);
  int (*Interface_Temporary_isAbsolute)(Temporary temporary);
  int64_t (*Interface_Temporary_value)(Temporary temporary);
  int (*Interface_Temporary_isSymbol)(Temporary temporary);
  Symbol (*Interface_Temporary_symbol)(Temporary temporary);
  int64_t (*Interface_Temporary_offset)(Temporary temporary);
  Immediate (*Interface_Temporary_invariant)(Temporary temporary);
  int (*Interface_Temporary_isVirtual)(Temporary temporary);
  int (*Interface_Temporary_isDedicated)(Temporary temporary);
  int (*Interface_Temporary_isAssigned)(Temporary temporary);
  Register (*Interface_Temporary_register)(Temporary temporary);
  RegFile (*Interface_Temporary_regFile)(Temporary temporary);
  uint32_t (*Interface_Symbol_identity)(Symbol symbol);
  const char * (*Interface_Symbol_name)(Symbol symbol);
  int (*Interface_Symbol_isSpill)(Symbol symbol);
  NativeType (*Interface_Symbol_nativeType)(Symbol symbol);
  uint32_t (*Interface_Operation_identity)(Operation operation);
  Operator (*Interface_Operation_operator)(Operation operation);
  int (*Interface_Operation_iteration)(Operation operation);
  int (*Interface_Operation_startDate)(Operation operation);
  int (*Interface_Operation_isSpillCode)(Operation operation);
  int (*Interface_Operation_isVolatile)(Operation operation);
  int (*Interface_Operation_isHoisted)(Operation operation);
  uint32_t (*Interface_Label_identity)(Label label);
  const char * (*Interface_Label_name)(Label label);
  uint32_t (*Interface_BasicBlock_identity)(BasicBlock basicBlock);
  int (*Interface_BasicBlock_unrolled)(BasicBlock basicBlock);
  intptr_t (*Interface_BasicBlock_traceId)(BasicBlock basicBlock);
  uint32_t (*Interface_LoopScope_identity)(LoopScope loopScope);
  int (*Interface_LoopScope_unrolled)(LoopScope loopScope);
  Operation (*Interface_makeOperation)(struct Interface_* this,
      CGIR_OP cgir_op, Operator operator, int iteration,
      int argCount, Temporary arguments[], int resCount,
      Temporary results[], int regCount, int registers[]);
  Operation (*Interface_findOperation)(struct Interface_* this, CGIR_OP cgir_op);
  void (*Interface_Operation_setSafeAccess)(struct Interface_* this, Operation operation);
  void (*Interface_Operation_setHoisted)(struct Interface_* this, Operation operation);
  void (*Interface_Operation_setVolatile)(struct Interface_* this, Operation operation);
  void (*Interface_Operation_setPrefetch)(struct Interface_* this, Operation operation);
  void (*Interface_Operation_setPreload)(struct Interface_* this, Operation operation);
  void (*Interface_Operation_setBarrier)(struct Interface_* this, Operation operation);
  void (*Interface_Operation_setSafePerfs)(struct Interface_* this, Operation operation);
  void (*Interface_Operation_setSpillCode)(struct Interface_* this, Operation operation,
                                           Symbol symbol);
  BasicBlock (*Interface_makeBasicBlock)(struct Interface_* this, CGIR_BB cgir_bb,
                                         Processor processor, int unrolled,
                                         int labelCount, Label labels[],
                                         int operationCount, Operation operations[],
                                         intptr_t regionId, float frequency);
  BasicBlock (*Interface_findBasicBlock)(struct Interface_* this, CGIR_BB cgir_bb);
  void (*Interface_linkBasicBlocks)(struct Interface_* this,
      BasicBlock tail_block, BasicBlock head_block, float probability);
  LoopScope (*Interface_makeLoopScope)(struct Interface_* this, CGIR_LD cgir_ld,
                                     BasicBlock basicBlock, Temporary temporary,
                                     ConfigureItem item, ...);
  LoopScope (*Interface_findLoopScope)(struct Interface_* this, CGIR_LD cgir_ld);
  void (*Interface_LoopScope_setDependenceNode)(struct Interface_* this,
      LoopScope loopScope, Operation operation, DependenceNode node);
  void (*Interface_LoopScope_setDependenceArc)(struct Interface_* this,
      LoopScope loopScope, Operation tail_operation, Operation head_operation,
      int latency, int omega, DependenceKind type);
  void (*Interface_setBody)(struct Interface_* this, BasicBlock basicBlock);
  void (*Interface_setEntry)(struct Interface_* this, BasicBlock basicBlock);
  void (*Interface_setExit)(struct Interface_* this, BasicBlock basicBlock);
  void (*Interface_setStart)(struct Interface_* this, BasicBlock basicBlock);
  void (*Interface_updateCGIR)(struct Interface_* this, CGIR_CallBack callback);
  void (*Interface_open)(struct Interface_* this, const char *name,
                         ConfigureItem item, ...);
  unsigned (*Interface_optimize)(struct Interface_* this, OptimizeItem item, ...);
  void (*Interface_close)(struct Interface_* this);
};
O64_getInstance— The singleton O64_Interface instance.
O64_Interface
O64_getInstance(void);

Accessors to the O64_Interface functions. O64_instance must be an O64_Interface object.

#define O64_Interface_Initialize (*O64_instance->Interface_Initialize)
#define O64_Interface_Finalize (*O64_instance->Interface_Finalize)
#define O64_Interface_getInstance (*O64_instance->Interface_getInstance)
#define O64_Interface_setMaxIssue (*O64_instance->Interface_setMaxIssue)
#define O64_Interface_setMinTaken (*O64_instance->Interface_setMinTaken)
#define O64_Interface_setReserved (*O64_instance->Interface_setReserved)
#define O64_Interface_setArgStage (*O64_instance->Interface_setArgStage)
#define O64_Interface_setResStage (*O64_instance->Interface_setResStage)
#define O64_Interface_makeLabel (*O64_instance->Interface_makeLabel)
#define O64_Interface_findLabel (*O64_instance->Interface_findLabel)
#define O64_Interface_makeSymbol (*O64_instance->Interface_makeSymbol)
#define O64_Interface_Symbol_setClasses (*O64_instance->Interface_Symbol_setClasses)
#define O64_Interface_findSymbol (*O64_instance->Interface_findSymbol)
#define O64_Interface_makeDedicatedTemporary (*O64_instance->Interface_makeDedicatedTemporary)
#define O64_Interface_makeAssignedTemporary (*O64_instance->Interface_makeAssignedTemporary)
#define O64_Interface_makeVirtualTemporary (*O64_instance->Interface_makeVirtualTemporary)
#define O64_Interface_makeAbsoluteTemporary (*O64_instance->Interface_makeAbsoluteTemporary)
#define O64_Interface_makeSymbolTemporary (*O64_instance->Interface_makeSymbolTemporary)
#define O64_Interface_makeLabelTemporary (*O64_instance->Interface_makeLabelTemporary)
#define O64_Interface_Temporary_setWidth (*O64_instance->Interface_Temporary_setWidth)
#define O64_Interface_Temporary_setRemater (*O64_instance->Interface_Temporary_setRemater)
#define O64_Interface_Temporary_setHomeable (*O64_instance->Interface_Temporary_setHomeable)
#define O64_Interface_Temporary_setDedicated (*O64_instance->Interface_Temporary_setDedicated)
#define O64_Interface_findTemporary (*O64_instance->Interface_findTemporary)
#define O64_Interface_Temporary_identity (*O64_instance->Interface_Temporary_identity)
#define O64_Interface_Temporary_isAbsolute (*O64_instance->Interface_Temporary_isAbsolute)
#define O64_Interface_Temporary_value (*O64_instance->Interface_Temporary_value)
#define O64_Interface_Temporary_isSymbol (*O64_instance->Interface_Temporary_isSymbol)
#define O64_Interface_Temporary_symbol (*O64_instance->Interface_Temporary_symbol)
#define O64_Interface_Temporary_offset (*O64_instance->Interface_Temporary_offset)
#define O64_Interface_Temporary_invariant (*O64_instance->Interface_Temporary_invariant)
#define O64_Interface_Temporary_isVirtual (*O64_instance->Interface_Temporary_isVirtual)
#define O64_Interface_Temporary_isDedicated (*O64_instance->Interface_Temporary_isDedicated)
#define O64_Interface_Temporary_isAssigned (*O64_instance->Interface_Temporary_isAssigned)
#define O64_Interface_Temporary_register (*O64_instance->Interface_Temporary_register)
#define O64_Interface_Temporary_regFile (*O64_instance->Interface_Temporary_regFile)
#define O64_Interface_Symbol_identity (*O64_instance->Interface_Symbol_identity)
#define O64_Interface_Symbol_name (*O64_instance->Interface_Symbol_name)
#define O64_Interface_Symbol_isSpill (*O64_instance->Interface_Symbol_isSpill)
#define O64_Interface_Symbol_nativeType (*O64_instance->Interface_Symbol_nativeType)
#define O64_Interface_Operation_identity (*O64_instance->Interface_Operation_identity)
#define O64_Interface_Operation_operator (*O64_instance->Interface_Operation_operator)
#define O64_Interface_Operation_iteration (*O64_instance->Interface_Operation_iteration)
#define O64_Interface_Operation_startDate (*O64_instance->Interface_Operation_startDate)
#define O64_Interface_Operation_isSpillCode (*O64_instance->Interface_Operation_isSpillCode)
#define O64_Interface_Operation_isVolatile (*O64_instance->Interface_Operation_isVolatile)
#define O64_Interface_Operation_isHoisted (*O64_instance->Interface_Operation_isHoisted)
#define O64_Interface_Label_identity (*O64_instance->Interface_Label_identity)
#define O64_Interface_Label_name (*O64_instance->Interface_Label_name)
#define O64_Interface_BasicBlock_identity (*O64_instance->Interface_BasicBlock_identity)
#define O64_Interface_BasicBlock_unrolled (*O64_instance->Interface_BasicBlock_unrolled)
#define O64_Interface_BasicBlock_traceId (*O64_instance->Interface_BasicBlock_traceId)
#define O64_Interface_LoopScope_identity (*O64_instance->Interface_LoopScope_identity)
#define O64_Interface_LoopScope_unrolled (*O64_instance->Interface_LoopScope_unrolled)
#define O64_Interface_makeOperation (*O64_instance->Interface_makeOperation)
#define O64_Interface_findOperation (*O64_instance->Interface_findOperation)
#define O64_Interface_Operation_setSafeAccess (*O64_instance->Interface_Operation_setSafeAccess)
#define O64_Interface_Operation_setHoisted (*O64_instance->Interface_Operation_setHoisted)
#define O64_Interface_Operation_setVolatile (*O64_instance->Interface_Operation_setVolatile)
#define O64_Interface_Operation_setPrefetch (*O64_instance->Interface_Operation_setPrefetch)
#define O64_Interface_Operation_setPreload (*O64_instance->Interface_Operation_setPreload)
#define O64_Interface_Operation_setBarrier (*O64_instance->Interface_Operation_setBarrier)
#define O64_Interface_Operation_setSafePerfs (*O64_instance->Interface_Operation_setSafePerfs)
#define O64_Interface_Operation_setSpillCode (*O64_instance->Interface_Operation_setSpillCode)
#define O64_Interface_makeBasicBlock (*O64_instance->Interface_makeBasicBlock)
#define O64_Interface_findBasicBlock (*O64_instance->Interface_findBasicBlock)
#define O64_Interface_linkBasicBlocks (*O64_instance->Interface_linkBasicBlocks)
#define O64_Interface_makeLoopScope (*O64_instance->Interface_makeLoopScope)
#define O64_Interface_findLoopScope (*O64_instance->Interface_findLoopScope)
#define O64_Interface_LoopScope_setDependenceNode (*O64_instance->Interface_LoopScope_setDependenceNode)
#define O64_Interface_LoopScope_setDependenceArc (*O64_instance->Interface_LoopScope_setDependenceArc)
#define O64_Interface_setBody (*O64_instance->Interface_setBody)
#define O64_Interface_setEntry (*O64_instance->Interface_setEntry)
#define O64_Interface_setExit (*O64_instance->Interface_setExit)
#define O64_Interface_setStart (*O64_instance->Interface_setStart)
#define O64_Interface_updateCGIR (*O64_instance->Interface_updateCGIR)
#define O64_Interface_open (*O64_instance->Interface_open)
#define O64_Interface_optimize (*O64_instance->Interface_optimize)
#define O64_Interface_close (*O64_instance->Interface_close)