Bug 34334 - [4.3 Regression] ICE in vuses_compare, at tree-vn.c:118
Summary: [4.3 Regression] ICE in vuses_compare, at tree-vn.c:118
Alias: None
Product: gcc
Classification: Unclassified
Component: middle-end (show other bugs)
Version: 4.3.0
: P3 normal
Target Milestone: 4.3.0
Assignee: Richard Biener
Keywords: alias, ice-on-valid-code
Depends on:
Reported: 2007-12-04 12:39 UTC by Richard Biener
Modified: 2007-12-04 17:21 UTC (History)
1 user (show)

See Also:
Target: powerpc-*-*
Known to work:
Known to fail:
Last reconfirmed: 2007-12-04 14:03:39

reduced testcase (1.92 KB, text/plain)
2007-12-04 12:48 UTC, Richard Biener

Note You need to log in before you can comment on or make changes to this bug.
Description Richard Biener 2007-12-04 12:39:37 UTC
With a x86_64 -> ppc64 cross:

./cc1 ~/export/config_file.1.min.i -O2 -o /dev/null -m32 -quiet
/suse/rguenther/export/config_file.1.min.i:16: warning: unnamed struct/union that defines no instances
/suse/rguenther/export/config_file.1.min.i:16: warning: 'struct stat64' declared inside parameter list
/suse/rguenther/export/config_file.1.min.i:16: warning: its scope is only this definition or declaration, which is probably not what you want
/suse/rguenther/export/config_file.1.min.i:17: warning: 'struct stat64' declared inside parameter list
/suse/rguenther/export/config_file.1.min.i:33: warning: '__transparent_union__' attribute ignored
/suse/rguenther/export/config_file.1.min.i:103: warning: 'struct addrinfo' declared inside parameter list
/suse/rguenther/export/config_file.1.min.i: In function 'gftp_config_parse_args':
/suse/rguenther/export/config_file.1.min.i:166: internal compiler error: tree check: expected ssa_name, have symbol_memory_tag in vuses_compare, at tree-vn.c:118
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.

also ICEs on native ppc.
Comment 1 Richard Biener 2007-12-04 12:48:30 UTC
Created attachment 14696 [details]
reduced testcase

Appearantly the ICE is dependent on UIDs as if you remove an unused type decl the
ICE disappears.
Comment 2 Richard Biener 2007-12-04 13:15:15 UTC
The difference if I remove the gftp_transfer typedef from the dump after
critical edge splitting is (good vs. bad):

-  D.1477_21 = 0B;
-  *0B ={v} 0;
+  # VUSE <SMT.32_54, SMT.33_40>
+  D.1481_21 = *dest_19;
+  # SMT.32_41 = VDEF <SMT.32_54>
+  # SMT.33_42 = VDEF <SMT.33_40>
+  *D.1481_21 = 0;

The first real difference is after may_alias recomputation after SRA,
where despite same constraints the points-to solution for dest_1 is

-dest_1, name memory tag: NMT.35, is dereferenced, points-to vars: { SMT.32 }
+dest_1, name memory tag: NMT.35, is dereferenced, points-to vars: { SMT.32 SMT.33 }

The IL shows this in

 <bb 8>:
-  # SMT.32_48 = PHI <SMT.32_54(3), SMT.32_44(7)>
   # argp$0$gpr_30 = PHI <argp$0$gpr_27(3), argp$0$gpr_28(7)>
   # argp$0$overflow_arg_area_24 = PHI <argp$0$overflow_arg_area_2(3), argp$0$overflow_arg_area_4(7)>
-  # SMT.33_29 = PHI <SMT.33_55(3), SMT.33_55(7)>
+  # SMT.33_29 = PHI <SMT.33_55(3), SMT.33_40(7)>
   # SFT.25_26 = PHI <SFT.25_53(3), SFT.25_25(7)>
   # SFT.22_23 = PHI <SFT.22_52(3), SFT.22_22(7)>
   # dest_1 = PHI <dest_50(3), dest_19(7)>
   numargs_20 = numargs_51 + -1;
