From: Uros Bizjak Date: Wed, 4 Feb 2015 21:46:01 +0000 (+0100) Subject: backport: re PR target/64882 (ICE on valid code at -O3 with -g enabled in simplify_su... X-Git-Tag: releases/gcc-4.8.5~288 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=08d96e74ca36ef8d6bec1ffc45f39c146f5dc211;p=thirdparty%2Fgcc.git backport: re PR target/64882 (ICE on valid code at -O3 with -g enabled in simplify_subreg, at simplify-rtx.c:5681) Backport from mainline 2015-01-31 Uros Bizjak PR target/64882 * config/i386/predicates.md (address_no_seg_operand): Reject non-CONST_INT_P operands in invalid mode. Backport from mainline 2015-01-31 Uros Bizjak * config/i386/predicates.md (lea_address_operand): Call address_operand with VOIDmode. (vsib_address_operand): Ditto. testsuite/ChangeLog: Backport from mainline 2015-01-31 Uros Bizjak PR target/64882 * gcc.dg/torture/pr64882.c: New test. From-SVN: r220418 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 246c8d7d9067..fabe60089449 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2015-02-04 Uros Bizjak + + Backport from mainline + 2015-01-31 Uros Bizjak + + PR target/64882 + * config/i386/predicates.md (address_no_seg_operand): Reject + non-CONST_INT_P operands in invalid mode. + + Backport from mainline + 2015-01-31 Uros Bizjak + + * config/i386/predicates.md (lea_address_operand): Call + address_operand with VOIDmode. + (vsib_address_operand): Ditto. + 2015-02-01 Jakub Jelinek Backported from mainline diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md index 0e52c85184ed..61614e112467 100644 --- a/gcc/config/i386/predicates.md +++ b/gcc/config/i386/predicates.md @@ -806,11 +806,16 @@ ;; a segment override. Defined as a special predicate to allow ;; mode-less const_int operands pass to address_operand. (define_special_predicate "lea_address_operand" - (match_operand 0 "address_operand") + (match_test "address_operand (op, VOIDmode)") { struct ix86_address parts; int ok; + if (!CONST_INT_P (op) + && mode != VOIDmode + && GET_MODE (op) != mode) + return false; + ok = ix86_decompose_address (op, &parts); gcc_assert (ok); return parts.seg == SEG_DEFAULT; @@ -823,7 +828,7 @@ ;; Return true if op if a valid base register, displacement or ;; sum of base register and displacement for VSIB addressing. (define_predicate "vsib_address_operand" - (match_operand 0 "address_operand") + (match_test "address_operand (op, VOIDmode)") { struct ix86_address parts; int ok; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f0d9e5e328dc..a3d4b249ddd6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-02-04 Uros Bizjak + + Backport from mainline + 2015-01-31 Uros Bizjak + + PR target/64882 + * gcc.dg/torture/pr64882.c: New test. + 2015-02-01 Jakub Jelinek Backported from mainline diff --git a/gcc/testsuite/gcc.dg/torture/pr64882.c b/gcc/testsuite/gcc.dg/torture/pr64882.c new file mode 100644 index 000000000000..462edace1b90 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr64882.c @@ -0,0 +1,33 @@ +/* PR target/64882 */ +/* { dg-do compile } */ + +int a, d, e; +long long b; +static long long *c = &b; + +void +fn1 (short p) +{ +} + +long long +fn2 (long long p1, long long p2) +{ + return (p1 && p1 > 26854775807LL - p2) || p1 < -p2 ? p1 : p1 + p2; +} + +void +fn3 () +{ + long long f; + int g = 3; + int *h = &a; + for (e = 0; e < 2; e++) + { + int *i = &g; + if (!fn2 (*c, 7 < d % (*i)--)) + f = fn2 ((*h <= 0) | b, 5278350700LL); + *h = f; + fn1 (*h); + } +}