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
f81eb3aa
Commit
f81eb3aa
authored
Jan 26, 2012
by
Matthias Braun
Browse files
be: fix phi constraints double width values
parent
0c6c4fcf
Changes
7
Hide whitespace changes
Inline
Side-by-side
ir/be/benode.c
View file @
f81eb3aa
...
...
@@ -1075,9 +1075,8 @@ static const arch_irn_ops_t dummy_be_irn_ops = {
ir_node
*
be_new_Phi
(
ir_node
*
block
,
int
n_ins
,
ir_node
**
ins
,
ir_mode
*
mode
,
const
arch_register_
class
_t
*
cls
)
const
arch_register_
req
_t
*
req
)
{
const
arch_register_req_t
*
req
;
ir_graph
*
irg
=
get_irn_irg
(
block
);
struct
obstack
*
obst
=
be_get_be_obst
(
irg
);
backend_info_t
*
info
;
...
...
@@ -1089,11 +1088,6 @@ ir_node *be_new_Phi(ir_node *block, int n_ins, ir_node **ins, ir_mode *mode,
memset
(
info
->
out_infos
,
0
,
1
*
sizeof
(
info
->
out_infos
[
0
]));
info
->
in_reqs
=
OALLOCN
(
obst
,
const
arch_register_req_t
*
,
n_ins
);
if
(
cls
==
NULL
)
{
req
=
arch_no_register_req
;
}
else
{
req
=
cls
->
class_req
;
}
info
->
out_infos
[
0
].
req
=
req
;
for
(
i
=
0
;
i
<
n_ins
;
++
i
)
{
info
->
in_reqs
[
i
]
=
req
;
...
...
ir/be/benode.h
View file @
f81eb3aa
...
...
@@ -450,7 +450,7 @@ void be_dump_phi_reg_reqs(FILE *out, const ir_node *node, dump_reason_t reason);
* Creates a new phi with associated backend informations
*/
ir_node
*
be_new_Phi
(
ir_node
*
block
,
int
n_ins
,
ir_node
**
ins
,
ir_mode
*
mode
,
const
arch_register_
class
_t
*
cls
);
const
arch_register_
req
_t
*
req
);
/**
* Search for output of start node with a specific register
...
...
ir/be/beprefalloc.c
View file @
f81eb3aa
...
...
@@ -1769,7 +1769,8 @@ static void allocate_coalesce_block(ir_node *block, void *data)
if
(
need_phi
)
{
ir_mode
*
mode
=
get_irn_mode
(
node
);
ir_node
*
phi
=
be_new_Phi
(
block
,
n_preds
,
phi_ins
,
mode
,
cls
);
ir_node
*
phi
=
be_new_Phi
(
block
,
n_preds
,
phi_ins
,
mode
,
cls
->
class_req
);
DB
((
dbg
,
LEVEL_3
,
"Create Phi %+F (for %+F) -"
,
phi
,
node
));
#ifdef DEBUG_libfirm
...
...
ir/be/bespillutil.c
View file @
f81eb3aa
...
...
@@ -462,7 +462,7 @@ static void spill_phi(spill_env_t *env, spill_info_t *spillinfo)
/* override or replace spills list... */
spill
=
OALLOC
(
&
env
->
obst
,
spill_t
);
spill
->
after
=
determine_spill_point
(
phi
);
spill
->
spill
=
be_new_Phi
(
block
,
arity
,
ins
,
mode_M
,
NULL
);
spill
->
spill
=
be_new_Phi
(
block
,
arity
,
ins
,
mode_M
,
arch_no_register_req
);
spill
->
next
=
NULL
;
sched_add_after
(
block
,
spill
->
spill
);
...
...
ir/be/bessaconstr.c
View file @
f81eb3aa
...
...
@@ -245,7 +245,7 @@ static ir_node *insert_dummy_phi(be_ssa_construction_env_t *env, ir_node *block)
for
(
i
=
0
;
i
<
n_preds
;
++
i
)
{
ins
[
i
]
=
dummy
;
}
phi
=
be_new_Phi
(
block
,
n_preds
,
ins
,
env
->
mode
,
env
->
phi_
cls
);
phi
=
be_new_Phi
(
block
,
n_preds
,
ins
,
env
->
mode
,
env
->
phi_
req
);
sched_add_after
(
block
,
phi
);
ARR_APP1
(
ir_node
*
,
env
->
new_phis
,
phi
);
...
...
@@ -458,6 +458,24 @@ void be_ssa_construction_destroy(be_ssa_construction_env_t *env)
stat_ev_ctx_pop
(
"bessaconstr"
);
}
static
void
determine_phi_req
(
be_ssa_construction_env_t
*
env
,
ir_node
*
value
)
{
const
arch_register_req_t
*
req
=
arch_get_irn_register_req
(
value
);
env
->
mode
=
get_irn_mode
(
value
);
if
(
req
->
width
==
1
)
{
env
->
phi_req
=
req
->
cls
->
class_req
;
}
else
{
/* construct a new register req... */
ir_graph
*
irg
=
get_irn_irg
(
value
);
struct
obstack
*
obst
=
be_get_be_obst
(
irg
);
arch_register_req_t
*
new_req
=
OALLOCZ
(
obst
,
arch_register_req_t
);
new_req
->
cls
=
req
->
cls
;
new_req
->
type
=
req
->
type
&
arch_register_req_type_aligned
;
new_req
->
width
=
req
->
width
;
env
->
phi_req
=
new_req
;
}
}
void
be_ssa_construction_add_copy
(
be_ssa_construction_env_t
*
env
,
ir_node
*
copy
)
{
...
...
@@ -466,8 +484,7 @@ void be_ssa_construction_add_copy(be_ssa_construction_env_t *env,
assert
(
env
->
iterated_domfront_calculated
==
0
);
if
(
env
->
mode
==
NULL
)
{
env
->
mode
=
get_irn_mode
(
copy
);
env
->
phi_cls
=
arch_get_irn_reg_class
(
copy
);
determine_phi_req
(
env
,
copy
);
}
else
{
assert
(
env
->
mode
==
get_irn_mode
(
copy
));
}
...
...
@@ -488,8 +505,7 @@ void be_ssa_construction_add_copies(be_ssa_construction_env_t *env,
assert
(
env
->
iterated_domfront_calculated
==
0
);
if
(
env
->
mode
==
NULL
)
{
env
->
mode
=
get_irn_mode
(
copies
[
0
]);
env
->
phi_cls
=
arch_get_irn_reg_class
(
copies
[
0
]);
determine_phi_req
(
env
,
copies
[
0
]);
}
for
(
i
=
0
;
i
<
copies_len
;
++
i
)
{
...
...
ir/be/bessaconstr.h
View file @
f81eb3aa
...
...
@@ -62,7 +62,7 @@ typedef struct be_ssa_construction_env_t {
ir_graph
*
irg
;
const
be_dom_front_info_t
*
domfronts
;
ir_mode
*
mode
;
const
arch_register_
class
_t
*
phi_
cls
;
const
arch_register_
req
_t
*
phi_
req
;
waitq
*
worklist
;
const
ir_nodeset_t
*
ignore_uses
;
ir_node
**
new_phis
;
...
...
ir/be/bestate.c
View file @
f81eb3aa
...
...
@@ -182,7 +182,8 @@ static void spill_phi(minibelady_env_t *env, ir_node *phi)
DBG
((
dbg
,
LEVEL_2
,
"
\t
create Phi-M for %+F
\n
"
,
phi
));
/* create a Phi-M */
spill_info
->
spill
=
be_new_Phi
(
block
,
arity
,
phi_in
,
mode_M
,
NULL
);
spill_info
->
spill
=
be_new_Phi
(
block
,
arity
,
phi_in
,
mode_M
,
arch_no_register_req
);
sched_add_after
(
block
,
spill_info
->
spill
);
if
(
spill_to_kill
!=
NULL
)
{
...
...
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