From 8ea83ef1ef1b6f8bcaa8f9d8c673513f78548e47 Mon Sep 17 00:00:00 2001 From: Peter Bergner Date: Wed, 20 Nov 2019 20:42:41 +0000 Subject: [PATCH] Backport fix for PR92090. gcc/ Backport from mainline 2019-11-07 Peter Bergner PR other/92090 * config/rs6000/predicates.md (input_operand): Allow MODE_PARTIAL_INT modes for integer constants. gcc/testsuite/ Backport from mainline 2019-11-13 David Edelsohn * gcc.target/powerpc/pr92090.c: Limit -mbig to powerpc64le-*-*. * gcc.target/powerpc/pr92090-2.c: Likewise. 2019-11-07 Peter Bergner PR other/92090 * gcc.target/powerpc/pr92090-2.c: New test. 2019-11-07 Peter Bergner PR other/92090 * gcc.target/powerpc/pr92090.c: New test. From-SVN: r278527 --- gcc/ChangeLog | 9 ++++ gcc/config/rs6000/predicates.md | 3 +- gcc/testsuite/ChangeLog | 18 ++++++++ gcc/testsuite/gcc.target/powerpc/pr92090-2.c | 45 ++++++++++++++++++++ gcc/testsuite/gcc.target/powerpc/pr92090.c | 43 +++++++++++++++++++ 5 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr92090-2.c create mode 100644 gcc/testsuite/gcc.target/powerpc/pr92090.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 52aa9c3b5d2b..2e76ab46f480 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2019-11-20 Peter Bergner + + Backport from mainline + 2019-11-07 Peter Bergner + + PR other/92090 + * config/rs6000/predicates.md (input_operand): Allow MODE_PARTIAL_INT + modes for integer constants. + 2019-11-20 Michael Matz Backport from mainline diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index 5cc80dea66c0..9e1d717a65b0 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -1053,8 +1053,7 @@ return 1; /* Allow any integer constant. */ - if (GET_MODE_CLASS (mode) == MODE_INT - && CONST_SCALAR_INT_P (op)) + if (SCALAR_INT_MODE_P (mode) && CONST_SCALAR_INT_P (op)) return 1; /* Allow easy vector constants. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4cc884294d18..6fd3d9392b80 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,21 @@ +2019-11-20 Peter Bergner + + Backport from mainline + 2019-11-13 David Edelsohn + + * gcc.target/powerpc/pr92090.c: Limit -mbig to powerpc64le-*-*. + * gcc.target/powerpc/pr92090-2.c: Likewise. + + 2019-11-07 Peter Bergner + + PR other/92090 + * gcc.target/powerpc/pr92090-2.c: New test. + + 2019-11-07 Peter Bergner + + PR other/92090 + * gcc.target/powerpc/pr92090.c: New test. + 2019-10-28 Michael Matz Backport from mainline diff --git a/gcc/testsuite/gcc.target/powerpc/pr92090-2.c b/gcc/testsuite/gcc.target/powerpc/pr92090-2.c new file mode 100644 index 000000000000..1710dfdd52ab --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr92090-2.c @@ -0,0 +1,45 @@ +/* { dg-do compile } */ +/* { dg-options "-mdejagnu-cpu=power8 -Os -w" } */ +/* { dg-additional-options "-mbig" { target powerpc64le-*-* } } */ + +/* Verify that we don't ICE. */ + +int a; +static _Atomic long double b, c, d, m; +double n; +extern int foo (void); +extern void bar (int, int, int, int); + +void +bug (void) +{ + b = 1.79769313486231580793728971405301199e308L; + for (int i = 0; i < 10000; i++) + if (__builtin_isinf (n)) + b; + c = 1; + int e, f, g, h; + while (a) + ; + for (int i; i; i++) + { + double j = c /= foo (); + if (__builtin_isinf (j)) + { + if (foo == 1 << 31) + e++; + f++; + c = 0; + } + else + { + if (foo == 1 << 30) + g++; + h++; + c = 1; + } + } + bar (e, f, g, h); + d = 1.79769313486231580793728971405301199e308L; + m = 1; +} diff --git a/gcc/testsuite/gcc.target/powerpc/pr92090.c b/gcc/testsuite/gcc.target/powerpc/pr92090.c new file mode 100644 index 000000000000..77c9f8435335 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr92090.c @@ -0,0 +1,43 @@ +/* { dg-do compile } */ +/* { dg-options "-mdejagnu-cpu=power8 -Os" } */ +/* { dg-additional-options "-mbig" { target powerpc64le-*-* } } */ + +/* Verify that we don't ICE. */ + +_Atomic int a; +_Atomic long double b, c; +int j; +void foo (void); +void bar (int, int, int, int); + +void +bug (void) +{ + b = 1; + int d, e, f, g; + while (a) + ; + for (int h = 0; h < 10000; h++) + { + double i = b /= 3; + foo (); + if (i) + { + if (i == 1) + d++; + e++; + b = 0; + } + else + { + if (i == 2) + f++; + g++; + b = 1; + } + } + bar (d, e, f, g); + c = 1; + for (int h; h; h++) + j = 0; +} -- 2.47.2