### From cTuning.org

Navigation:cTuning.org>CTools>MilepostGCC

**Static Features available in MILEPOST GCC V2.1**:

- Mircea Namolaru (IBM) developed the first version of the feature extractor for MILEPOST GCC and Grigori Fursin (INRIA/UVSQ) integrated it within the MILEPOST GCC and cTuning framework together with the machine learning support to predict good optimizations.
- Jeremy Singer (University of Manchester) provided extensions
- We are currently extending feature extractor to improve program characterization and mapping with beneficial optimizations.
- We are looking for volunteers to add more features such as polyhedral representation features, hardware counter features, etc.

### File **featlstn.P** - 55 features (removed duplicate feature ft21)

**featlstn.P**

ft1 | Number of basic blocks in the method |

ft2 | Number of basic blocks with a single successor |

ft3 | Number of basic blocks with two successors |

ft4 | Number of basic blocks with more then two successors |

ft5 | Number of basic blocks with a single predecessor |

ft6 | Number of basic blocks with two predecessors |

ft7 | Number of basic blocks with more then two predecessors |

ft8 | Number of basic blocks with a single predecessor and a single successor |

ft9 | Number of basic blocks with a single predecessor and two successors |

ft10 | Number of basic blocks with a two predecessors and one successor |

ft11 | Number of basic blocks with two successors and two predecessors |

ft12 | Number of basic blocks with more then two successors and more then two predecessors |

ft13 | Number of basic blocks with number of instructions less then 15 |

ft14 | Number of basic blocks with number of instructions in the interval [15, 500] |

ft15 | Number of basic blocks with number of instructions greater then 500 |

ft16 | Number of edges in the control flow graph |

ft17 | Number of critical edges in the control flow graph |

ft18 | Number of abnormal edges in the control flow graph |

ft19 | Number of direct calls in the method |

ft20 | Number of conditional branches in the method |

ft21 | Number of assignment instructions in the method |

ft22 | Number of binary integer operations in the method |

ft23 | Number of binary floating point operations in the method |

ft24 | Number of instructions in the method |

ft25 | Average of number of instructions in basic blocks |

ft26 | Average of number of phi-nodes at the beginning of a basic block |

ft27 | Average of arguments for a phi-node |

ft28 | Number of basic blocks with no phi nodes |

ft29 | Number of basic blocks with phi nodes in the interval [0, 3] |

ft30 | Number of basic blocks with more then 3 phi nodes |

ft31 | Number of basic block where total number of arguments for all phi-nodes is in greater then 5 |

ft32 | Number of basic block where total number of arguments for all phi-nodes is in the interval [1, 5] |

ft33 | Number of switch instructions in the method |

ft34 | Number of unary operations in the method |

ft35 | Number of instruction that do pointer arithmetic in the method |

ft36 | Number of indirect references via pointers ("*" in C) |

ft37 | Number of times the address of a variables is taken ("\&" in C) |

ft38 | Number of times the address of a function is taken ("\&" in C) |

ft39 | Number of indirect calls (i.e. done via pointers) in the method |

ft40 | Number of assignment instructions with the left operand an integer constant in the method |

ft41 | Number of binary operations with one of the operands an integer constant in the method |

ft42 | Number of calls with pointers as arguments |

ft42 | Number of calls with the number of arguments is greater then 4 |

ft44 | Number of calls that return a pointer |

ft45 | Number of calls that return an integer |

ft46 | Number of occurrences of integer constant zero |

ft47 | Number of occurrences of 32-bit integer constants |

ft48 | Number of occurrences of integer constant one |

ft49 | Number of occurrences of 64-bit integer constants |

ft50 | Number of references of a local variables in the method |

ft51 | Number of references (def/use) of static/extern variables in the method |

ft52 | Number of local variables referred in the method |

ft53 | Number of static/extern variables referred in the method |

ft54 | Number of local variables that are pointers in the method |

ft55 | Number of static/extern variables that are pointers in the method |

### File **featlstn1.P** - 56 features (move duplicate feature to ft56)

**featlstn1.P**

ft56 | Number of unconditional branches in the method |

### File **featlstn2.P** - 65 features (ft57-65 features have been added by Jeremy Singer)

**featlstn2.P**

ft57 |
CYCLOMATIC COMPLEXITY N == number of return instrs in fn N1 == number of cond instrs in fn N2 == N1-N N3 == N2+2. definition of cyclomatic complexity from: http://en.wikipedia.org/wiki/Cyclomatic_complexity |

ft58 |
Jeremy Singer addition: HALSTEAD's METRICS described at http://en.wikipedia.org/wiki/Halstead_complexity_measures HN2 is total number of operands (Halstead N2) |

ft59 | Hn2 is number of distinct operands (Halstead n2) |

ft60 | N is num var defs (should be == Halstead n2 or Halstead N2?) |

ft61 | HN1 is total number of operators (Halstead N1) (approx due to abstraction) |

ft62 | Hn1 is number of distinct operators (Halstead n1) (approx due to abstraction) |

ft63 |
approx of Halstead difficulty D == Hn1/2 * (HN2 / Hn2) (NB uses the aver routine to avoid problems with 0 divisor in computation of HN2/Hn2) |

ft64 |
approx of Halstead volume volume == HN *log_2(Hn) where HN == HN1+HN2 and Hn == Hn1+Hn2 |

ft65 |
approx of Halstead effort, which == Difficulty * Volume |