[Bug c++/83490] [8 Regression] ICE in find_call_stack_args, at dce.c:392

2017-12-20 Thread jakub at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83490

Jakub Jelinek  changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution|--- |FIXED

--- Comment #8 from Jakub Jelinek  ---
Fixed.

[Bug c++/83490] [8 Regression] ICE in find_call_stack_args, at dce.c:392

2017-12-20 Thread jakub at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83490

--- Comment #7 from Jakub Jelinek  ---
Author: jakub
Date: Wed Dec 20 09:12:09 2017
New Revision: 255852

URL: https://gcc.gnu.org/viewcvs?rev=255852=gcc=rev
Log:
PR c++/83490
* calls.c (compute_argument_addresses): Ignore TYPE_EMPTY_P arguments.

* g++.dg/abi/empty29.C: New test.

Added:
trunk/gcc/testsuite/g++.dg/abi/empty29.C
Modified:
trunk/gcc/ChangeLog
trunk/gcc/calls.c
trunk/gcc/testsuite/ChangeLog

[Bug c++/83490] [8 Regression] ICE in find_call_stack_args, at dce.c:392

2017-12-19 Thread jakub at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83490

--- Comment #6 from Jakub Jelinek  ---
--- gcc/calls.c.jj  2017-12-18 14:57:24.0 +0100
+++ gcc/calls.c 2017-12-19 19:46:40.466045457 +0100
@@ -2382,7 +2382,12 @@ compute_argument_addresses (struct arg_d
  args[i].stack = gen_rtx_MEM (partial_mode, addr);
  set_mem_size (args[i].stack, units_on_stack);
}
- else
+ else if (TYPE_EMPTY_P (TREE_TYPE (args[i].tree_value)))
+   {
+ args[i].stack = gen_rtx_MEM (BLKmode, addr);
+ set_mem_size (args[i].stack, 0);
+   }
+ else  
{
  args[i].stack = gen_rtx_MEM (args[i].mode, addr);
  set_mem_attributes (args[i].stack,

avoids the ICE.  But I think I prefer:
--- gcc/calls.c.jj  2017-12-18 14:57:24.0 +0100
+++ gcc/calls.c 2017-12-19 20:25:00.143659975 +0100
@@ -2365,6 +2365,9 @@ compute_argument_addresses (struct arg_d
  && args[i].partial == 0)
continue;

+ if (TYPE_EMPTY_P (TREE_TYPE (args[i].tree_value)))
+   continue;
+
  /* Pointer Bounds are never passed on the stack.  */
  if (POINTER_BOUNDS_P (args[i].tree_value))
continue;
which I'll bootstrap/regtest together with the testcase momentarily.

[Bug c++/83490] [8 Regression] ICE in find_call_stack_args, at dce.c:392

2017-12-19 Thread jakub at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83490

Jakub Jelinek  changed:

   What|Removed |Added

 CC||jakub at gcc dot gnu.org

--- Comment #5 from Jakub Jelinek  ---
I think the problem is clear:
(call_insn/u 7 4 14 2 (set (reg:QI 0 ax)
(call (mem:QI (symbol_ref:DI ("_Zlt1AS_") [flags 0x3]  ) [0 operator< S1 A8])
(const_int 0 [0]))) 690 {*call_value}
 (expr_list:REG_EH_REGION (const_int 0 [0])
(nil))
(expr_list:QI (use (mem:QI (reg/f:DI 7 sp) [0  S1 A64]))
(expr_list:QI (use (mem:QI (reg/f:DI 7 sp) [0  S1 A64]))
(nil
Note the two entries in CALL_INSN_FUNCTION_USAGE that have both size 1 and
overlap each other.  That is of course a big no no.
If the arguments are passed such that occupy no space at all, then we shouldn't
be adding C_I_F_U entries for them (but then e.g. var-tracking will be unhappy
as it won't be able to properly find other arguments) or ensure the MEMs have
zero size.  If you don't mind, I'll have a look.

[Bug c++/83490] [8 Regression] ICE in find_call_stack_args, at dce.c:392

2017-12-19 Thread mpolacek at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83490

--- Comment #4 from Marek Polacek  ---
Reproducible with just:

struct A {};
A operator<(A, A) { return A(); }
A operator>(A, A) { return A(); }

[Bug c++/83490] [8 Regression] ICE in find_call_stack_args, at dce.c:392

2017-12-19 Thread mpolacek at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83490

--- Comment #3 from Marek Polacek  ---
Uh, ignore Comment 2, I goofed on the PR # :(.  That was for PR83489.

[Bug c++/83490] [8 Regression] ICE in find_call_stack_args, at dce.c:392

2017-12-19 Thread mpolacek at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83490

--- Comment #2 from Marek Polacek  ---
Author: mpolacek
Date: Tue Dec 19 14:58:17 2017
New Revision: 255824

URL: https://gcc.gnu.org/viewcvs?rev=255824=gcc=rev
Log:
PR c++/83490
* config/i386/i386.c (init_cumulative_args): Don't check TYPE_EMPTY_P
on an error node.

* g++.dg/abi/pr83490.C: New test.

Added:
trunk/gcc/testsuite/g++.dg/abi/pr83490.C
Modified:
trunk/gcc/ChangeLog
trunk/gcc/config/i386/i386.c
trunk/gcc/testsuite/ChangeLog

[Bug c++/83490] [8 Regression] ICE in find_call_stack_args, at dce.c:392

2017-12-19 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83490

Richard Biener  changed:

   What|Removed |Added

Version|unknown |8.0
   Target Milestone|--- |8.0

[Bug c++/83490] [8 Regression] ICE in find_call_stack_args, at dce.c:392

2017-12-19 Thread mpolacek at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83490

Marek Polacek  changed:

   What|Removed |Added

 Status|UNCONFIRMED |NEW
   Last reconfirmed||2017-12-19
 Ever confirmed|0   |1

--- Comment #1 from Marek Polacek  ---
Confirmed, goes away with -fabi-version=11.

(In reply to Martin Liška from comment #0)
> ICE is somehow included here, should I take care Marek?

What do you mean by "included"?

It looks like find_call_stack_args is not prepared for arguments that aren't
passed.