This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR39204, ICE in compute_antic
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 17 Feb 2009 15:59:54 +0100 (CET)
- Subject: [PATCH] Fix PR39204, ICE in compute_antic
We ICE here because we happen to oscillate between two different
PHI nodes. The fix is to make sure we always translate to value-numbers
of PHI arguments which we missed here.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard.
2009-02-17 Richard Guenther <rguenther@suse.de>
PR tree-optimization/39204
* tree-ssa-pre.c (phi_translate_1): Lookup the value-number
of the PHI arg.
* gcc.dg/torture/pr39204.c: New testcase.
Index: gcc/tree-ssa-pre.c
===================================================================
*** gcc/tree-ssa-pre.c (revision 144227)
--- gcc/tree-ssa-pre.c (working copy)
*************** phi_translate_1 (pre_expr expr, bitmap_s
*** 1707,1712 ****
--- 1707,1715 ----
tree def = PHI_ARG_DEF (phi, e->dest_idx);
pre_expr newexpr;
+ if (TREE_CODE (def) == SSA_NAME)
+ def = VN_INFO (def)->valnum;
+
/* Handle constant. */
if (is_gimple_min_invariant (def))
return get_or_alloc_expr_for_constant (def);
Index: gcc/testsuite/gcc.dg/torture/pr39204.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr39204.c (revision 0)
--- gcc/testsuite/gcc.dg/torture/pr39204.c (revision 0)
***************
*** 0 ****
--- 1,131 ----
+ /* { dg-do compile } */
+ /* { dg-options "-w" } */
+
+ typedef unsigned int size_t;
+ typedef unsigned char __u_char;
+ typedef unsigned short int __u_short;
+ typedef unsigned int __u_int;
+ typedef unsigned long int __u_long;
+ typedef signed char __int8_t;
+ typedef unsigned char __uint8_t;
+ typedef signed short int __int16_t;
+ typedef unsigned short int __uint16_t;
+ typedef signed int __int32_t;
+ typedef unsigned int __uint32_t;
+ __extension__ typedef signed long long int __int64_t;
+ __extension__ typedef unsigned long long int __uint64_t;
+ __extension__ typedef long long int __quad_t;
+ __extension__ typedef unsigned long long int __u_quad_t;
+ __extension__ typedef __u_quad_t __dev_t;
+ __extension__ typedef unsigned int __uid_t;
+ __extension__ typedef unsigned int __gid_t;
+ __extension__ typedef unsigned long int __ino_t;
+ __extension__ typedef __u_quad_t __ino64_t;
+ __extension__ typedef unsigned int __mode_t;
+ __extension__ typedef unsigned int __nlink_t;
+ __extension__ typedef long int __off_t;
+ __extension__ typedef __quad_t __off64_t;
+ __extension__ typedef int __pid_t;
+ __extension__ typedef struct {
+ int __val[2];
+ } __fsid_t;
+ __extension__ typedef long int __clock_t;
+ __extension__ typedef unsigned int __id_t;
+ typedef struct _IO_FILE FILE;
+ typedef struct _IO_FILE __FILE;
+ typedef struct {
+ int __count;
+ union {
+ unsigned int __wch;
+ char __wchb[4];
+ }
+ __value;
+ } __mbstate_t;
+ typedef struct {
+ __off_t __pos;
+ __mbstate_t __state;
+ } _G_fpos_t;
+ typedef struct {
+ __off64_t __pos;
+ __mbstate_t __state;
+ } _G_fpos64_t;
+ typedef unsigned int _G_uint16_t __attribute__ ((__mode__ (__HI__)));
+ typedef struct _IO_FILE _IO_FILE;
+ extern struct _IO_FILE_plus _IO_2_1_stderr_;
+ extern int fputs (__const char *__restrict __s, FILE * __restrict __stream);
+ extern char *strstr (__const char *__haystack, __const char *__needle)
+ __attribute__ ((__nonnull__ (1, 2)));
+ extern char *rindex (__const char *__s, int __c) __attribute__ ((__nonnull__ (1)));
+ extern size_t strlen (__const char *__s) __attribute__ ((__nothrow__))
+ __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
+ char *mystrlwr (char *string);
+ char *m_replace_filename (const char *path, const char *filename);
+ typedef struct LINE {
+ char *text;
+ struct LINE *next;
+ int flags;
+ } LINE;
+ typedef struct TOC {
+ char *text;
+ char *alt;
+ struct TOC *next;
+ int root;
+ int texinfoable;
+ int htmlable;
+ int otherfile;
+ } TOC;
+ static int _empty_count;
+ extern char *_word_substitution[256];
+ static void _output_sorted_nested_toc (TOC ** list, unsigned int num_items);
+ static char *_do_text_substitution (char *input);
+ static int _toc_scmp (const void *e1, const void *e2)
+ {
+ TOC *t1 = *((TOC **) e1);
+ TOC *t2 = *((TOC **) e2);
+ return mystricmp (t1->text, t2->text);
+ }
+ static void _output_buffered_text (void) { if (_empty_count) ; }
+ void _post_process_filename (char *filename)
+ {
+ int code_scanning = 0;
+ char *new_filename, *p;
+ char *line;
+ FILE *f1 = 0, *f2 = 0;
+ if (!new_filename || strlen (new_filename) < 2)
+ new_filename[strlen (filename) - 1] = 'x';
+ if (!f1 || !f2)
+ while ((line = m_fgets (f1)))
+ {
+ line = _do_text_substitution (line);
+ fputs (line, f2);
+ }
+ if (remove (filename))
+ cancel:
+ if (f1)
+ if (f2)
+ if (new_filename)
+ ;
+ }
+ static void _close_html_file (FILE * file)
+ {
+ int f;
+ for (f = 0; _word_substitution[f]; f++)
+ ;
+ }
+ static __attribute__((always_inline))
+ char * _do_text_substitution (char *input)
+ {
+ int start, end, middle, f;
+ char *temp, *found, *reader;
+ for (f = 0; _word_substitution[f]; f++)
+ {
+ reader = input;
+ while ((found = strstr (reader, _word_substitution[f])))
+ {
+ start = found - input;
+ input = temp;
+ reader = temp + start + middle;
+ }
+ }
+ return input;
+ }