From 05a578ba97cdd9eb33f93da283b968838b5f106a Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 15 Feb 2006 20:41:03 +0000 Subject: PR middle-end/26300 * combine.c (make_extraction): Bail out if ORIG_POS is negative. * gcc.c-torture/compile/20060215-1.c: New test. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@111116 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 3 ++ gcc/combine.c | 3 ++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.c-torture/compile/20060215-1.c | 42 ++++++++++++++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20060215-1.c (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3be2c3f5a8f..9b388d6cf2b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2006-02-15 Jakub Jelinek + PR middle-end/26300 + * combine.c (make_extraction): Bail out if ORIG_POS is negative. + * tree.h (struct tree_omp_clause): Use OMP_CLAUSE_CODE rather than TREE_CODE as index into omp_clause_num_ops array. diff --git a/gcc/combine.c b/gcc/combine.c index d4ea6897c81..96ebd208a82 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -6249,6 +6249,9 @@ make_extraction (enum machine_mode mode, rtx inner, HOST_WIDE_INT pos, || orig_pos + len > GET_MODE_BITSIZE (wanted_inner_mode))) return 0; + if (orig_pos < 0) + return 0; + inner = force_to_mode (inner, wanted_inner_mode, pos_rtx || len + orig_pos >= HOST_BITS_PER_WIDE_INT diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d2319a10fbf..d22edd340f2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-02-15 Jakub Jelinek + + PR middle-end/26300 + * gcc.c-torture/compile/20060215-1.c: New test. + 2006-02-14 Roger Sayle PR middle-end/23670 diff --git a/gcc/testsuite/gcc.c-torture/compile/20060215-1.c b/gcc/testsuite/gcc.c-torture/compile/20060215-1.c new file mode 100644 index 00000000000..7979561a3e6 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20060215-1.c @@ -0,0 +1,42 @@ +/* PR middle-end/26300 */ + +struct S +{ + char c; + struct S *d; + struct S *e; +}; +extern struct S *u, *v; +extern void fn1 (struct S *) __attribute__ ((noreturn)); +void fn2 (struct S *); + +static inline struct S * +fn3 (struct S *x) +{ + if (x->c != 6) + fn1 (0); + return (struct S *) x; +} + +static inline int +fn4 (struct S *x) +{ + if (x != u) + return 3; + fn2 (x); + return 0; +} + +int +test (struct S *x) +{ + struct S *r; + int m = 0; + + for (r = x; r != v; r = (fn3 (r)->d)) + if (r->c != 6) + fn1 (x); + else + m |= 1 << (fn4 (fn3 (r)->e) - 1); + return m; +} -- cgit v1.2.3