Re: [PATCH] Fix ENTRY_VALUE parameter setup in var-tracking (PR debug/50215)

2011-08-29 Thread Richard Guenther
On Sun, Aug 28, 2011 at 8:56 PM, Jakub Jelinek ja...@redhat.com wrote:
 Hi!

 Depending on the computed hash of the parameter register, corresponding
 ENTRY_VALUE and the size of the hash table it can sometimes happen that
 val2 = cselib_lookup_from_insn will actually find val, which means that
 ENTRY_VALUEs in DEBUG_INSNs will be kept as ENTRY_VALUEs instead of
 REGs or similar preferrable locations if the value is still live there.
 Fixed by adding the ENTRY_VALUE to val-loc only after the
 cselib_lookup_from_insn.

 Bootstrapped/regtested on x86_64-linux and i686-linux, fixes
  PASS: gcc.dg/guality/pr45882.c  -O0  line 16 e == 142
  PASS: gcc.dg/guality/pr45882.c  -O1  (test for excess errors)
  PASS: gcc.dg/guality/pr45882.c  -O1  execution test
 -UNSUPPORTED: gcc.dg/guality/pr45882.c  -O1  line 16 b == 7
 +PASS: gcc.dg/guality/pr45882.c  -O1  line 16 b == 7
 +PASS: gcc.dg/guality/pr45882.c  -O1  line 16 c == 11
 +PASS: gcc.dg/guality/pr45882.c  -O1  line 16 d == 112
 +PASS: gcc.dg/guality/pr45882.c  -O1  line 16 e == 142
  PASS: gcc.dg/guality/pr45882.c  -O2  (test for excess errors)
  PASS: gcc.dg/guality/pr45882.c  -O2  execution test
 -UNSUPPORTED: gcc.dg/guality/pr45882.c  -O2  line 16 e == 142
 +PASS: gcc.dg/guality/pr45882.c  -O2  line 16 b == 7
 +PASS: gcc.dg/guality/pr45882.c  -O2  line 16 c == 11
 +PASS: gcc.dg/guality/pr45882.c  -O2  line 16 d == 112
 +PASS: gcc.dg/guality/pr45882.c  -O2  line 16 e == 142
  PASS: gcc.dg/guality/pr45882.c  -O3 -fomit-frame-pointer  (test for excess 
 errors)
  PASS: gcc.dg/guality/pr45882.c  -O3 -fomit-frame-pointer  execution test
 +PASS: gcc.dg/guality/pr45882.c  -O3 -fomit-frame-pointer  line 16 b == 7
 +PASS: gcc.dg/guality/pr45882.c  -O3 -fomit-frame-pointer  line 16 c == 11
 +PASS: gcc.dg/guality/pr45882.c  -O3 -fomit-frame-pointer  line 16 d == 112
 +PASS: gcc.dg/guality/pr45882.c  -O3 -fomit-frame-pointer  line 16 e == 142
  PASS: gcc.dg/guality/pr45882.c  -O3 -g  (test for excess errors)
  PASS: gcc.dg/guality/pr45882.c  -O3 -g  execution test
 +PASS: gcc.dg/guality/pr45882.c  -O3 -g  line 16 b == 7
 +PASS: gcc.dg/guality/pr45882.c  -O3 -g  line 16 c == 11
 +PASS: gcc.dg/guality/pr45882.c  -O3 -g  line 16 d == 112
 +PASS: gcc.dg/guality/pr45882.c  -O3 -g  line 16 e == 142
  PASS: gcc.dg/guality/pr45882.c  -Os  (test for excess errors)
  PASS: gcc.dg/guality/pr45882.c  -Os  execution test
 +PASS: gcc.dg/guality/pr45882.c  -Os  line 16 b == 7
 +PASS: gcc.dg/guality/pr45882.c  -Os  line 16 c == 11
 +PASS: gcc.dg/guality/pr45882.c  -Os  line 16 d == 112
 +PASS: gcc.dg/guality/pr45882.c  -Os  line 16 e == 142
  PASS: gcc.dg/guality/pr45882.c  -O2 -flto -flto-partition=none  (test for 
 excess errors)
  PASS: gcc.dg/guality/pr45882.c  -O2 -flto -flto-partition=none  execution 
 test
 +PASS: gcc.dg/guality/pr45882.c  -O2 -flto -flto-partition=none  line 16 b == 
 7
 +PASS: gcc.dg/guality/pr45882.c  -O2 -flto -flto-partition=none  line 16 c == 
 11
 +PASS: gcc.dg/guality/pr45882.c  -O2 -flto -flto-partition=none  line 16 d == 
 112
 +PASS: gcc.dg/guality/pr45882.c  -O2 -flto -flto-partition=none  line 16 e == 
 142
  PASS: gcc.dg/guality/pr45882.c  -O2 -flto  (test for excess errors)
  PASS: gcc.dg/guality/pr45882.c  -O2 -flto  execution test
 +PASS: gcc.dg/guality/pr45882.c  -O2 -flto  line 16 b == 7
 +PASS: gcc.dg/guality/pr45882.c  -O2 -flto  line 16 c == 11
 +PASS: gcc.dg/guality/pr45882.c  -O2 -flto  line 16 d == 112
 +PASS: gcc.dg/guality/pr45882.c  -O2 -flto  line 16 e == 142
 which broke when SIMPLE_RETURN has been added to rtl.def and thus rtx codes
 of REG and ENTRY_VALUE changed and with that changed also the hashing of it.

 Ok for trunk?

