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
3aa439ed
Commit
3aa439ed
authored
Jul 05, 2011
by
Michael Meissner
Committed by
Michael Meissner
Jul 05, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add --param case-values-threshold
From-SVN: r175878
parent
fb237f9c
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
110 additions
and
2 deletions
+110
-2
gcc/ChangeLog
+14
-0
gcc/Makefile.in
+1
-1
gcc/doc/invoke.texi
+5
-0
gcc/params.def
+10
-0
gcc/stmt.c
+16
-1
gcc/testsuite/ChangeLog
+6
-0
gcc/testsuite/gcc.target/powerpc/ppc-switch-1.c
+26
-0
gcc/testsuite/gcc.target/powerpc/ppc-switch-2.c
+32
-0
No files found.
gcc/ChangeLog
View file @
3aa439ed
2011-07-05 Michael Meissner <meissner@linux.vnet.ibm.com>
* params.def (PARAM_CASE_VALUES_THRESHOLD): New parameter to
override CASE_VALUES_THRESHOLD.
* stmt.c (toplevel): Include params.h.
(case_values_threshold): Use the --param case-values-threshold
value if non-zero, otherwise use machine dependent value.
(expand_case): Use case_values_threshold.
* Makefile.in (stmt.o): Add $(PARAMS_H) dependency.
* doc/invoke.texi (--param case-values-threshold): Document.
2011-07-05 Richard Henderson <rth@redhat.com>
2011-07-05 Richard Henderson <rth@redhat.com>
* dwarf2out.c (dwarf2out_cfi_label): Make static.
* dwarf2out.c (dwarf2out_cfi_label): Make static.
...
...
gcc/Makefile.in
View file @
3aa439ed
...
@@ -2946,7 +2946,7 @@ stmt.o : stmt.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
...
@@ -2946,7 +2946,7 @@ stmt.o : stmt.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(LIBFUNCS_H) $(EXCEPT_H) $(RECOG_H) $(DIAGNOSTIC_CORE_H)
\
$(LIBFUNCS_H) $(EXCEPT_H) $(RECOG_H) $(DIAGNOSTIC_CORE_H)
\
output.h $(GGC_H) $(TM_P_H) langhooks.h $(PREDICT_H) $(OPTABS_H)
\
output.h $(GGC_H) $(TM_P_H) langhooks.h $(PREDICT_H) $(OPTABS_H)
\
$(TARGET_H) $(GIMPLE_H) $(MACHMODE_H) $(REGS_H) alloc-pool.h
\
$(TARGET_H) $(GIMPLE_H) $(MACHMODE_H) $(REGS_H) alloc-pool.h
\
$(PRETTY_PRINT_H) $(BITMAP_H)
$(PRETTY_PRINT_H) $(BITMAP_H)
$(PARAMS_H)
except.o
:
except.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H)
\
except.o
:
except.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H)
\
$(TREE_H) $(FLAGS_H) $(EXCEPT_H) $(FUNCTION_H) $(EXPR_H) $(LIBFUNCS_H)
\
$(TREE_H) $(FLAGS_H) $(EXCEPT_H) $(FUNCTION_H) $(EXPR_H) $(LIBFUNCS_H)
\
langhooks.h insn-config.h hard-reg-set.h $(BASIC_BLOCK_H) output.h
\
langhooks.h insn-config.h hard-reg-set.h $(BASIC_BLOCK_H) output.h
\
...
...
gcc/doc/invoke.texi
View file @
3aa439ed
...
@@ -9026,6 +9026,11 @@ The maximum number of conditional stores paires that can be sunk. Set to 0
...
@@ -9026,6 +9026,11 @@ The maximum number of conditional stores paires that can be sunk. Set to 0
if
either
vectorization
(@
option
{-
ftree
-
vectorize
})
or
if
-
conversion
if
either
vectorization
(@
option
{-
ftree
-
vectorize
})
or
if
-
conversion
(@
option
{-
ftree
-
loop
-
if
-
convert
})
is
disabled
.
The
default
is
2.
(@
option
{-
ftree
-
loop
-
if
-
convert
})
is
disabled
.
The
default
is
2.
@
item
case
-
values
-
threshold
The
smallest
number
of
different
values
for
which
it
is
best
to
use
a
jump
-
table
instead
of
a
tree
of
conditional
branches
.
If
the
value
is
0
,
use
the
default
for
the
machine
.
The
default
is
0.
@
end
table
@
end
table
@
end
table
@
end
table
...
...
gcc/params.def
View file @
3aa439ed
...
@@ -892,6 +892,16 @@ DEFPARAM (PARAM_MAX_STORES_TO_SINK,
...
@@ -892,6 +892,16 @@ DEFPARAM (PARAM_MAX_STORES_TO_SINK,
"Maximum number of conditional store pairs that can be sunk",
"Maximum number of conditional store pairs that can be sunk",
2, 0, 0)
2, 0, 0)
/* Override CASE_VALUES_THRESHOLD of when to switch from doing switch
statements via if statements to using a table jump operation. If the value
is 0, the default CASE_VALUES_THRESHOLD will be used. */
DEFPARAM (PARAM_CASE_VALUES_THRESHOLD,
"case-values-threshold",
"The smallest number of different values for which it is best to "
"use a jump-table instead of a tree of conditional branches, "
"if 0, use the default for the machine",
0, 0, 0)
/*
/*
Local variables:
Local variables:
...
...
gcc/stmt.c
View file @
3aa439ed
...
@@ -53,6 +53,7 @@ along with GCC; see the file COPYING3. If not see
...
@@ -53,6 +53,7 @@ along with GCC; see the file COPYING3. If not see
#include "alloc-pool.h"
#include "alloc-pool.h"
#include "pretty-print.h"
#include "pretty-print.h"
#include "bitmap.h"
#include "bitmap.h"
#include "params.h"
/* Functions and data structures for expanding case statements. */
/* Functions and data structures for expanding case statements. */
...
@@ -2270,6 +2271,20 @@ expand_switch_using_bit_tests_p (tree index_expr, tree range,
...
@@ -2270,6 +2271,20 @@ expand_switch_using_bit_tests_p (tree index_expr, tree range,
||
(
uniq
==
3
&&
count
>=
6
)));
||
(
uniq
==
3
&&
count
>=
6
)));
}
}
/* Return the smallest number of different values for which it is best to use a
jump-table instead of a tree of conditional branches. */
static
unsigned
int
case_values_threshold
(
void
)
{
unsigned
int
threshold
=
PARAM_VALUE
(
PARAM_CASE_VALUES_THRESHOLD
);
if
(
threshold
==
0
)
threshold
=
targetm
.
case_values_threshold
();
return
threshold
;
}
/* Terminate a case (Pascal/Ada) or switch (C) statement
/* Terminate a case (Pascal/Ada) or switch (C) statement
in which ORIG_INDEX is the expression to be tested.
in which ORIG_INDEX is the expression to be tested.
If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
If ORIG_TYPE is not NULL, it is the original ORIG_INDEX
...
@@ -2424,7 +2439,7 @@ expand_case (gimple stmt)
...
@@ -2424,7 +2439,7 @@ expand_case (gimple stmt)
If the switch-index is a constant, do it this way
If the switch-index is a constant, do it this way
because we can optimize it. */
because we can optimize it. */
else
if
(
count
<
targetm
.
case_values_threshold
()
else
if
(
count
<
case_values_threshold
()
||
compare_tree_int
(
range
,
||
compare_tree_int
(
range
,
(
optimize_insn_for_size_p
()
?
3
:
10
)
*
count
)
>
0
(
optimize_insn_for_size_p
()
?
3
:
10
)
*
count
)
>
0
/* RANGE may be signed, and really large ranges will show up
/* RANGE may be signed, and really large ranges will show up
...
...
gcc/testsuite/ChangeLog
View file @
3aa439ed
2011-07-05 Michael Meissner <meissner@linux.vnet.ibm.com>
* gcc.target/powerpc/ppc-switch-1.c: New test for
--param case-values-threshold.
* gcc.target/powerpc/ppc-switch-2.c: Ditto.
2011-07-05 Janis Johnson <janisjo@codesourcery.com>
2011-07-05 Janis Johnson <janisjo@codesourcery.com>
* gcc.target/arm/pr42093.c: Use "-fno-reorder-blocks".
* gcc.target/arm/pr42093.c: Use "-fno-reorder-blocks".
...
...
gcc/testsuite/gcc.target/powerpc/ppc-switch-1.c
0 → 100644
View file @
3aa439ed
/* { dg-do compile { target { powerpc*-*-* } } } */
/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
/* { dg-options "-O2 --param case-values-threshold=2" } */
/* { dg-final { scan-assembler "mtctr" } } */
/* { dg-final { scan-assembler "bctr" } } */
/* Force using a dispatch table even though by default we would generate
ifs. */
extern
long
call
(
long
);
long
test_switch
(
long
a
,
long
b
)
{
long
c
;
switch
(
a
)
{
case
0
:
c
=
-
b
;
break
;
case
1
:
c
=
~
b
;
break
;
case
2
:
c
=
b
+
1
;
break
;
default:
c
=
b
&
9
;
break
;
}
return
call
(
c
)
+
1
;
}
gcc/testsuite/gcc.target/powerpc/ppc-switch-2.c
0 → 100644
View file @
3aa439ed
/* { dg-do compile { target { powerpc*-*-* } } } */
/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
/* { dg-options "-O2 --param case-values-threshold=20" } */
/* { dg-final { scan-assembler-not "mtctr" } } */
/* { dg-final { scan-assembler-not "bctr" } } */
/* Force using if tests, instead of a dispatch table. */
extern
long
call
(
long
);
long
test_switch
(
long
a
,
long
b
)
{
long
c
;
switch
(
a
)
{
case
0
:
c
=
-
b
;
break
;
case
1
:
c
=
~
b
;
break
;
case
2
:
c
=
b
+
1
;
break
;
case
3
:
c
=
b
-
2
;
break
;
case
4
:
c
=
b
*
3
;
break
;
case
5
:
c
=
b
/
4
;
break
;
case
6
:
c
=
b
<<
5
;
break
;
case
7
:
c
=
b
>>
6
;
break
;
case
8
:
c
=
b
|
7
;
break
;
case
9
:
c
=
b
^
8
;
break
;
default:
c
=
b
&
9
;
break
;
}
return
call
(
c
)
+
1
;
}
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