Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Zwinkau
libfirm
Commits
ce29d67e
Commit
ce29d67e
authored
Nov 26, 2012
by
Matthias Braun
Browse files
query firmstat options through lc_opt system
parent
5f623be3
Changes
13
Hide whitespace changes
Inline
Side-by-side
include/libfirm/firmstat.h
View file @
ce29d67e
...
...
@@ -25,142 +25,9 @@
#ifndef FIRM_STAT_FIRMSTAT_H
#define FIRM_STAT_FIRMSTAT_H
#include "ir
hook
s.h"
#include "
f
ir
m_type
s.h"
#include "begin.h"
/**
* Statistic options, can be or'ed.
*/
enum
firmstat_options_t
{
FIRMSTAT_ENABLED
=
0x00000001
,
/**< enable statistics */
FIRMSTAT_PATTERN_ENABLED
=
0x00000002
,
/**< enable pattern calculation */
FIRMSTAT_COUNT_STRONG_OP
=
0x00000004
,
/**< if set, count Mul/Div/Mod by constant */
FIRMSTAT_COUNT_DAG
=
0x00000008
,
/**< if set, count DAG statistics */
FIRMSTAT_COUNT_DELETED
=
0x00000010
,
/**< if set, count deleted graphs */
FIRMSTAT_COUNT_SELS
=
0x00000020
,
/**< if set, count Sel(Sel(..)) differently */
FIRMSTAT_COUNT_CONSTS
=
0x00000040
,
/**< if set, count Const statistics */
FIRMSTAT_CSV_OUTPUT
=
0x10000000
/**< CSV output of some mini-statistic */
};
/**
* Additional flags for statistics.
*/
enum
firmstat_optimizations_t
{
FS_OPT_NEUTRAL_0
=
HOOK_OPT_LAST
,
/**< a op 0 = 0 op a = a */
FS_OPT_NEUTRAL_1
,
/**< a op 1 = 1 op a = a */
FS_OPT_ADD_A_A
,
/**< a + a = a * 2 */
FS_OPT_ADD_A_MINUS_B
,
/**< a + -b = a - b */
FS_OPT_ADD_SUB
,
/**< (a + x) - x = (a - x) + x */
FS_OPT_ADD_MUL_A_X_A
,
/**< a * x + a = a * (x + 1) */
FS_OPT_SUB_0_A
,
/**< 0 - a = -a */
FS_OPT_MINUS_SUB
,
/**< - (a - b) = b - a */
FS_OPT_SUB_MINUS
,
/**< a - (-b) = a + b */
FS_OPT_SUB_MUL_A_X_A
,
/**< a * x - a = a * (x - 1) */
FS_OPT_SUB_SUB_X_Y_Z
,
/**< (x - y) - z = x - (y + z) */
FS_OPT_SUB_C_NOT_X
,
/**< c - ~a = a + (c+1) */
FS_OPT_SUB_TO_ADD
,
/**< (-a) - b = -(a + b), a - (b - c) = a + (c - b), a - (b * C) -> a + (b * -C) */
FS_OPT_SUB_TO_NOT
,
/**< -1 - x -> ~x on two's complement */
FS_OPT_SUB_TO_CONV
,
/**< a - NULL = (int)a */
FS_OPT_MUL_MINUS
,
/**< (-a) * (b - c) -> a * (c - b) */
FS_OPT_MUL_MINUS_1
,
/**< a * -1 = -a */
FS_OPT_MINUS_MUL_C
,
/**< (-a) * C = a * (-C) */
FS_OPT_MUL_MINUS_MINUS
,
/**< (-a) * (-b) = a * b */
FS_OPT_OR
,
/**< a | a = a | 0 = 0 | a = a */
FS_OPT_AND
,
/**< a & 0b1...1 = 0b1...1 & a = a & a = a */
FS_OPT_TO_EOR
,
/**< (a|b) & ~(a&b) = a^b */
FS_OPT_EOR_A_A
,
/**< a ^ a = 0 */
FS_OPT_EOR_A_B_A
,
/**< (a ^ b) ^ a = b */
FS_OPT_EOR_TO_NOT_BOOL
,
/**< bool ^ 1 = !bool */
FS_OPT_EOR_TO_NOT
,
/**< x ^ 0b1..1 = ~x, (a ^ b) & b -> ~a & b */
FS_OPT_NOT_CMP
,
/**< !(a cmp b) = a !cmp b */
FS_OPT_OR_SHFT_TO_ROTL
,
/**< (x << c) | (x >> (bits - c)) == Rotl(x, c) */
FS_OPT_REASSOC_SHIFT
,
/**< (x SHF c1) SHF c2 = x SHF (c1+c2) */
FS_OPT_SHIFT_AND
,
/**< (a SHF c) AND (b SHF c) = (a AND b) SHF c */
FS_OPT_SHIFT_OR
,
/**< (a SHF c) OR (b SHF c) = (a OR b) SHF c */
FS_OPT_SHIFT_EOR
,
/**< (a SHF c) XOR (b SHF c) = (a XOR b) SHF c */
FS_OPT_CONV
,
/**< a Conv could be removed */
FS_OPT_CAST
,
/**< a Cast could be removed */
FS_OPT_MIN_MAX_EQ
,
/**< Min(a,a) = Max(a,a) = a */
FS_OPT_MUX_COMBINE
,
/**< two Mux nodes where combined into one */
FS_OPT_MUX_CONV
,
/**< MuxI(sel, 1, 0) = (I)sel */
FS_OPT_MUX_BOOL
,
/**< Muxb(sel, true, false) = sel */
FS_OPT_MUX_NOT_BOOL
,
/**< Muxb(sel, false, true) = Not(sel) */
FS_OPT_MUX_OR_BOOL
,
/**< Muxb(sel, true, x) = Or(sel, x) */
FS_OPT_MUX_ORNOT_BOOL
,
/**< Muxb(sel, x, true) = Or(Not(sel), x) */
FS_OPT_MUX_AND_BOOL
,
/**< Muxb(sel, x, false) = And(sel, x) */
FS_OPT_MUX_ANDNOT_BOOL
,
/**< Muxb(sel, false, x) = And(Not(sel), x) */
FS_OPT_MUX_C
,
/**< Mux(C, f, t) = C ? t : f */
FS_OPT_MUX_EQ
,
/**< Mux(v, x, x) = x */
FS_OPT_MUX_TRANSFORM
,
/**< Mux(t ==/!= f, t, f) = f/t, Mux(t ==/!= 0, -t, t) = -t/t */
FS_OPT_MUX_TO_MIN
,
/**< Mux(a < b, a, b) = Min(a,b) */
FS_OPT_MUX_TO_MAX
,
/**< Mux(a > b, a, b) = Max(a,b) */
FS_OPT_MUX_TO_BITOP
,
/**< Mux((a & 2^x) ==/!= 0, 2^x, 0) = (a & 2^x) (xor 2^x) */
FS_OPT_INVOLUTION
,
/**< OP(OP(x)) = x */
FS_OPT_MINUS_NOT
,
/**< -(~x) = x + 1 */
FS_OPT_NOT_MINUS_1
,
/**< ~(x - 1) = -x */
FS_OPT_NOT_PLUS_1
,
/**< ~x + 1 = -x */
FS_OPT_ADD_X_NOT_X
,
/**< ~x + x = -1 */
FS_OPT_FP_INV_MUL
,
/**< x / y = x * (1.0/y) */
FS_OPT_CONST_PHI
,
/**< Constant evaluation on Phi */
FS_OPT_PREDICATE
,
/**< Predicate optimization */
FS_OPT_DEMORGAN
,
/**< optimization using DeMorgan's law */
FS_OPT_CMP_OP_OP
,
/**< CMP optimization: Cmp(OP(x), OP(y)) = Cmp(x, y) */
FS_OPT_CMP_OP_C
,
/**< CMP optimization: Cmp(OP(x), c1) = Cmp(x, c2) */
FS_OPT_CMP_CONV_CONV
,
/**< CMP optimization: Cmp(Conv(x), Conv(y)) = Cmp(x, y) */
FS_OPT_CMP_CONV
,
/**< CMP optimization: Cmp(Conv(x), Conv(y)) = Cmp(Conv(x), y) */
FS_OPT_CMP_TO_BOOL
,
/**< CMP optimization: Cmp(x, y) = BoolOP(x, y) */
FS_OPT_CMP_CNST_MAGN
,
/**< CMP optimization: reduced magnitude of a const */
FS_OPT_CMP_SHF_TO_AND
,
/**< CMP optimization: transformed shift into And */
FS_OPT_CMP_MOD_TO_AND
,
/**< CMP optimization: transformed Mod into And */
FS_OPT_NOP
,
/**< the operation is a NOP */
FS_OPT_GVN_FOLLOWER
,
/**< GVN-PRE: replaced a follower */
FS_OPT_GVN_FULLY
,
/**< GVN-PRE: replaced by fully redundant value */
FS_OPT_GVN_PARTLY
,
/**< GVN-PRE: replaced by partly redundant value */
FS_OPT_COMBO_CONST
,
/**< Combo: evaluated into Constant */
FS_OPT_COMBO_CF
,
/**< Combo: removed conditional control flow */
FS_OPT_COMBO_FOLLOWER
,
/**< Combo: replaced a follower */
FS_OPT_COMBO_CONGRUENT
,
/**< Combo: replaced by congruent */
FS_OPT_JUMPTHREADING
,
/**< Jump threading: removed conditional control flow */
FS_OPT_RTS_ABS
,
/**< RTS optimization: call to abs() replaced */
FS_OPT_RTS_ALLOCA
,
/**< RTS optimization: call to alloca() replaced */
FS_OPT_RTS_SQRT
,
/**< RTS optimization: call to sqrt() replaced */
FS_OPT_RTS_CBRT
,
/**< RTS optimization: call to cbrt() replaced */
FS_OPT_RTS_POW
,
/**< RTS optimization: call to pow() replaced */
FS_OPT_RTS_EXP
,
/**< RTS optimization: call to exp() replaced */
FS_OPT_RTS_LOG
,
/**< RTS optimization: call to log() replaced */
FS_OPT_RTS_SIN
,
/**< RTS optimization: call to sin() replaced */
FS_OPT_RTS_COS
,
/**< RTS optimization: call to cos() replaced */
FS_OPT_RTS_TAN
,
/**< RTS optimization: call to tan() replaced */
FS_OPT_RTS_ASIN
,
/**< RTS optimization: call to asin() replaced */
FS_OPT_RTS_ACOS
,
/**< RTS optimization: call to acos() replaced */
FS_OPT_RTS_ATAN
,
/**< RTS optimization: call to atan() replaced */
FS_OPT_RTS_SINH
,
/**< RTS optimization: call to sinh() replaced */
FS_OPT_RTS_COSH
,
/**< RTS optimization: call to cosh() replaced */
FS_OPT_RTS_TANH
,
/**< RTS optimization: call to tanh() replaced */
FS_OPT_RTS_SYMMETRIC
,
/**< RTS optimization: call to symmetric function f(-x) replaced by f(x) */
FS_OPT_RTS_STRCMP
,
/**< RTS optimization: call to strcmp() replaced */
FS_OPT_RTS_STRNCMP
,
/**< RTS optimization: call to strncmp() replaced */
FS_OPT_RTS_STRCPY
,
/**< RTS optimization: call to strcpy() replaced */
FS_OPT_RTS_STRLEN
,
/**< RTS optimization: call to strlen() replaced */
FS_OPT_RTS_MEMCPY
,
/**< RTS optimization: call to memcpy() replaced */
FS_OPT_RTS_MEMPCPY
,
/**< RTS optimization: call to mempcpy() replaced */
FS_OPT_RTS_MEMMOVE
,
/**< RTS optimization: call to memmove() replaced */
FS_OPT_RTS_MEMSET
,
/**< RTS optimization: call to memset() replaced */
FS_OPT_RTS_MEMCMP
,
/**< RTS optimization: call to memcmp() replaced */
FS_BE_IA32_LEA
,
/**< Lea was created */
FS_BE_IA32_LOAD_LEA
,
/**< Load merged with a Lea */
FS_BE_IA32_STORE_LEA
,
/**< Store merged with a Lea */
FS_BE_IA32_AM_S
,
/**< Source address mode node created */
FS_BE_IA32_AM_D
,
/**< Destination address mode node created */
FS_BE_IA32_CJMP
,
/**< CJmp created to save a cmp/test */
FS_BE_IA32_2ADDRCPY
,
/**< Copy created due to 2-Addresscode constraints */
FS_BE_IA32_SPILL2ST
,
/**< Created Store for a Spill */
FS_BE_IA32_RELOAD2LD
,
/**< Created Load for a Reload */
FS_BE_IA32_SUB2NEGADD
,
/**< Created Neg-Add for a Sub due to 2-Addresscode constraints */
FS_BE_IA32_LEA2ADD
,
/**< Transformed Lea back into Add */
FS_OPT_MAX
};
/**
* Dump a snapshot of the statistic values.
* Never called from libFirm should be called from user.
...
...
@@ -185,10 +52,8 @@ FIRM_API ir_prog_pass_t *stat_dump_snapshot_pass(
/**
* initialize the statistics module.
* Should be called directly after ir_init
*
* @param enable_options a bitmask containing the statistic options
*/
FIRM_API
void
firm_init_stat
(
unsigned
enable_options
);
FIRM_API
void
firm_init_stat
(
void
);
/**
* terminates the statistics module, frees all memory
...
...
ir/be/ia32/bearch_ia32.c
View file @
ce29d67e
...
...
@@ -53,6 +53,7 @@
#include "lower_calls.h"
#include "lower_mode_b.h"
#include "lower_softfloat.h"
#include "firmstat_t.h"
#include "beabi.h"
#include "benode.h"
...
...
ir/be/ia32/ia32_finish.c
View file @
ce29d67e
...
...
@@ -32,6 +32,7 @@
#include "irprintf.h"
#include "pdeq.h"
#include "error.h"
#include "firmstat_t.h"
#include "bearch.h"
#include "besched.h"
...
...
ir/be/ia32/ia32_optimize.c
View file @
ce29d67e
...
...
@@ -37,6 +37,7 @@
#include "irprintf.h"
#include "irdump.h"
#include "error.h"
#include "firmstat_t.h"
#include "be_t.h"
#include "beabi.h"
...
...
ir/common/firm.c
View file @
ce29d67e
...
...
@@ -55,6 +55,7 @@
#include "be_t.h"
#include "irtools.h"
#include "execfreq_t.h"
#include "firmstat_t.h"
/* returns the firm root */
lc_opt_entry_t
*
firm_opt_get_root
(
void
)
...
...
@@ -114,6 +115,8 @@ void ir_init(void)
init_execfreq
();
init_stat
();
#ifdef DEBUG_libfirm
/* integrated debugger extension */
firm_init_debugger
();
...
...
ir/ir/iropt.c
View file @
ce29d67e
...
...
@@ -51,6 +51,7 @@
#include "bitfiddle.h"
#include "be.h"
#include "error.h"
#include "firmstat_t.h"
#include "entity_t.h"
...
...
ir/lower/lower_intrinsics.c
View file @
ce29d67e
...
...
@@ -44,6 +44,7 @@
#include "error.h"
#include "be.h"
#include "util.h"
#include "firmstat_t.h"
/** Walker environment. */
typedef
struct
walker_env
{
...
...
ir/opt/combo.c
View file @
ce29d67e
...
...
@@ -83,6 +83,7 @@
#include "irpass.h"
#include "tv_t.h"
#include "irtools.h"
#include "firmstat_t.h"
#include "irprintf.h"
#include "irdump.h"
...
...
ir/opt/gvn_pre.c
View file @
ce29d67e
...
...
@@ -42,6 +42,7 @@
#include "irpass.h"
#include "valueset.h"
#include "irloop.h"
#include "firmstat_t.h"
#include "irgraph_t.h"
#include "irnode_t.h"
...
...
ir/opt/jumpthreading.c
View file @
ce29d67e
...
...
@@ -46,6 +46,7 @@
#include "iropt_dbg.h"
#include "irpass.h"
#include "vrp.h"
#include "firmstat_t.h"
#undef AVOID_PHIB
...
...
ir/opt/opt_osr.c
View file @
ce29d67e
...
...
@@ -49,7 +49,7 @@
#include "irtools.h"
#include "irloop_t.h"
#include "array.h"
#include "firmstat.h"
#include "firmstat
_t
.h"
#include "error.h"
#include "irpass_t.h"
...
...
ir/stat/firmstat.c
View file @
ce29d67e
...
...
@@ -40,6 +40,10 @@
#include "irhooks.h"
#include "util.h"
#include "ircons.h"
#include "irtools.h"
#include "lc_opts.h"
#include "lc_opts_enum.h"
/*
* need this to be static:
...
...
@@ -72,6 +76,8 @@ static ir_op _op_SelSel;
/** A Sel of a Sel of a Sel */
static
ir_op
_op_SelSelSel
;
static
unsigned
stat_options
;
/* ---------------------------------------------------------------------------------- */
/** Marks the begin of a statistic (hook) function. */
...
...
@@ -2195,20 +2201,20 @@ ir_prog_pass_t *stat_dump_snapshot_pass(
static
hook_entry_t
stat_hooks
[
hook_last
];
/* initialize the statistics module. */
void
firm_init_stat
(
unsigned
enable_options
)
void
firm_init_stat
(
void
)
{
#define X(a) a, sizeof(a)-1
#define HOOK(h, fkt) \
stat_hooks[h].hook._##h = fkt; register_hook(h, &stat_hooks[h])
unsigned
num
=
0
;
if
(
!
(
enable
_options
&
FIRMSTAT_ENABLED
))
if
(
!
(
stat
_options
&
FIRMSTAT_ENABLED
))
return
;
status
=
XMALLOCZ
(
stat_info_t
);
/* enable statistics */
status
->
stat_options
=
enable
_options
&
FIRMSTAT_ENABLED
?
enable
_options
:
0
;
status
->
stat_options
=
stat
_options
&
FIRMSTAT_ENABLED
?
stat
_options
:
0
;
/* register all hooks */
HOOK
(
hook_new_ir_op
,
stat_new_ir_op
);
...
...
@@ -2243,7 +2249,7 @@ void firm_init_stat(unsigned enable_options)
/* create the wait queue */
status
->
wait_q
=
new_pdeq
();
if
(
enable
_options
&
FIRMSTAT_COUNT_STRONG_OP
)
{
if
(
stat
_options
&
FIRMSTAT_COUNT_STRONG_OP
)
{
/* build the pseudo-ops */
_op_Phi0
.
code
=
--
num
;
...
...
@@ -2280,7 +2286,7 @@ void firm_init_stat(unsigned enable_options)
}
/* if */
/* for Florian: count the Sel depth */
if
(
enable
_options
&
FIRMSTAT_COUNT_SELS
)
{
if
(
stat
_options
&
FIRMSTAT_COUNT_SELS
)
{
_op_SelSel
.
code
=
--
num
;
_op_SelSel
.
name
=
new_id_from_chars
(
X
(
"Sel(Sel)"
));
...
...
@@ -2297,14 +2303,14 @@ void firm_init_stat(unsigned enable_options)
/* register the dumper */
stat_register_dumper
(
&
simple_dumper
);
if
(
enable
_options
&
FIRMSTAT_CSV_OUTPUT
)
if
(
stat
_options
&
FIRMSTAT_CSV_OUTPUT
)
stat_register_dumper
(
&
csv_dumper
);
/* initialize the pattern hash */
stat_init_pattern_history
(
enable
_options
&
FIRMSTAT_PATTERN_ENABLED
);
stat_init_pattern_history
(
stat
_options
&
FIRMSTAT_PATTERN_ENABLED
);
/* initialize the Const options */
if
(
enable
_options
&
FIRMSTAT_COUNT_CONSTS
)
if
(
stat
_options
&
FIRMSTAT_COUNT_CONSTS
)
stat_init_const_cnt
(
status
);
/* distribution table for parameter counts */
...
...
@@ -2353,3 +2359,27 @@ int stat_is_active(void)
{
return
status
!=
(
stat_info_t
*
)
&
status_disable
;
}
/* stat_is_active */
void
init_stat
(
void
)
{
lc_opt_entry_t
*
root_grp
=
firm_opt_get_root
();
lc_opt_entry_t
*
be_grp
=
lc_opt_get_grp
(
root_grp
,
"be"
);
static
const
lc_opt_enum_mask_items_t
stat_items
[]
=
{
{
"enabled"
,
FIRMSTAT_ENABLED
},
{
"pattern"
,
FIRMSTAT_PATTERN_ENABLED
},
{
"count_strong_op"
,
FIRMSTAT_COUNT_STRONG_OP
},
{
"count_dag"
,
FIRMSTAT_COUNT_DAG
},
{
"count_deleted"
,
FIRMSTAT_COUNT_DELETED
},
{
"count_sels"
,
FIRMSTAT_COUNT_SELS
},
{
"count_consts"
,
FIRMSTAT_COUNT_CONSTS
},
{
"csv_output"
,
FIRMSTAT_CSV_OUTPUT
},
{
NULL
,
0
}
};
static
lc_opt_enum_mask_var_t
statmask
=
{
&
stat_options
,
stat_items
};
static
const
lc_opt_table_entry_t
stat_optionstable
[]
=
{
LC_OPT_ENT_ENUM_MASK
(
"statistics"
,
"enable statistics"
,
&
statmask
),
LC_OPT_LAST
};
lc_opt_add_table
(
be_grp
,
stat_optionstable
);
}
ir/stat/firmstat_t.h
View file @
ce29d67e
...
...
@@ -54,6 +54,139 @@ typedef pset hmap_perm_class_entry_t;
typedef
pset
hmap_ir_op
;
typedef
pset
hmap_distrib_entry_t
;
/**
* Statistic options, can be or'ed.
*/
enum
firmstat_options_t
{
FIRMSTAT_ENABLED
=
0x00000001
,
/**< enable statistics */
FIRMSTAT_PATTERN_ENABLED
=
0x00000002
,
/**< enable pattern calculation */
FIRMSTAT_COUNT_STRONG_OP
=
0x00000004
,
/**< if set, count Mul/Div/Mod by constant */
FIRMSTAT_COUNT_DAG
=
0x00000008
,
/**< if set, count DAG statistics */
FIRMSTAT_COUNT_DELETED
=
0x00000010
,
/**< if set, count deleted graphs */
FIRMSTAT_COUNT_SELS
=
0x00000020
,
/**< if set, count Sel(Sel(..)) differently */
FIRMSTAT_COUNT_CONSTS
=
0x00000040
,
/**< if set, count Const statistics */
FIRMSTAT_CSV_OUTPUT
=
0x10000000
/**< CSV output of some mini-statistic */
};
/**
* Additional flags for statistics.
*/
enum
firmstat_optimizations_t
{
FS_OPT_NEUTRAL_0
=
HOOK_OPT_LAST
,
/**< a op 0 = 0 op a = a */
FS_OPT_NEUTRAL_1
,
/**< a op 1 = 1 op a = a */
FS_OPT_ADD_A_A
,
/**< a + a = a * 2 */
FS_OPT_ADD_A_MINUS_B
,
/**< a + -b = a - b */
FS_OPT_ADD_SUB
,
/**< (a + x) - x = (a - x) + x */
FS_OPT_ADD_MUL_A_X_A
,
/**< a * x + a = a * (x + 1) */
FS_OPT_SUB_0_A
,
/**< 0 - a = -a */
FS_OPT_MINUS_SUB
,
/**< - (a - b) = b - a */
FS_OPT_SUB_MINUS
,
/**< a - (-b) = a + b */
FS_OPT_SUB_MUL_A_X_A
,
/**< a * x - a = a * (x - 1) */
FS_OPT_SUB_SUB_X_Y_Z
,
/**< (x - y) - z = x - (y + z) */
FS_OPT_SUB_C_NOT_X
,
/**< c - ~a = a + (c+1) */
FS_OPT_SUB_TO_ADD
,
/**< (-a) - b = -(a + b), a - (b - c) = a + (c - b), a - (b * C) -> a + (b * -C) */
FS_OPT_SUB_TO_NOT
,
/**< -1 - x -> ~x on two's complement */
FS_OPT_SUB_TO_CONV
,
/**< a - NULL = (int)a */
FS_OPT_MUL_MINUS
,
/**< (-a) * (b - c) -> a * (c - b) */
FS_OPT_MUL_MINUS_1
,
/**< a * -1 = -a */
FS_OPT_MINUS_MUL_C
,
/**< (-a) * C = a * (-C) */
FS_OPT_MUL_MINUS_MINUS
,
/**< (-a) * (-b) = a * b */
FS_OPT_OR
,
/**< a | a = a | 0 = 0 | a = a */
FS_OPT_AND
,
/**< a & 0b1...1 = 0b1...1 & a = a & a = a */
FS_OPT_TO_EOR
,
/**< (a|b) & ~(a&b) = a^b */
FS_OPT_EOR_A_A
,
/**< a ^ a = 0 */
FS_OPT_EOR_A_B_A
,
/**< (a ^ b) ^ a = b */
FS_OPT_EOR_TO_NOT_BOOL
,
/**< bool ^ 1 = !bool */
FS_OPT_EOR_TO_NOT
,
/**< x ^ 0b1..1 = ~x, (a ^ b) & b -> ~a & b */
FS_OPT_NOT_CMP
,
/**< !(a cmp b) = a !cmp b */
FS_OPT_OR_SHFT_TO_ROTL
,
/**< (x << c) | (x >> (bits - c)) == Rotl(x, c) */
FS_OPT_REASSOC_SHIFT
,
/**< (x SHF c1) SHF c2 = x SHF (c1+c2) */
FS_OPT_SHIFT_AND
,
/**< (a SHF c) AND (b SHF c) = (a AND b) SHF c */
FS_OPT_SHIFT_OR
,
/**< (a SHF c) OR (b SHF c) = (a OR b) SHF c */
FS_OPT_SHIFT_EOR
,
/**< (a SHF c) XOR (b SHF c) = (a XOR b) SHF c */
FS_OPT_CONV
,
/**< a Conv could be removed */
FS_OPT_CAST
,
/**< a Cast could be removed */
FS_OPT_MIN_MAX_EQ
,
/**< Min(a,a) = Max(a,a) = a */
FS_OPT_MUX_COMBINE
,
/**< two Mux nodes where combined into one */
FS_OPT_MUX_CONV
,
/**< MuxI(sel, 1, 0) = (I)sel */
FS_OPT_MUX_BOOL
,
/**< Muxb(sel, true, false) = sel */
FS_OPT_MUX_NOT_BOOL
,
/**< Muxb(sel, false, true) = Not(sel) */
FS_OPT_MUX_OR_BOOL
,
/**< Muxb(sel, true, x) = Or(sel, x) */
FS_OPT_MUX_ORNOT_BOOL
,
/**< Muxb(sel, x, true) = Or(Not(sel), x) */
FS_OPT_MUX_AND_BOOL
,
/**< Muxb(sel, x, false) = And(sel, x) */
FS_OPT_MUX_ANDNOT_BOOL
,
/**< Muxb(sel, false, x) = And(Not(sel), x) */
FS_OPT_MUX_C
,
/**< Mux(C, f, t) = C ? t : f */
FS_OPT_MUX_EQ
,
/**< Mux(v, x, x) = x */
FS_OPT_MUX_TRANSFORM
,
/**< Mux(t ==/!= f, t, f) = f/t, Mux(t ==/!= 0, -t, t) = -t/t */
FS_OPT_MUX_TO_MIN
,
/**< Mux(a < b, a, b) = Min(a,b) */
FS_OPT_MUX_TO_MAX
,
/**< Mux(a > b, a, b) = Max(a,b) */
FS_OPT_MUX_TO_BITOP
,
/**< Mux((a & 2^x) ==/!= 0, 2^x, 0) = (a & 2^x) (xor 2^x) */
FS_OPT_INVOLUTION
,
/**< OP(OP(x)) = x */
FS_OPT_MINUS_NOT
,
/**< -(~x) = x + 1 */
FS_OPT_NOT_MINUS_1
,
/**< ~(x - 1) = -x */
FS_OPT_NOT_PLUS_1
,
/**< ~x + 1 = -x */
FS_OPT_ADD_X_NOT_X
,
/**< ~x + x = -1 */
FS_OPT_FP_INV_MUL
,
/**< x / y = x * (1.0/y) */
FS_OPT_CONST_PHI
,
/**< Constant evaluation on Phi */
FS_OPT_PREDICATE
,
/**< Predicate optimization */
FS_OPT_DEMORGAN
,
/**< optimization using DeMorgan's law */
FS_OPT_CMP_OP_OP
,
/**< CMP optimization: Cmp(OP(x), OP(y)) = Cmp(x, y) */
FS_OPT_CMP_OP_C
,
/**< CMP optimization: Cmp(OP(x), c1) = Cmp(x, c2) */
FS_OPT_CMP_CONV_CONV
,
/**< CMP optimization: Cmp(Conv(x), Conv(y)) = Cmp(x, y) */
FS_OPT_CMP_CONV
,
/**< CMP optimization: Cmp(Conv(x), Conv(y)) = Cmp(Conv(x), y) */
FS_OPT_CMP_TO_BOOL
,
/**< CMP optimization: Cmp(x, y) = BoolOP(x, y) */
FS_OPT_CMP_CNST_MAGN
,
/**< CMP optimization: reduced magnitude of a const */
FS_OPT_CMP_SHF_TO_AND
,
/**< CMP optimization: transformed shift into And */
FS_OPT_CMP_MOD_TO_AND
,
/**< CMP optimization: transformed Mod into And */
FS_OPT_NOP
,
/**< the operation is a NOP */
FS_OPT_GVN_FOLLOWER
,
/**< GVN-PRE: replaced a follower */
FS_OPT_GVN_FULLY
,
/**< GVN-PRE: replaced by fully redundant value */
FS_OPT_GVN_PARTLY
,
/**< GVN-PRE: replaced by partly redundant value */
FS_OPT_COMBO_CONST
,
/**< Combo: evaluated into Constant */
FS_OPT_COMBO_CF
,
/**< Combo: removed conditional control flow */
FS_OPT_COMBO_FOLLOWER
,
/**< Combo: replaced a follower */
FS_OPT_COMBO_CONGRUENT
,
/**< Combo: replaced by congruent */
FS_OPT_JUMPTHREADING
,
/**< Jump threading: removed conditional control flow */
FS_OPT_RTS_ABS
,
/**< RTS optimization: call to abs() replaced */
FS_OPT_RTS_ALLOCA
,
/**< RTS optimization: call to alloca() replaced */
FS_OPT_RTS_SQRT
,
/**< RTS optimization: call to sqrt() replaced */
FS_OPT_RTS_CBRT
,
/**< RTS optimization: call to cbrt() replaced */
FS_OPT_RTS_POW
,
/**< RTS optimization: call to pow() replaced */
FS_OPT_RTS_EXP
,
/**< RTS optimization: call to exp() replaced */
FS_OPT_RTS_LOG
,
/**< RTS optimization: call to log() replaced */
FS_OPT_RTS_SIN
,
/**< RTS optimization: call to sin() replaced */
FS_OPT_RTS_COS
,
/**< RTS optimization: call to cos() replaced */
FS_OPT_RTS_TAN
,
/**< RTS optimization: call to tan() replaced */
FS_OPT_RTS_ASIN
,
/**< RTS optimization: call to asin() replaced */
FS_OPT_RTS_ACOS
,
/**< RTS optimization: call to acos() replaced */
FS_OPT_RTS_ATAN
,
/**< RTS optimization: call to atan() replaced */
FS_OPT_RTS_SINH
,
/**< RTS optimization: call to sinh() replaced */
FS_OPT_RTS_COSH
,
/**< RTS optimization: call to cosh() replaced */
FS_OPT_RTS_TANH
,
/**< RTS optimization: call to tanh() replaced */
FS_OPT_RTS_SYMMETRIC
,
/**< RTS optimization: call to symmetric function f(-x) replaced by f(x) */
FS_OPT_RTS_STRCMP
,
/**< RTS optimization: call to strcmp() replaced */
FS_OPT_RTS_STRNCMP
,
/**< RTS optimization: call to strncmp() replaced */
FS_OPT_RTS_STRCPY
,
/**< RTS optimization: call to strcpy() replaced */
FS_OPT_RTS_STRLEN
,
/**< RTS optimization: call to strlen() replaced */
FS_OPT_RTS_MEMCPY
,
/**< RTS optimization: call to memcpy() replaced */
FS_OPT_RTS_MEMPCPY
,
/**< RTS optimization: call to mempcpy() replaced */
FS_OPT_RTS_MEMMOVE
,
/**< RTS optimization: call to memmove() replaced */
FS_OPT_RTS_MEMSET
,
/**< RTS optimization: call to memset() replaced */
FS_OPT_RTS_MEMCMP
,
/**< RTS optimization: call to memcmp() replaced */
FS_BE_IA32_LEA
,
/**< Lea was created */
FS_BE_IA32_LOAD_LEA
,
/**< Load merged with a Lea */
FS_BE_IA32_STORE_LEA
,
/**< Store merged with a Lea */
FS_BE_IA32_AM_S
,
/**< Source address mode node created */
FS_BE_IA32_AM_D
,
/**< Destination address mode node created */
FS_BE_IA32_CJMP
,
/**< CJmp created to save a cmp/test */
FS_BE_IA32_2ADDRCPY
,
/**< Copy created due to 2-Addresscode constraints */
FS_BE_IA32_SPILL2ST
,
/**< Created Store for a Spill */
FS_BE_IA32_RELOAD2LD
,
/**< Created Load for a Reload */
FS_BE_IA32_SUB2NEGADD
,
/**< Created Neg-Add for a Sub due to 2-Addresscode constraints */
FS_BE_IA32_LEA2ADD
,
/**< Transformed Lea back into Add */
FS_OPT_MAX
};
/**
* An entry in a distribution table
*/
...
...
@@ -351,6 +484,12 @@ struct dumper_t {
unsigned
tag
;
/**< the id tag of the dumper */
};
/**
* internal init function, mainly registers commandline arguments.
* (The use still has to call firm_init_stat() later
*/
void
init_stat
(
void
);
/**
* helper: get an ir_op from an opcode
*/
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment