Commit ac4a7e21 by Alexander Monakov Committed by Alexander Monakov

haifa-sched.c (haifa_classify_insn): Rename to ...

	* gcc/haifa-sched.c (haifa_classify_insn): Rename to ...
	(haifa_classify_rtx): ...  this.  Improve handling of COND_EXECs,
	handle PARALLELs by recursing.  Use it ...  
	(haifa_classify_insn): ...  here.  Reimplement.

From-SVN: r130050
parent 18f310b7
2007-11-09 Alexander Monakov <amonakov@ispras.ru>
* gcc/haifa-sched.c (haifa_classify_insn): Rename to ...
(haifa_classify_rtx): ... this. Improve handling of COND_EXECs,
handle PARALLELs by recursing. Use it ...
(haifa_classify_insn): ... here. Reimplement.
2007-11-09 Richard Guenther <rguenther@suse.de> 2007-11-09 Richard Guenther <rguenther@suse.de>
* bitmap.h (bitmap_single_bit_set_p): Declare. * bitmap.h (bitmap_single_bit_set_p): Declare.
...@@ -405,8 +405,9 @@ may_trap_exp (const_rtx x, int is_store) ...@@ -405,8 +405,9 @@ may_trap_exp (const_rtx x, int is_store)
} }
} }
/* Classifies insn for the purpose of verifying that it can be /* Classifies rtx X of an insn for the purpose of verifying that X can be
moved speculatively, by examining it's patterns, returning: executed speculatively (and consequently the insn can be moved
speculatively), by examining X, returning:
TRAP_RISKY: store, or risky non-load insn (e.g. division by variable). TRAP_RISKY: store, or risky non-load insn (e.g. division by variable).
TRAP_FREE: non-load insn. TRAP_FREE: non-load insn.
IFREE: load from a globally safe location. IFREE: load from a globally safe location.
...@@ -414,45 +415,20 @@ may_trap_exp (const_rtx x, int is_store) ...@@ -414,45 +415,20 @@ may_trap_exp (const_rtx x, int is_store)
PFREE_CANDIDATE, PRISKY_CANDIDATE: load that need to be checked for PFREE_CANDIDATE, PRISKY_CANDIDATE: load that need to be checked for
being either PFREE or PRISKY. */ being either PFREE or PRISKY. */
int static int
haifa_classify_insn (const_rtx insn) haifa_classify_rtx (const_rtx x)
{ {
rtx pat = PATTERN (insn);
int tmp_class = TRAP_FREE; int tmp_class = TRAP_FREE;
int insn_class = TRAP_FREE; int insn_class = TRAP_FREE;
enum rtx_code code; enum rtx_code code;
if (GET_CODE (pat) == PARALLEL) if (GET_CODE (x) == PARALLEL)
{ {
int i, len = XVECLEN (pat, 0); int i, len = XVECLEN (x, 0);
for (i = len - 1; i >= 0; i--) for (i = len - 1; i >= 0; i--)
{ {
code = GET_CODE (XVECEXP (pat, 0, i)); tmp_class = haifa_classify_rtx (XVECEXP (x, 0, i));
switch (code)
{
case CLOBBER:
/* Test if it is a 'store'. */
tmp_class = may_trap_exp (XEXP (XVECEXP (pat, 0, i), 0), 1);
break;
case SET:
/* Test if it is a store. */
tmp_class = may_trap_exp (SET_DEST (XVECEXP (pat, 0, i)), 1);
if (tmp_class == TRAP_RISKY)
break;
/* Test if it is a load. */
tmp_class
= WORST_CLASS (tmp_class,
may_trap_exp (SET_SRC (XVECEXP (pat, 0, i)),
0));
break;
case COND_EXEC:
case TRAP_IF:
tmp_class = TRAP_RISKY;
break;
default:
;
}
insn_class = WORST_CLASS (insn_class, tmp_class); insn_class = WORST_CLASS (insn_class, tmp_class);
if (insn_class == TRAP_RISKY || insn_class == IRISKY) if (insn_class == TRAP_RISKY || insn_class == IRISKY)
break; break;
...@@ -460,24 +436,30 @@ haifa_classify_insn (const_rtx insn) ...@@ -460,24 +436,30 @@ haifa_classify_insn (const_rtx insn)
} }
else else
{ {
code = GET_CODE (pat); code = GET_CODE (x);
switch (code) switch (code)
{ {
case CLOBBER: case CLOBBER:
/* Test if it is a 'store'. */ /* Test if it is a 'store'. */
tmp_class = may_trap_exp (XEXP (pat, 0), 1); tmp_class = may_trap_exp (XEXP (x, 0), 1);
break; break;
case SET: case SET:
/* Test if it is a store. */ /* Test if it is a store. */
tmp_class = may_trap_exp (SET_DEST (pat), 1); tmp_class = may_trap_exp (SET_DEST (x), 1);
if (tmp_class == TRAP_RISKY) if (tmp_class == TRAP_RISKY)
break; break;
/* Test if it is a load. */ /* Test if it is a load. */
tmp_class = tmp_class =
WORST_CLASS (tmp_class, WORST_CLASS (tmp_class,
may_trap_exp (SET_SRC (pat), 0)); may_trap_exp (SET_SRC (x), 0));
break; break;
case COND_EXEC: case COND_EXEC:
tmp_class = haifa_classify_rtx (COND_EXEC_CODE (x));
if (tmp_class == TRAP_RISKY)
break;
tmp_class = WORST_CLASS (tmp_class,
may_trap_exp (COND_EXEC_TEST (x), 0));
break;
case TRAP_IF: case TRAP_IF:
tmp_class = TRAP_RISKY; tmp_class = TRAP_RISKY;
break; break;
...@@ -489,6 +471,13 @@ haifa_classify_insn (const_rtx insn) ...@@ -489,6 +471,13 @@ haifa_classify_insn (const_rtx insn)
return insn_class; return insn_class;
} }
int
haifa_classify_insn (const_rtx insn)
{
return haifa_classify_rtx (PATTERN (insn));
}
/* A typedef for rtx vector. */ /* A typedef for rtx vector. */
typedef VEC(rtx, heap) *rtx_vec_t; typedef VEC(rtx, heap) *rtx_vec_t;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment