diff options
author | Zack Weinberg <zack@gcc.gnu.org> | 2003-05-05 21:57:54 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2003-05-05 21:57:54 +0000 |
commit | 10b6a27401cfaff93dbb479de0fea2e49bb6530a (patch) | |
tree | 25c76bfeefa5b878c52eeeb1f17d57eb566eb1a1 /gcc/testsuite | |
parent | 68ef8841db44baf4b390349b630dd8bcbdfd5223 (diff) | |
download | gcc-10b6a27401cfaff93dbb479de0fea2e49bb6530a.zip gcc-10b6a27401cfaff93dbb479de0fea2e49bb6530a.tar.gz gcc-10b6a27401cfaff93dbb479de0fea2e49bb6530a.tar.bz2 |
rtl.h (STRING_POOL_ADDRESS_P): Rename to DEFERRED_CONSTANT_P.
* rtl.h (STRING_POOL_ADDRESS_P): Rename to DEFERRED_CONSTANT_P.
* varasm.c (struct varasm_status): Add deferred_constants field.
(n_deferred_strings): Delete variable.
(n_deferred_constants): New #define.
(struct constant_descriptor_tree): Kill next and label fields.
(const_hash_table, MAX_HASH_TABLE): Delete.
(const_desc_htab): New static variable.
(const_hash): Rename const_desc_hash, and make it fit the
hashtab.h interface.
(const_desc_eq): New.
(const_hash_1, compare_constant): Const-ify arguments.
(build_constant_desc): Set DEFERRED_CONSTANT_P on all new
SYMBOL_REFs. Clarify comments. Don't set desc->label.
(output_constant_def): Do the lookup/insert using the
hashtab.h interface. Don't muck with n_deferred_constants or
DEFERRED_CONSTANT_P here.
Always call maybe_output_constant_def_contents.
(maybe_output_constant_def_contents): Take a pointer to the
descriptor, not the EXP and RTL separately. Return
immediately if this constant is not deferred. Defer output of
everything, except writable string constants. Update
n_deferred_constants here.
(output_constant_def_contents): Now takes just one argument,
an rtx. Clear DEFERRED_CONSTANT_P here.
(mark_constant_pool): Update for rename of n_deferred_strings.
(mark_constant): Don't clear DEFERRED_CONSTANT_P here.
(init_varasm_status): Clear p->deferred_constants.
(init_varasm_once): Call htab_create_ggc for const_desc_htab.
* gcc.dg/const-elim-1.c, gcc.dg/const-elim-2.c: New testcases.
From-SVN: r66505
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/const-elim-1.c | 48 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/const-elim-2.c | 10 |
3 files changed, 62 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 90eb31b..05b06a0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-05-05 Zack Weinberg <zack@codesourcery.com> + + * gcc.dg/const-elim-1.c, gcc.dg/const-elim-2.c: New testcases. + 2003-05-05 Jakub Jelinek <jakub@redhat.com> * gcc.c-torture/execute/string-opt-18.c (main): Add 3 new tests. diff --git a/gcc/testsuite/gcc.dg/const-elim-1.c b/gcc/testsuite/gcc.dg/const-elim-1.c new file mode 100644 index 0000000..b704408 --- /dev/null +++ b/gcc/testsuite/gcc.dg/const-elim-1.c @@ -0,0 +1,48 @@ +/* Verify that constants in memory, referenced only by dead code, + are not emitted to the object file. + FIXME: Not presently possible to apply -pedantic to code with + complex constants in it. The __extension__ should shut up the + warning but doesn't. (Hard to fix -- the lexer is not aware of + the parser's state.) */ + +/* { dg-do compile } */ +/* { dg-options "-O2 -std=c99" } */ +/* { dg-final { scan-assembler-not "LC" } } */ + +#define I (__extension__ 1.0iF) + +struct S { int a; double b[2]; void *c; }; + +extern void use_str(const char *); +extern void use_S(const struct S *); +extern void use_cplx(__complex__ double); + +static inline int +returns_23(void) { return 23; } + +void +test1(void) +{ + if (returns_23() == 23) + return; + + use_str("waltz, nymph, for quick jigs vex bud"); + use_S(&(const struct S){12, {3.1415, 2.1828}, 0 }); + use_cplx(3.1415 + 2.1828*I); +} + +void +test2(void) +{ + const char *str = "pack my box with five dozen liquor jugs"; + const struct S S = { 23, { 1.414, 1.618 }, 0 }; + const __complex__ double cplx = 1.414 + 1.618*I; + + if (returns_23() == 23) + return; + + use_str(str); + use_S(&S); + use_cplx(cplx); +} + diff --git a/gcc/testsuite/gcc.dg/const-elim-2.c b/gcc/testsuite/gcc.dg/const-elim-2.c new file mode 100644 index 0000000..ce55ba1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/const-elim-2.c @@ -0,0 +1,10 @@ +/* The string constant in this test case should be emitted exactly once. */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-times "hi there" 1 } } */ + +static inline int returns_23() { return 23; } + +const char *test1(void) { if (returns_23()) return 0; return "hi there"; } +const char *test2(void) { return "hi there"; } +const char *test3(void) { return "hi there"; } |