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
a441c754
Commit
a441c754
authored
Sep 16, 2011
by
Matthias Braun
Browse files
do not create ConstB nodes in GRAPH_STATE_MODEB_LOWERED
parent
1db02a46
Changes
1
Show whitespace changes
Inline
Side-by-side
ir/ir/iropt.c
View file @
a441c754
...
...
@@ -576,13 +576,7 @@ ir_relation ir_get_possible_cmp_relations(const ir_node *left,
return
possible
;
}
/**
* Return the value of a Cmp.
*
* The basic idea here is to determine which relations are possible and which
* one are definitely impossible.
*/
static
ir_tarval
*
computed_value_Cmp
(
const
ir_node
*
cmp
)
static
ir_tarval
*
compute_cmp
(
const
ir_node
*
cmp
)
{
ir_node
*
left
=
get_Cmp_left
(
cmp
);
ir_node
*
right
=
get_Cmp_right
(
cmp
);
...
...
@@ -599,6 +593,21 @@ static ir_tarval *computed_value_Cmp(const ir_node *cmp)
return
computed_value_Cmp_Confirm
(
cmp
,
left
,
right
,
relation
);
}
/**
* Return the value of a Cmp.
*
* The basic idea here is to determine which relations are possible and which
* one are definitely impossible.
*/
static
ir_tarval
*
computed_value_Cmp
(
const
ir_node
*
cmp
)
{
/* we can't construct Constb after lowering mode_b nodes */
if
(
is_irg_state
(
get_irn_irg
(
cmp
),
IR_GRAPH_STATE_MODEB_LOWERED
))
return
tarval_bad
;
return
compute_cmp
(
cmp
);
}
/**
* Calculate the value of an integer Div.
* Special case: 0 / b
...
...
@@ -1451,6 +1460,12 @@ static ir_node *equivalent_node_Mux(ir_node *n)
ir_node
*
n_t
,
*
n_f
;
ir_tarval
*
ts
=
value_of
(
sel
);
if
(
ts
==
tarval_bad
&&
is_Cmp
(
sel
))
{
/* try again with a direct call to compute_cmp, as we don't care
* about the MODEB_LOWERED flag here */
ts
=
compute_cmp
(
sel
);
}
/* Mux(true, f, t) == t */
if
(
ts
==
tarval_b_true
)
{
n
=
get_Mux_true
(
n
);
...
...
@@ -2781,14 +2796,25 @@ static ir_node *transform_node_Cond(ir_node *n)
{
ir_node
*
a
=
get_Cond_selector
(
n
);
ir_tarval
*
ta
=
value_of
(
a
);
ir_graph
*
irg
=
get_irn_irg
(
n
);
ir_tarval
*
ta
;
ir_node
*
jmp
;
/* we need block info which is not available in floating irgs */
if
(
get_irg_pinned
(
irg
)
==
op_pin_state_floats
)
return
n
;
/* we do not handle switches here */
if
(
get_irn_mode
(
a
)
!=
mode_b
)
return
n
;
ta
=
value_of
(
a
);
if
(
ta
==
tarval_bad
&&
is_Cmp
(
a
))
{
/* try again with a direct call to compute_cmp, as we don't care
* about the MODEB_LOWERED flag here */
ta
=
compute_cmp
(
a
);
}
if
(
ta
!=
tarval_bad
&&
get_irn_mode
(
a
)
==
mode_b
)
{
/* It's a boolean Cond, branching on a boolean constant.
Replace it by a tuple (Bad, Jmp) or (Jmp, Bad) */
...
...
@@ -4207,7 +4233,7 @@ static ir_node *transform_node_Cmp(ir_node *n)
}
/* for integer modes, we have more */
if
(
mode_is_int
(
mode
))
{
if
(
mode_is_int
(
mode
)
&&
!
is_Const
(
left
)
)
{
/* c > 0 : a < c ==> a <= (c-1) a >= c ==> a > (c-1) */
if
((
relation
==
ir_relation_less
||
relation
==
ir_relation_greater_equal
)
&&
tarval_cmp
(
tv
,
get_mode_null
(
mode
))
==
ir_relation_greater
)
{
...
...
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