add patch fixing gcc pr93402 (wrong codegen)

affects all gcc versions 6.x and later. same patch works for all.

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93402
This commit is contained in:
Rich Felker 2020-01-23 19:38:10 -05:00
parent de5dc219d8
commit 03d6d755c7
4 changed files with 180 additions and 0 deletions

View File

@ -0,0 +1,45 @@
2020-01-23 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/93402
* postreload.c (reload_combine_recognize_pattern): Don't try to adjust
USE insns.
* gcc.c-torture/execute/pr93402.c: New test.
--- a/gcc/postreload.c.jj 2020-01-12 11:54:36.000000000 +0100
+++ b/gcc/postreload.c 2020-01-23 17:23:25.359929516 +0100
@@ -1078,6 +1078,10 @@ reload_combine_recognize_pattern (rtx_in
struct reg_use *use = reg_state[regno].reg_use + i;
if (GET_MODE (*use->usep) != mode)
return false;
+ /* Don't try to adjust (use (REGX)). */
+ if (GET_CODE (PATTERN (use->insn)) == USE
+ && &XEXP (PATTERN (use->insn), 0) == use->usep)
+ return false;
}
/* Look for (set (REGX) (CONST_INT))
--- a/gcc/testsuite/gcc.c-torture/execute/pr93402.c.jj 2020-01-23 17:25:46.496803852 +0100
+++ b/gcc/testsuite/gcc.c-torture/execute/pr93402.c 2020-01-23 17:25:05.221425501 +0100
@@ -0,0 +1,21 @@
+/* PR rtl-optimization/93402 */
+
+struct S { unsigned int a; unsigned long long b; };
+
+__attribute__((noipa)) struct S
+foo (unsigned long long x)
+{
+ struct S ret;
+ ret.a = 0;
+ ret.b = x * 11111111111ULL + 111111111111ULL;
+ return ret;
+}
+
+int
+main ()
+{
+ struct S a = foo (1);
+ if (a.a != 0 || a.b != 122222222222ULL)
+ __builtin_abort ();
+ return 0;
+}

View File

@ -0,0 +1,45 @@
2020-01-23 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/93402
* postreload.c (reload_combine_recognize_pattern): Don't try to adjust
USE insns.
* gcc.c-torture/execute/pr93402.c: New test.
--- a/gcc/postreload.c.jj 2020-01-12 11:54:36.000000000 +0100
+++ b/gcc/postreload.c 2020-01-23 17:23:25.359929516 +0100
@@ -1078,6 +1078,10 @@ reload_combine_recognize_pattern (rtx_in
struct reg_use *use = reg_state[regno].reg_use + i;
if (GET_MODE (*use->usep) != mode)
return false;
+ /* Don't try to adjust (use (REGX)). */
+ if (GET_CODE (PATTERN (use->insn)) == USE
+ && &XEXP (PATTERN (use->insn), 0) == use->usep)
+ return false;
}
/* Look for (set (REGX) (CONST_INT))
--- a/gcc/testsuite/gcc.c-torture/execute/pr93402.c.jj 2020-01-23 17:25:46.496803852 +0100
+++ b/gcc/testsuite/gcc.c-torture/execute/pr93402.c 2020-01-23 17:25:05.221425501 +0100
@@ -0,0 +1,21 @@
+/* PR rtl-optimization/93402 */
+
+struct S { unsigned int a; unsigned long long b; };
+
+__attribute__((noipa)) struct S
+foo (unsigned long long x)
+{
+ struct S ret;
+ ret.a = 0;
+ ret.b = x * 11111111111ULL + 111111111111ULL;
+ return ret;
+}
+
+int
+main ()
+{
+ struct S a = foo (1);
+ if (a.a != 0 || a.b != 122222222222ULL)
+ __builtin_abort ();
+ return 0;
+}

View File

@ -0,0 +1,45 @@
2020-01-23 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/93402
* postreload.c (reload_combine_recognize_pattern): Don't try to adjust
USE insns.
* gcc.c-torture/execute/pr93402.c: New test.
--- a/gcc/postreload.c.jj 2020-01-12 11:54:36.000000000 +0100
+++ b/gcc/postreload.c 2020-01-23 17:23:25.359929516 +0100
@@ -1078,6 +1078,10 @@ reload_combine_recognize_pattern (rtx_in
struct reg_use *use = reg_state[regno].reg_use + i;
if (GET_MODE (*use->usep) != mode)
return false;
+ /* Don't try to adjust (use (REGX)). */
+ if (GET_CODE (PATTERN (use->insn)) == USE
+ && &XEXP (PATTERN (use->insn), 0) == use->usep)
+ return false;
}
/* Look for (set (REGX) (CONST_INT))
--- a/gcc/testsuite/gcc.c-torture/execute/pr93402.c.jj 2020-01-23 17:25:46.496803852 +0100
+++ b/gcc/testsuite/gcc.c-torture/execute/pr93402.c 2020-01-23 17:25:05.221425501 +0100
@@ -0,0 +1,21 @@
+/* PR rtl-optimization/93402 */
+
+struct S { unsigned int a; unsigned long long b; };
+
+__attribute__((noipa)) struct S
+foo (unsigned long long x)
+{
+ struct S ret;
+ ret.a = 0;
+ ret.b = x * 11111111111ULL + 111111111111ULL;
+ return ret;
+}
+
+int
+main ()
+{
+ struct S a = foo (1);
+ if (a.a != 0 || a.b != 122222222222ULL)
+ __builtin_abort ();
+ return 0;
+}

View File

@ -0,0 +1,45 @@
2020-01-23 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/93402
* postreload.c (reload_combine_recognize_pattern): Don't try to adjust
USE insns.
* gcc.c-torture/execute/pr93402.c: New test.
--- a/gcc/postreload.c.jj 2020-01-12 11:54:36.000000000 +0100
+++ b/gcc/postreload.c 2020-01-23 17:23:25.359929516 +0100
@@ -1078,6 +1078,10 @@ reload_combine_recognize_pattern (rtx_in
struct reg_use *use = reg_state[regno].reg_use + i;
if (GET_MODE (*use->usep) != mode)
return false;
+ /* Don't try to adjust (use (REGX)). */
+ if (GET_CODE (PATTERN (use->insn)) == USE
+ && &XEXP (PATTERN (use->insn), 0) == use->usep)
+ return false;
}
/* Look for (set (REGX) (CONST_INT))
--- a/gcc/testsuite/gcc.c-torture/execute/pr93402.c.jj 2020-01-23 17:25:46.496803852 +0100
+++ b/gcc/testsuite/gcc.c-torture/execute/pr93402.c 2020-01-23 17:25:05.221425501 +0100
@@ -0,0 +1,21 @@
+/* PR rtl-optimization/93402 */
+
+struct S { unsigned int a; unsigned long long b; };
+
+__attribute__((noipa)) struct S
+foo (unsigned long long x)
+{
+ struct S ret;
+ ret.a = 0;
+ ret.b = x * 11111111111ULL + 111111111111ULL;
+ return ret;
+}
+
+int
+main ()
+{
+ struct S a = foo (1);
+ if (a.a != 0 || a.b != 122222222222ULL)
+ __builtin_abort ();
+ return 0;
+}