aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorZack Weinberg <zack@gcc.gnu.org>2003-05-05 21:57:54 +0000
committerZack Weinberg <zack@gcc.gnu.org>2003-05-05 21:57:54 +0000
commit10b6a27401cfaff93dbb479de0fea2e49bb6530a (patch)
tree25c76bfeefa5b878c52eeeb1f17d57eb566eb1a1 /gcc/testsuite
parent68ef8841db44baf4b390349b630dd8bcbdfd5223 (diff)
downloadgcc-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/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/const-elim-1.c48
-rw-r--r--gcc/testsuite/gcc.dg/const-elim-2.c10
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"; }