Ok.

Thanks,
Richard.

 2011-08-28  Jakub Jelinek  ja...@redhat.com

        PR debug/50215
        * var-tracking.c (create_entry_value): Call cselib_lookup_from_insn
        before adding ENTRY_VALUE to val-locs.

 --- gcc/var-tracking.c.jj       2011-07-29 17:07:20.0 +0200
 +++ gcc/var-tracking.c  2011-08-28 13:14:07.0 +0200
 @@ -8488,13 +8488,13 @@ create_entry_value (rtx rtl, cselib_val
   cselib_val *val2;
   struct elt_loc_list *el;
   el = (struct elt_loc_list *) ggc_alloc_cleared_atomic (sizeof (*el));
 -  el-next = val-locs;
   el-loc = gen_rtx_ENTRY_VALUE (GET_MODE (rtl));
   ENTRY_VALUE_EXP (el-loc) = rtl;
 -  el-setting_insn = get_insns ();
 -  val-locs = el;
   val2 = cselib_lookup_from_insn (el-loc, GET_MODE (rtl), true,
                                  VOIDmode, get_insns ());
 +  el-next = val-locs;
 +  el-setting_insn = get_insns ();
 +  val-locs = el;
   if (val2
        val2 != val
        val2-locs

        Jakub



[PATCH] Fix ENTRY_VALUE parameter setup in var-tracking (PR debug/50215)

2011-08-28 Thread Jakub Jelinek
Hi!

Depending on the computed hash of the parameter register, corresponding
ENTRY_VALUE and the size of the hash table it can sometimes happen that
val2 = cselib_lookup_from_insn will actually find val, which means that
ENTRY_VALUEs in DEBUG_INSNs will be kept as ENTRY_VALUEs instead of
REGs or similar preferrable locations if the value is still live there.
Fixed by adding the ENTRY_VALUE to val-loc only after the
cselib_lookup_from_insn.

Bootstrapped/regtested on x86_64-linux and i686-linux, fixes
 PASS: gcc.dg/guality/pr45882.c  -O0  line 16 e == 142
 PASS: gcc.dg/guality/pr45882.c  -O1  (test for excess errors)
 PASS: gcc.dg/guality/pr45882.c  -O1  execution test
-UNSUPPORTED: gcc.dg/guality/pr45882.c  -O1  line 16 b == 7
+PASS: gcc.dg/guality/pr45882.c  -O1  line 16 b == 7
+PASS: gcc.dg/guality/pr45882.c  -O1  line 16 c == 11
+PASS: gcc.dg/guality/pr45882.c  -O1  line 16 d == 112
+PASS: gcc.dg/guality/pr45882.c  -O1  line 16 e == 142
 PASS: gcc.dg/guality/pr45882.c  -O2  (test for excess errors)
 PASS: gcc.dg/guality/pr45882.c  -O2  execution test
-UNSUPPORTED: gcc.dg/guality/pr45882.c  -O2  line 16 e == 142
+PASS: gcc.dg/guality/pr45882.c  -O2  line 16 b == 7
+PASS: gcc.dg/guality/pr45882.c  -O2  line 16 c == 11
+PASS: gcc.dg/guality/pr45882.c  -O2  line 16 d == 112
+PASS: gcc.dg/guality/pr45882.c  -O2  line 16 e == 142
 PASS: gcc.dg/guality/pr45882.c  -O3 -fomit-frame-pointer  (test for excess 
errors)
 PASS: gcc.dg/guality/pr45882.c  -O3 -fomit-frame-pointer  execution test
+PASS: gcc.dg/guality/pr45882.c  -O3 -fomit-frame-pointer  line 16 b == 7
+PASS: gcc.dg/guality/pr45882.c  -O3 -fomit-frame-pointer  line 16 c == 11
+PASS: gcc.dg/guality/pr45882.c  -O3 -fomit-frame-pointer  line 16 d == 112
+PASS: gcc.dg/guality/pr45882.c  -O3 -fomit-frame-pointer  line 16 e == 142
 PASS: gcc.dg/guality/pr45882.c  -O3 -g  (test for excess errors)
 PASS: gcc.dg/guality/pr45882.c  -O3 -g  execution test
+PASS: gcc.dg/guality/pr45882.c  -O3 -g  line 16 b == 7
+PASS: gcc.dg/guality/pr45882.c  -O3 -g  line 16 c == 11
+PASS: gcc.dg/guality/pr45882.c  -O3 -g  line 16 d == 112
+PASS: gcc.dg/guality/pr45882.c  -O3 -g  line 16 e == 142
 PASS: gcc.dg/guality/pr45882.c  -Os  (test for excess errors)
 PASS: gcc.dg/guality/pr45882.c  -Os  execution test
+PASS: gcc.dg/guality/pr45882.c  -Os  line 16 b == 7
+PASS: gcc.dg/guality/pr45882.c  -Os  line 16 c == 11
+PASS: gcc.dg/guality/pr45882.c  -Os  line 16 d == 112
+PASS: gcc.dg/guality/pr45882.c  -Os  line 16 e == 142
 PASS: gcc.dg/guality/pr45882.c  -O2 -flto -flto-partition=none  (test for 
excess errors)
 PASS: gcc.dg/guality/pr45882.c  -O2 -flto -flto-partition=none  execution test
+PASS: gcc.dg/guality/pr45882.c  -O2 -flto -flto-partition=none  line 16 b == 7
+PASS: gcc.dg/guality/pr45882.c  -O2 -flto -flto-partition=none  line 16 c == 11
+PASS: gcc.dg/guality/pr45882.c  -O2 -flto -flto-partition=none  line 16 d == 
112
+PASS: gcc.dg/guality/pr45882.c  -O2 -flto -flto-partition=none  line 16 e == 
142
 PASS: gcc.dg/guality/pr45882.c  -O2 -flto  (test for excess errors)
 PASS: gcc.dg/guality/pr45882.c  -O2 -flto  execution test
+PASS: gcc.dg/guality/pr45882.c  -O2 -flto  line 16 b == 7
+PASS: gcc.dg/guality/pr45882.c  -O2 -flto  line 16 c == 11
+PASS: gcc.dg/guality/pr45882.c  -O2 -flto  line 16 d == 112
+PASS: gcc.dg/guality/pr45882.c  -O2 -flto  line 16 e == 142
which broke when SIMPLE_RETURN has been added to rtl.def and thus rtx codes
of REG and ENTRY_VALUE changed and with that changed also the hashing of it.

Ok for trunk?

2011-08-28  Jakub Jelinek  ja...@redhat.com

PR debug/50215
* var-tracking.c (create_entry_value): Call cselib_lookup_from_insn
before adding ENTRY_VALUE to val-locs.

--- gcc/var-tracking.c.jj   2011-07-29 17:07:20.0 +0200
+++ gcc/var-tracking.c  2011-08-28 13:14:07.0 +0200
@@ -8488,13 +8488,13 @@ create_entry_value (rtx rtl, cselib_val 
   cselib_val *val2;
   struct elt_loc_list *el;
   el = (struct elt_loc_list *) ggc_alloc_cleared_atomic (sizeof (*el));
-  el-next = val-locs;
   el-loc = gen_rtx_ENTRY_VALUE (GET_MODE (rtl));
   ENTRY_VALUE_EXP (el-loc) = rtl;
-  el-setting_insn = get_insns ();
-  val-locs = el;
   val2 = cselib_lookup_from_insn (el-loc, GET_MODE (rtl), true,
  VOIDmode, get_insns ());
+  el-next = val-locs;
+  el-setting_insn = get_insns ();
+  val-locs = el;
   if (val2
val2 != val
val2-locs

Jakub