aboutsummaryrefslogtreecommitdiffstats
path: root/community/gcc6/0017-pr93402.patch
blob: c985fb68259ffd9420b600de74ac4df75ee3bcc7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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;
+}