-  # VUSE <SMT.32_48>
-  D.1477_21 = *dest_1;
-  # SMT.32_41 = VDEF <SMT.32_48>
+  # VUSE <SMT.32_54, SMT.33_29>
+  D.1481_21 = *dest_1;
+  # SMT.32_41 = VDEF <SMT.32_54>
   # SMT.33_42 = VDEF <SMT.33_29>
-  *D.1477_21 = 0;
+  *D.1481_21 = 0;

and finally store_ccp in one case optimizes this to

@@ -79,11 +93,8 @@
   # SMT.32_44 = VDEF <SMT.32_54>
   *dest_19 = 0B;
   numargs_20 = numargs_51 + -1;
-  # VUSE <SMT.32_44>
-  D.1477_21 = *dest_19;
-  # SMT.32_41 = VDEF <SMT.32_44>
-  # SMT.33_42 = VDEF <SMT.33_55>
-  *D.1477_21 = 0;
+  D.1477_21 = 0B;
+  *0B ={v} 0;
   if (numargs_20 > 0)
     goto <bb 3>;

which avoids the ICE in SCCVN which looks like:

#2  0x0000000000abf95e in vuses_compare (pa=0x2ba6ff3a3ba8, pb=0x2ba6ff3a3bb0)
    at /space/rguenther/src/svn/trunk/gcc/tree-vn.c:118
118       int sn = SSA_NAME_VERSION (vusea) - SSA_NAME_VERSION (vuseb);
(gdb) print vusea
$1 = (const tree) 0x2ba6ff392e10
(gdb) call debug_generic_expr (vusea)
(gdb) call debug_generic_expr (vuseb)

that is, one VUSE isn't in SSA form - but was inserted by PRE:

(gdb) call debug_generic_expr (stmt)
# VUSE <SMT.32, SMT.33_40> { SMT.32 SMT.33 }
storetmp.46_60 = *dest_19

I suppose for some reason virtual operand pruning isn't doing the same
for the inserted stmt as for the original stmt where the operands were
copied from.  Indeed, we have the appearant mismatch here (crited):

  # SMT.33_40 = VDEF <SMT.33_55>
  *dest_19 = 0B;
  # VUSE <SMT.32_54, SMT.33_40>
  D.1481_21 = *dest_19;
Comment 3 Richard Biener 2007-12-04 14:03:38 UTC
The issue is that the loaded_syms bitmap doesn't agree with the VUSEs:

(gdb) call debug_generic_expr (stmt)
# VUSE <SMT.33_40> { SMT.32 SMT.33 }
storetmp.46_60 = *dest_19

as in create_ssa_artificial_load_stmt we make sure to kill build_vuses, but
not to clear the build_loads bitmap.  With that fixed we generate

# VUSE <SMT.33_40> { SMT.33 }
storetmp.46_60 = *dest_19

which looks better, but later still ICEs, because the operand scanner
re-inserts the load of SMT.32.

So one could argue that for the original statement where we copy the
virtual operands from

# SMT.33_40 = VDEF <SMT.33_55> { SMT.33 }
*dest_19 = 0B

that this is missing a VDEF of SMT.32 (the alias sets of both SMT.32 and
*dest_19 are 3).

Note also that even during the first may_alias pass(!) we do not have
flow-sensitive information for dest_19:

NOTE: no flow-sensitive alias info for dest_19 in *dest_19 = 0B;

that is, we only use a fallback SMT here.  And the failure mode is exactly
as I have predicted - we add the aliases of SMT.32 (SMT.33), but not SMT.32

Comment 4 Richard Biener 2007-12-04 17:20:58 UTC
Subject: Bug 34334

Author: rguenth
Date: Tue Dec  4 17:20:34 2007
New Revision: 130602

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=130602
2007-12-04  Richard Guenther  <rguenther@suse.de>

	PR middle-end/34334
	PR middle-end/34222
	* tree-ssa-operands.c (get_addr_dereference_operands): If we
	fall back to using the SMTs aliases, make sure to add virtual
	operands for the SMT itself.
	(create_ssa_artificial_load_stmt): Fix typo.  Make sure to also
	clear the loaded and stored symbols bitmaps.

	* gcc.c-torture/compile/pr34334.c: New testcase.
	* g++.dg/torture/pr34222.C: New testcase.


Comment 5 Richard Biener 2007-12-04 17:21:47 UTC