Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
87ccab5d
Commit
87ccab5d
authored
Oct 05, 2015
by
Aditya Kumar
Committed by
Sebastian Pop
Oct 05, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
move param detection to scop detection
Co-Authored-By: Sebastian Pop <s.pop@samsung.com> From-SVN: r228493
parent
076d564d
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
310 additions
and
365 deletions
+310
-365
gcc/ChangeLog
+27
-0
gcc/graphite-poly.c
+66
-2
gcc/graphite-poly.h
+9
-2
gcc/graphite-scop-detection.c
+187
-30
gcc/graphite-sese-to-poly.c
+0
-324
gcc/graphite-sese-to-poly.h
+0
-6
gcc/graphite.c
+14
-0
gcc/testsuite/ChangeLog
+5
-0
gcc/testsuite/gcc.dg/graphite/scop-sor.c
+2
-1
No files found.
gcc/ChangeLog
View file @
87ccab5d
2015
-
10
-
05
Aditya
Kumar
<
aditya
.
k7
@
samsung
.
com
>
2015
-
10
-
05
Aditya
Kumar
<
aditya
.
k7
@
samsung
.
com
>
Sebastian
Pop
<
s
.
pop
@
samsung
.
com
>
Sebastian
Pop
<
s
.
pop
@
samsung
.
com
>
*
graphite
-
poly
.
c
(
new_gimple_poly_bb
):
...
here
.
(
free_data_refs_aux
):
...
here
.
(
free_gimple_poly_bb
):
...
here
.
(
remove_gbbs_in_scop
):
...
here
.
(
new_scop
):
Call
new_sese
.
(
free_scop
):
Call
remove_gbbs_in_scop
and
free_sese
.
*
graphite
-
poly
.
h
(
base_alias_pair
):
...
here
.
(
new_gimple_poly_bb
):
Declare
.
(
free_gimple_poly_bb
):
Declare
.
*
graphite
-
scop
-
detection
.
c
(
parameter_index_in_region_1
):
(
parameter_index_in_region
):
...
here
.
(
scan_tree_for_params
):
...
here
.
(
find_params_in_bb
):
...
here
.
(
find_scop_parameters
):
...
here
.
(
build_scops
):
Call
find_scop_parameters
.
*
graphite
-
sese
-
to
-
poly
.
c
(
free_gimple_poly_bb
):
Move
...
(
free_scops
):
Move
...
(
single_pred_cond_non_loop_exit
):
Move
...
(
sese_dom_walker
::
before_dom_children
):
Move
...
(
sese_dom_walker
::
after_dom_children
):
Move
...
(
build_poly_scop
):
Move
...
*
graphite
-
sese
-
to
-
poly
.
h
(
base_alias_pair
):
Move
...
*
graphite
.
c
(
free_scops
):
...
here
.
2015
-
10
-
05
Aditya
Kumar
<
aditya
.
k7
@
samsung
.
com
>
Sebastian
Pop
<
s
.
pop
@
samsung
.
com
>
*
graphite
-
scop
-
detection
.
c
:
Include
domwalk
.
h
and
tree
-
cfg
.
h
.
*
graphite
-
scop
-
detection
.
c
:
Include
domwalk
.
h
and
tree
-
cfg
.
h
.
(
trivially_empty_bb_p
):
Move
...
(
trivially_empty_bb_p
):
Move
...
(
same_close_phi_node
):
Move
...
(
same_close_phi_node
):
Move
...
gcc/graphite-poly.c
View file @
87ccab5d
...
@@ -257,11 +257,72 @@ debug_pdr (poly_dr_p pdr, int verbosity)
...
@@ -257,11 +257,72 @@ debug_pdr (poly_dr_p pdr, int verbosity)
print_pdr
(
stderr
,
pdr
,
verbosity
);
print_pdr
(
stderr
,
pdr
,
verbosity
);
}
}
/* Creates a new SCOP containing REGION. */
/* Store the GRAPHITE representation of BB. */
gimple_poly_bb_p
new_gimple_poly_bb
(
basic_block
bb
,
vec
<
data_reference_p
>
drs
)
{
gimple_poly_bb_p
gbb
;
gbb
=
XNEW
(
struct
gimple_poly_bb
);
bb
->
aux
=
gbb
;
GBB_BB
(
gbb
)
=
bb
;
GBB_DATA_REFS
(
gbb
)
=
drs
;
GBB_CONDITIONS
(
gbb
).
create
(
0
);
GBB_CONDITION_CASES
(
gbb
).
create
(
0
);
return
gbb
;
}
static
void
free_data_refs_aux
(
vec
<
data_reference_p
>
datarefs
)
{
unsigned
int
i
;
data_reference_p
dr
;
FOR_EACH_VEC_ELT
(
datarefs
,
i
,
dr
)
if
(
dr
->
aux
)
{
base_alias_pair_p
bap
=
(
base_alias_pair_p
)(
dr
->
aux
);
free
(
bap
->
alias_set
);
free
(
bap
);
dr
->
aux
=
NULL
;
}
}
/* Frees GBB. */
void
free_gimple_poly_bb
(
gimple_poly_bb_p
gbb
)
{
free_data_refs_aux
(
GBB_DATA_REFS
(
gbb
));
free_data_refs
(
GBB_DATA_REFS
(
gbb
));
GBB_CONDITIONS
(
gbb
).
release
();
GBB_CONDITION_CASES
(
gbb
).
release
();
GBB_BB
(
gbb
)
->
aux
=
0
;
XDELETE
(
gbb
);
}
/* Deletes all gimple bbs in SCOP. */
static
void
remove_gbbs_in_scop
(
scop_p
scop
)
{
int
i
;
poly_bb_p
pbb
;
FOR_EACH_VEC_ELT
(
SCOP_BBS
(
scop
),
i
,
pbb
)
free_gimple_poly_bb
(
PBB_BLACK_BOX
(
pbb
));
}
/* Creates a new SCOP containing the region (ENTRY, EXIT). */
scop_p
scop_p
new_scop
(
sese
region
)
new_scop
(
edge
entry
,
edge
exit
)
{
{
sese
region
=
new_sese
(
entry
,
exit
);
scop_p
scop
=
XNEW
(
struct
scop
);
scop_p
scop
=
XNEW
(
struct
scop
);
scop
->
context
=
NULL
;
scop
->
context
=
NULL
;
...
@@ -292,6 +353,9 @@ free_scop (scop_p scop)
...
@@ -292,6 +353,9 @@ free_scop (scop_p scop)
int
i
;
int
i
;
poly_bb_p
pbb
;
poly_bb_p
pbb
;
remove_gbbs_in_scop
(
scop
);
free_sese
(
SCOP_REGION
(
scop
));
FOR_EACH_VEC_ELT
(
SCOP_BBS
(
scop
),
i
,
pbb
)
FOR_EACH_VEC_ELT
(
SCOP_BBS
(
scop
),
i
,
pbb
)
free_poly_bb
(
pbb
);
free_poly_bb
(
pbb
);
...
...
gcc/graphite-poly.h
View file @
87ccab5d
...
@@ -422,9 +422,16 @@ struct scop
...
@@ -422,9 +422,16 @@ struct scop
#define SCOP_CONTEXT(S) (NULL)
#define SCOP_CONTEXT(S) (NULL)
#define POLY_SCOP_P(S) (S->poly_scop_p)
#define POLY_SCOP_P(S) (S->poly_scop_p)
extern
scop_p
new_scop
(
sese
);
typedef
struct
base_alias_pair
{
int
base_obj_set
;
int
*
alias_set
;
}
*
base_alias_pair_p
;
extern
scop_p
new_scop
(
edge
,
edge
);
extern
void
free_scop
(
scop_p
);
extern
void
free_scop
(
scop_p
);
extern
void
free_scops
(
vec
<
scop_p
>
);
extern
gimple_poly_bb_p
new_gimple_poly_bb
(
basic_block
,
vec
<
data_reference_p
>
);
extern
void
free_gimple_poly_bb
(
gimple_poly_bb_p
);
extern
void
print_generated_program
(
FILE
*
,
scop_p
);
extern
void
print_generated_program
(
FILE
*
,
scop_p
);
extern
void
debug_generated_program
(
scop_p
);
extern
void
debug_generated_program
(
scop_p
);
extern
int
unify_scattering_dimensions
(
scop_p
);
extern
int
unify_scattering_dimensions
(
scop_p
);
...
...
gcc/graphite-scop-detection.c
View file @
87ccab5d
...
@@ -149,23 +149,6 @@ same_close_phi_node (gphi *p1, gphi *p2)
...
@@ -149,23 +149,6 @@ same_close_phi_node (gphi *p1, gphi *p2)
gimple_phi_arg_def
(
p2
,
0
),
0
);
gimple_phi_arg_def
(
p2
,
0
),
0
);
}
}
/* Store the GRAPHITE representation of BB. */
static
gimple_poly_bb_p
new_gimple_poly_bb
(
basic_block
bb
,
vec
<
data_reference_p
>
drs
)
{
gimple_poly_bb_p
gbb
;
gbb
=
XNEW
(
struct
gimple_poly_bb
);
bb
->
aux
=
gbb
;
GBB_BB
(
gbb
)
=
bb
;
GBB_DATA_REFS
(
gbb
)
=
drs
;
GBB_CONDITIONS
(
gbb
).
create
(
0
);
GBB_CONDITION_CASES
(
gbb
).
create
(
0
);
return
gbb
;
}
/* Compare the depth of two basic_block's P1 and P2. */
/* Compare the depth of two basic_block's P1 and P2. */
static
int
static
int
...
@@ -1690,6 +1673,171 @@ scop_detection::nb_pbbs_in_loops (scop_p scop)
...
@@ -1690,6 +1673,171 @@ scop_detection::nb_pbbs_in_loops (scop_p scop)
return
res
;
return
res
;
}
}
/* When parameter NAME is in REGION, returns its index in SESE_PARAMS.
Otherwise returns -1. */
static
inline
int
parameter_index_in_region_1
(
tree
name
,
sese
region
)
{
int
i
;
tree
p
;
gcc_assert
(
TREE_CODE
(
name
)
==
SSA_NAME
);
FOR_EACH_VEC_ELT
(
SESE_PARAMS
(
region
),
i
,
p
)
if
(
p
==
name
)
return
i
;
return
-
1
;
}
/* When the parameter NAME is in REGION, returns its index in
SESE_PARAMS. Otherwise this function inserts NAME in SESE_PARAMS
and returns the index of NAME. */
static
int
parameter_index_in_region
(
tree
name
,
sese
region
)
{
int
i
;
gcc_assert
(
TREE_CODE
(
name
)
==
SSA_NAME
);
/* Cannot constrain on anything else than INTEGER_TYPE parameters. */
if
(
TREE_CODE
(
TREE_TYPE
(
name
))
!=
INTEGER_TYPE
)
return
-
1
;
if
(
!
invariant_in_sese_p_rec
(
name
,
region
))
return
-
1
;
i
=
parameter_index_in_region_1
(
name
,
region
);
if
(
i
!=
-
1
)
return
i
;
gcc_assert
(
SESE_ADD_PARAMS
(
region
));
i
=
SESE_PARAMS
(
region
).
length
();
SESE_PARAMS
(
region
).
safe_push
(
name
);
return
i
;
}
/* In the context of sese S, scan the expression E and translate it to
a linear expression C. When parsing a symbolic multiplication, K
represents the constant multiplier of an expression containing
parameters. */
static
void
scan_tree_for_params
(
sese
s
,
tree
e
)
{
if
(
e
==
chrec_dont_know
)
return
;
switch
(
TREE_CODE
(
e
))
{
case
POLYNOMIAL_CHREC
:
scan_tree_for_params
(
s
,
CHREC_LEFT
(
e
));
break
;
case
MULT_EXPR
:
if
(
chrec_contains_symbols
(
TREE_OPERAND
(
e
,
0
)))
scan_tree_for_params
(
s
,
TREE_OPERAND
(
e
,
0
));
else
scan_tree_for_params
(
s
,
TREE_OPERAND
(
e
,
1
));
break
;
case
PLUS_EXPR
:
case
POINTER_PLUS_EXPR
:
case
MINUS_EXPR
:
scan_tree_for_params
(
s
,
TREE_OPERAND
(
e
,
0
));
scan_tree_for_params
(
s
,
TREE_OPERAND
(
e
,
1
));
break
;
case
NEGATE_EXPR
:
case
BIT_NOT_EXPR
:
CASE_CONVERT
:
case
NON_LVALUE_EXPR
:
scan_tree_for_params
(
s
,
TREE_OPERAND
(
e
,
0
));
break
;
case
SSA_NAME
:
parameter_index_in_region
(
e
,
s
);
break
;
case
INTEGER_CST
:
case
ADDR_EXPR
:
case
REAL_CST
:
case
COMPLEX_CST
:
case
VECTOR_CST
:
break
;
default
:
gcc_unreachable
();
break
;
}
}
/* Find parameters with respect to REGION in BB. We are looking in memory
access functions, conditions and loop bounds. */
static
void
find_params_in_bb
(
sese
region
,
gimple_poly_bb_p
gbb
)
{
int
i
;
unsigned
j
;
data_reference_p
dr
;
gimple
*
stmt
;
loop_p
loop
=
GBB_BB
(
gbb
)
->
loop_father
;
/* Find parameters in the access functions of data references. */
FOR_EACH_VEC_ELT
(
GBB_DATA_REFS
(
gbb
),
i
,
dr
)
for
(
j
=
0
;
j
<
DR_NUM_DIMENSIONS
(
dr
);
j
++
)
scan_tree_for_params
(
region
,
DR_ACCESS_FN
(
dr
,
j
));
/* Find parameters in conditional statements. */
FOR_EACH_VEC_ELT
(
GBB_CONDITIONS
(
gbb
),
i
,
stmt
)
{
tree
lhs
=
scalar_evolution_in_region
(
region
,
loop
,
gimple_cond_lhs
(
stmt
));
tree
rhs
=
scalar_evolution_in_region
(
region
,
loop
,
gimple_cond_rhs
(
stmt
));
scan_tree_for_params
(
region
,
lhs
);
scan_tree_for_params
(
region
,
rhs
);
}
}
/* Record the parameters used in the SCOP. A variable is a parameter
in a scop if it does not vary during the execution of that scop. */
static
void
find_scop_parameters
(
scop_p
scop
)
{
poly_bb_p
pbb
;
unsigned
i
;
sese
region
=
SCOP_REGION
(
scop
);
struct
loop
*
loop
;
int
nbp
;
/* Find the parameters used in the loop bounds. */
FOR_EACH_VEC_ELT
(
SESE_LOOP_NEST
(
region
),
i
,
loop
)
{
tree
nb_iters
=
number_of_latch_executions
(
loop
);
if
(
!
chrec_contains_symbols
(
nb_iters
))
continue
;
nb_iters
=
scalar_evolution_in_region
(
region
,
loop
,
nb_iters
);
scan_tree_for_params
(
region
,
nb_iters
);
}
/* Find the parameters used in data accesses. */
FOR_EACH_VEC_ELT
(
SCOP_BBS
(
scop
),
i
,
pbb
)
find_params_in_bb
(
region
,
PBB_BLACK_BOX
(
pbb
));
nbp
=
sese_nb_params
(
region
);
scop_set_nb_params
(
scop
,
nbp
);
SESE_ADD_PARAMS
(
region
)
=
false
;
}
class
sese_dom_walker
:
public
dom_walker
class
sese_dom_walker
:
public
dom_walker
{
{
public
:
public
:
...
@@ -1779,14 +1927,33 @@ build_scops (vec<scop_p> *scops)
...
@@ -1779,14 +1927,33 @@ build_scops (vec<scop_p> *scops)
sese_l
s
(
0
);
sese_l
s
(
0
);
FOR_EACH_VEC_ELT
(
scops_l
,
i
,
s
)
FOR_EACH_VEC_ELT
(
scops_l
,
i
,
s
)
{
{
sese
sese_reg
=
new_sese
(
s
.
entry
,
s
.
exit
);
scop_p
scop
=
new_scop
(
s
.
entry
,
s
.
exit
);
scop_p
scop
=
new_scop
(
sese_reg
);
sb
.
build_scop_bbs
(
scop
);
/* Do not optimize a scop containing only PBBs that do not belong
/* Do not optimize a scop containing only PBBs that do not belong
to any loops. */
to any loops. */
if
(
sb
.
nb_pbbs_in_loops
(
scop
)
==
0
)
if
(
sb
.
nb_pbbs_in_loops
(
scop
)
==
0
)
{
{
free_sese
(
sese_reg
);
DEBUG_PRINT
(
dp
<<
"[scop-detection-fail] no data references.
\n
"
);
free_scop
(
scop
);
continue
;
}
build_sese_loop_nests
(
scop
->
region
);
/* Record all conditions in REGION. */
sese_dom_walker
(
CDI_DOMINATORS
,
scop
->
region
).
walk
(
cfun
->
cfg
->
x_entry_block_ptr
);
find_scop_parameters
(
scop
);
graphite_dim_t
max_dim
=
PARAM_VALUE
(
PARAM_GRAPHITE_MAX_NB_SCOP_PARAMS
);
if
(
scop_nb_params
(
scop
)
>
max_dim
)
{
DEBUG_PRINT
(
dp
<<
"[scop-detection-fail] too many parameters: "
<<
scop_nb_params
(
scop
)
<<
" larger than --param graphite-max-nb-scop-params="
<<
max_dim
<<
".
\n
"
);
free_scop
(
scop
);
free_scop
(
scop
);
continue
;
continue
;
}
}
...
@@ -1794,16 +1961,6 @@ build_scops (vec<scop_p> *scops)
...
@@ -1794,16 +1961,6 @@ build_scops (vec<scop_p> *scops)
scops
->
safe_push
(
scop
);
scops
->
safe_push
(
scop
);
}
}
scop_p
scop
;
FOR_EACH_VEC_ELT
(
*
scops
,
i
,
scop
)
{
sb
.
build_scop_bbs
(
scop
);
sese
region
=
SCOP_REGION
(
scop
);
build_sese_loop_nests
(
region
);
/* Record all conditions in REGION. */
sese_dom_walker
(
CDI_DOMINATORS
,
region
).
walk
(
cfun
->
cfg
->
x_entry_block_ptr
);
}
DEBUG_PRINT
(
dp
<<
"number of SCoPs: "
<<
(
scops
?
scops
->
length
()
:
0
););
DEBUG_PRINT
(
dp
<<
"number of SCoPs: "
<<
(
scops
?
scops
->
length
()
:
0
););
}
}
...
...
gcc/graphite-sese-to-poly.c
View file @
87ccab5d
...
@@ -196,84 +196,6 @@ reduction_phi_p (sese region, gphi_iterator *psi)
...
@@ -196,84 +196,6 @@ reduction_phi_p (sese region, gphi_iterator *psi)
return
true
;
return
true
;
}
}
/* Store the GRAPHITE representation of BB. */
static
gimple_poly_bb_p
new_gimple_poly_bb
(
basic_block
bb
,
vec
<
data_reference_p
>
drs
)
{
gimple_poly_bb_p
gbb
;
gbb
=
XNEW
(
struct
gimple_poly_bb
);
bb
->
aux
=
gbb
;
GBB_BB
(
gbb
)
=
bb
;
GBB_DATA_REFS
(
gbb
)
=
drs
;
GBB_CONDITIONS
(
gbb
).
create
(
0
);
GBB_CONDITION_CASES
(
gbb
).
create
(
0
);
return
gbb
;
}
static
void
free_data_refs_aux
(
vec
<
data_reference_p
>
datarefs
)
{
unsigned
int
i
;
data_reference_p
dr
;
FOR_EACH_VEC_ELT
(
datarefs
,
i
,
dr
)
if
(
dr
->
aux
)
{
base_alias_pair_p
bap
=
(
base_alias_pair_p
)(
dr
->
aux
);
free
(
bap
->
alias_set
);
free
(
bap
);
dr
->
aux
=
NULL
;
}
}
/* Frees GBB. */
static
void
free_gimple_poly_bb
(
gimple_poly_bb_p
gbb
)
{
free_data_refs_aux
(
GBB_DATA_REFS
(
gbb
));
free_data_refs
(
GBB_DATA_REFS
(
gbb
));
GBB_CONDITIONS
(
gbb
).
release
();
GBB_CONDITION_CASES
(
gbb
).
release
();
GBB_BB
(
gbb
)
->
aux
=
0
;
XDELETE
(
gbb
);
}
/* Deletes all gimple bbs in SCOP. */
static
void
remove_gbbs_in_scop
(
scop_p
scop
)
{
int
i
;
poly_bb_p
pbb
;
FOR_EACH_VEC_ELT
(
SCOP_BBS
(
scop
),
i
,
pbb
)
free_gimple_poly_bb
(
PBB_BLACK_BOX
(
pbb
));
}
/* Deletes all scops in SCOPS. */
void
free_scops
(
vec
<
scop_p
>
scops
)
{
int
i
;
scop_p
scop
;
FOR_EACH_VEC_ELT
(
scops
,
i
,
scop
)
{
remove_gbbs_in_scop
(
scop
);
free_sese
(
SCOP_REGION
(
scop
));
free_scop
(
scop
);
}
scops
.
release
();
}
/* Return an ISL identifier for the polyhedral basic block PBB. */
/* Return an ISL identifier for the polyhedral basic block PBB. */
static
isl_id
*
static
isl_id
*
...
@@ -587,35 +509,6 @@ parameter_index_in_region_1 (tree name, sese region)
...
@@ -587,35 +509,6 @@ parameter_index_in_region_1 (tree name, sese region)
return
-
1
;
return
-
1
;
}
}
/* When the parameter NAME is in REGION, returns its index in
SESE_PARAMS. Otherwise this function inserts NAME in SESE_PARAMS
and returns the index of NAME. */
static
int
parameter_index_in_region
(
tree
name
,
sese
region
)
{
int
i
;
gcc_assert
(
TREE_CODE
(
name
)
==
SSA_NAME
);
/* Cannot constrain on anything else than INTEGER_TYPE parameters. */
if
(
TREE_CODE
(
TREE_TYPE
(
name
))
!=
INTEGER_TYPE
)
return
-
1
;
if
(
!
invariant_in_sese_p_rec
(
name
,
region
))
return
-
1
;
i
=
parameter_index_in_region_1
(
name
,
region
);
if
(
i
!=
-
1
)
return
i
;
gcc_assert
(
SESE_ADD_PARAMS
(
region
));
i
=
SESE_PARAMS
(
region
).
length
();
SESE_PARAMS
(
region
).
safe_push
(
name
);
return
i
;
}
/* Extract an affine expression from the tree E in the scop S. */
/* Extract an affine expression from the tree E in the scop S. */
static
isl_pw_aff
*
static
isl_pw_aff
*
...
@@ -687,124 +580,6 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space)
...
@@ -687,124 +580,6 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space)
return
res
;
return
res
;
}
}
/* In the context of sese S, scan the expression E and translate it to
a linear expression C. When parsing a symbolic multiplication, K
represents the constant multiplier of an expression containing
parameters. */
static
void
scan_tree_for_params
(
sese
s
,
tree
e
)
{
if
(
e
==
chrec_dont_know
)
return
;
switch
(
TREE_CODE
(
e
))
{
case
POLYNOMIAL_CHREC
:
scan_tree_for_params
(
s
,
CHREC_LEFT
(
e
));
break
;
case
MULT_EXPR
:
if
(
chrec_contains_symbols
(
TREE_OPERAND
(
e
,
0
)))
scan_tree_for_params
(
s
,
TREE_OPERAND
(
e
,
0
));
else
scan_tree_for_params
(
s
,
TREE_OPERAND
(
e
,
1
));
break
;
case
PLUS_EXPR
:
case
POINTER_PLUS_EXPR
:
case
MINUS_EXPR
:
scan_tree_for_params
(
s
,
TREE_OPERAND
(
e
,
0
));
scan_tree_for_params
(
s
,
TREE_OPERAND
(
e
,
1
));
break
;
case
NEGATE_EXPR
:
case
BIT_NOT_EXPR
:
CASE_CONVERT:
case
NON_LVALUE_EXPR
:
scan_tree_for_params
(
s
,
TREE_OPERAND
(
e
,
0
));
break
;
case
SSA_NAME
:
parameter_index_in_region
(
e
,
s
);
break
;
case
INTEGER_CST
:
case
ADDR_EXPR
:
case
REAL_CST
:
case
COMPLEX_CST
:
case
VECTOR_CST
:
break
;
default:
gcc_unreachable
();
break
;
}
}
/* Find parameters with respect to REGION in BB. We are looking in memory
access functions, conditions and loop bounds. */
static
void
find_params_in_bb
(
sese
region
,
gimple_poly_bb_p
gbb
)
{
int
i
;
unsigned
j
;
data_reference_p
dr
;
gimple
*
stmt
;
loop_p
loop
=
GBB_BB
(
gbb
)
->
loop_father
;
/* Find parameters in the access functions of data references. */
FOR_EACH_VEC_ELT
(
GBB_DATA_REFS
(
gbb
),
i
,
dr
)
for
(
j
=
0
;
j
<
DR_NUM_DIMENSIONS
(
dr
);
j
++
)
scan_tree_for_params
(
region
,
DR_ACCESS_FN
(
dr
,
j
));
/* Find parameters in conditional statements. */
FOR_EACH_VEC_ELT
(
GBB_CONDITIONS
(
gbb
),
i
,
stmt
)
{
tree
lhs
=
scalar_evolution_in_region
(
region
,
loop
,
gimple_cond_lhs
(
stmt
));
tree
rhs
=
scalar_evolution_in_region
(
region
,
loop
,
gimple_cond_rhs
(
stmt
));
scan_tree_for_params
(
region
,
lhs
);
scan_tree_for_params
(
region
,
rhs
);
}
}
/* Record the parameters used in the SCOP. A variable is a parameter
in a scop if it does not vary during the execution of that scop. */
static
void
find_scop_parameters
(
scop_p
scop
)
{
poly_bb_p
pbb
;
unsigned
i
;
sese
region
=
SCOP_REGION
(
scop
);
struct
loop
*
loop
;
int
nbp
;
/* Find the parameters used in the loop bounds. */
FOR_EACH_VEC_ELT
(
SESE_LOOP_NEST
(
region
),
i
,
loop
)
{
tree
nb_iters
=
number_of_latch_executions
(
loop
);
if
(
!
chrec_contains_symbols
(
nb_iters
))
continue
;
nb_iters
=
scalar_evolution_in_region
(
region
,
loop
,
nb_iters
);
scan_tree_for_params
(
region
,
nb_iters
);
}
/* Find the parameters used in data accesses. */
FOR_EACH_VEC_ELT
(
SCOP_BBS
(
scop
),
i
,
pbb
)
find_params_in_bb
(
region
,
PBB_BLACK_BOX
(
pbb
));
nbp
=
sese_nb_params
(
region
);
scop_set_nb_params
(
scop
,
nbp
);
SESE_ADD_PARAMS
(
region
)
=
false
;
}
/* Assign dimension for each parameter in SCOP. */
/* Assign dimension for each parameter in SCOP. */
static
void
static
void
...
@@ -1057,100 +832,6 @@ add_conditions_to_constraints (scop_p scop)
...
@@ -1057,100 +832,6 @@ add_conditions_to_constraints (scop_p scop)
add_conditions_to_domain
(
pbb
);
add_conditions_to_domain
(
pbb
);
}
}
/* Returns a COND_EXPR statement when BB has a single predecessor, the
edge between BB and its predecessor is not a loop exit edge, and
the last statement of the single predecessor is a COND_EXPR. */
static
gcond
*
single_pred_cond_non_loop_exit
(
basic_block
bb
)
{
if
(
single_pred_p
(
bb
))
{
edge
e
=
single_pred_edge
(
bb
);
basic_block
pred
=
e
->
src
;
gimple
*
stmt
;
if
(
loop_depth
(
pred
->
loop_father
)
>
loop_depth
(
bb
->
loop_father
))
return
NULL
;
stmt
=
last_stmt
(
pred
);
if
(
stmt
&&
gimple_code
(
stmt
)
==
GIMPLE_COND
)
return
as_a
<
gcond
*>
(
stmt
);
}
return
NULL
;
}
class
sese_dom_walker
:
public
dom_walker
{
public
:
sese_dom_walker
(
cdi_direction
,
sese
);
virtual
void
before_dom_children
(
basic_block
);
virtual
void
after_dom_children
(
basic_block
);
private
:
auto_vec
<
gimple
*
,
3
>
m_conditions
,
m_cases
;
sese
m_region
;
};
sese_dom_walker
::
sese_dom_walker
(
cdi_direction
direction
,
sese
region
)
:
dom_walker
(
direction
),
m_region
(
region
)
{
}
/* Call-back for dom_walk executed before visiting the dominated
blocks. */
void
sese_dom_walker
::
before_dom_children
(
basic_block
bb
)
{
gimple_poly_bb_p
gbb
;
gcond
*
stmt
;
if
(
!
bb_in_sese_p
(
bb
,
m_region
))
return
;
stmt
=
single_pred_cond_non_loop_exit
(
bb
);
if
(
stmt
)
{
edge
e
=
single_pred_edge
(
bb
);
m_conditions
.
safe_push
(
stmt
);
if
(
e
->
flags
&
EDGE_TRUE_VALUE
)
m_cases
.
safe_push
(
stmt
);
else
m_cases
.
safe_push
(
NULL
);
}
gbb
=
gbb_from_bb
(
bb
);
if
(
gbb
)
{
GBB_CONDITIONS
(
gbb
)
=
m_conditions
.
copy
();
GBB_CONDITION_CASES
(
gbb
)
=
m_cases
.
copy
();
}
}
/* Call-back for dom_walk executed after visiting the dominated
blocks. */
void
sese_dom_walker
::
after_dom_children
(
basic_block
bb
)
{
if
(
!
bb_in_sese_p
(
bb
,
m_region
))
return
;
if
(
single_pred_cond_non_loop_exit
(
bb
))
{
m_conditions
.
pop
();
m_cases
.
pop
();
}
}
/* Add constraints on the possible values of parameter P from the type
/* Add constraints on the possible values of parameter P from the type
of P. */
of P. */
...
@@ -2338,11 +2019,6 @@ rewrite_cross_bb_scalar_deps_out_of_ssa (scop_p scop)
...
@@ -2338,11 +2019,6 @@ rewrite_cross_bb_scalar_deps_out_of_ssa (scop_p scop)
void
void
build_poly_scop
(
scop_p
scop
)
build_poly_scop
(
scop_p
scop
)
{
{
find_scop_parameters
(
scop
);
graphite_dim_t
max_dim
=
PARAM_VALUE
(
PARAM_GRAPHITE_MAX_NB_SCOP_PARAMS
);
if
(
scop_nb_params
(
scop
)
>
max_dim
)
return
;
set_scop_parameter_dim
(
scop
);
set_scop_parameter_dim
(
scop
);
build_scop_iteration_domain
(
scop
);
build_scop_iteration_domain
(
scop
);
build_scop_context
(
scop
);
build_scop_context
(
scop
);
...
...
gcc/graphite-sese-to-poly.h
View file @
87ccab5d
...
@@ -21,12 +21,6 @@ along with GCC; see the file COPYING3. If not see
...
@@ -21,12 +21,6 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_GRAPHITE_SESE_TO_POLY_H
#ifndef GCC_GRAPHITE_SESE_TO_POLY_H
#define GCC_GRAPHITE_SESE_TO_POLY_H
#define GCC_GRAPHITE_SESE_TO_POLY_H
typedef
struct
base_alias_pair
{
int
base_obj_set
;
int
*
alias_set
;
}
*
base_alias_pair_p
;
void
build_poly_scop
(
scop_p
);
void
build_poly_scop
(
scop_p
);
#endif
#endif
gcc/graphite.c
View file @
87ccab5d
...
@@ -278,6 +278,20 @@ graphite_finalize (bool need_cfg_cleanup_p)
...
@@ -278,6 +278,20 @@ graphite_finalize (bool need_cfg_cleanup_p)
print_loops
(
dump_file
,
3
);
print_loops
(
dump_file
,
3
);
}
}
/* Deletes all scops in SCOPS. */
static
void
free_scops
(
vec
<
scop_p
>
scops
)
{
int
i
;
scop_p
scop
;
FOR_EACH_VEC_ELT
(
scops
,
i
,
scop
)
free_scop
(
scop
);
scops
.
release
();
}
isl_ctx
*
the_isl_ctx
;
isl_ctx
*
the_isl_ctx
;
/* Perform a set of linear transforms on the loops of the current
/* Perform a set of linear transforms on the loops of the current
...
...
gcc/testsuite/ChangeLog
View file @
87ccab5d
2015-10-05 Aditya Kumar <aditya.k7@samsung.com>
Sebastian Pop <s.pop@samsung.com>
* gcc.dg/graphite/scop-sor.c: Xfail.
2015-10-05 Martin Jambor <mjambor@suse.cz>
2015-10-05 Martin Jambor <mjambor@suse.cz>
Jan Hubicka <hubicka@ucw.cz>
Jan Hubicka <hubicka@ucw.cz>
...
...
gcc/testsuite/gcc.dg/graphite/scop-sor.c
View file @
87ccab5d
...
@@ -14,4 +14,5 @@ void sor(int N1, int N2){
...
@@ -14,4 +14,5 @@ void sor(int N1, int N2){
#pragma endscop
#pragma endscop
}
}
/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite" } } */
/* This requires more than 3 parameters. */
/* { dg-final { scan-tree-dump-times "number of SCoPs: 0" 1 "graphite" } } */
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