Commit 5b696ba2 by Jakub Jelinek Committed by Jakub Jelinek

re PR debug/49676 (inefficiency: DW_AT_GNU_call_site_value calculates everything << 32)

	PR debug/49676
	* dwarf2out.c (size_of_int_loc_descriptor): New function.
	(address_of_int_loc_descriptor): Use it.
	(scompare_loc_descriptor): Optimize EQ/NE comparison with
	constant.

From-SVN: r176083
parent 8662b2ba
2011-07-09 Jakub Jelinek <jakub@redhat.com>
PR debug/49676
* dwarf2out.c (size_of_int_loc_descriptor): New function.
(address_of_int_loc_descriptor): Use it.
(scompare_loc_descriptor): Optimize EQ/NE comparison with
constant.
2011-07-09 Richard Henderson <rth@redhat.com> 2011-07-09 Richard Henderson <rth@redhat.com>
* config/pdp11/pdp11.md (define_c_enum "unspecv"): New. * config/pdp11/pdp11.md (define_c_enum "unspecv"): New.
......
...@@ -10848,44 +10848,53 @@ int_loc_descriptor (HOST_WIDE_INT i) ...@@ -10848,44 +10848,53 @@ int_loc_descriptor (HOST_WIDE_INT i)
return new_loc_descr (op, i, 0); return new_loc_descr (op, i, 0);
} }
/* Return loc description representing "address" of integer value. /* Return size_of_locs (int_loc_descriptor (i)) without
This can appear only as toplevel expression. */ actually allocating it. */
static dw_loc_descr_ref static unsigned long
address_of_int_loc_descriptor (int size, HOST_WIDE_INT i) size_of_int_loc_descriptor (HOST_WIDE_INT i)
{ {
int litsize;
dw_loc_descr_ref loc_result = NULL;
if (!(dwarf_version >= 4 || !dwarf_strict))
return NULL;
if (i >= 0) if (i >= 0)
{ {
if (i <= 31) if (i <= 31)
litsize = 1; return 1;
else if (i <= 0xff) else if (i <= 0xff)
litsize = 2; return 2;
else if (i <= 0xffff) else if (i <= 0xffff)
litsize = 3; return 3;
else if (HOST_BITS_PER_WIDE_INT == 32 else if (HOST_BITS_PER_WIDE_INT == 32
|| i <= 0xffffffff) || i <= 0xffffffff)
litsize = 5; return 5;
else else
litsize = 1 + size_of_uleb128 ((unsigned HOST_WIDE_INT) i); return 1 + size_of_uleb128 ((unsigned HOST_WIDE_INT) i);
} }
else else
{ {
if (i >= -0x80) if (i >= -0x80)
litsize = 2; return 2;
else if (i >= -0x8000) else if (i >= -0x8000)
litsize = 3; return 3;
else if (HOST_BITS_PER_WIDE_INT == 32 else if (HOST_BITS_PER_WIDE_INT == 32
|| i >= -0x80000000) || i >= -0x80000000)
litsize = 5; return 5;
else else
litsize = 1 + size_of_sleb128 (i); return 1 + size_of_sleb128 (i);
} }
}
/* Return loc description representing "address" of integer value.
This can appear only as toplevel expression. */
static dw_loc_descr_ref
address_of_int_loc_descriptor (int size, HOST_WIDE_INT i)
{
int litsize;
dw_loc_descr_ref loc_result = NULL;
if (!(dwarf_version >= 4 || !dwarf_strict))
return NULL;
litsize = size_of_int_loc_descriptor (i);
/* Determine if DW_OP_stack_value or DW_OP_implicit_value /* Determine if DW_OP_stack_value or DW_OP_implicit_value
is more compact. For DW_OP_stack_value we need: is more compact. For DW_OP_stack_value we need:
litsize + 1 (DW_OP_stack_value) litsize + 1 (DW_OP_stack_value)
...@@ -11284,6 +11293,28 @@ scompare_loc_descriptor (enum dwarf_location_atom op, rtx rtl, ...@@ -11284,6 +11293,28 @@ scompare_loc_descriptor (enum dwarf_location_atom op, rtx rtl,
&& (unsigned HOST_WIDE_INT) INTVAL (XEXP (rtl, 1)) && (unsigned HOST_WIDE_INT) INTVAL (XEXP (rtl, 1))
== (INTVAL (XEXP (rtl, 1)) & GET_MODE_MASK (op_mode))))) == (INTVAL (XEXP (rtl, 1)) & GET_MODE_MASK (op_mode)))))
return compare_loc_descriptor (op, op0, op1); return compare_loc_descriptor (op, op0, op1);
/* EQ/NE comparison against constant in narrower type than
DWARF2_ADDR_SIZE can be performed either as
DW_OP_const1u <shift> DW_OP_shl DW_OP_const* <cst << shift>
DW_OP_{eq,ne}
or
DW_OP_const*u <mode_mask> DW_OP_and DW_OP_const* <cst & mode_mask>
DW_OP_{eq,ne}. Pick whatever is shorter. */
if (CONST_INT_P (XEXP (rtl, 1))
&& GET_MODE_BITSIZE (op_mode) < HOST_BITS_PER_WIDE_INT
&& (size_of_int_loc_descriptor (shift) + 1
+ size_of_int_loc_descriptor (INTVAL (XEXP (rtl, 1)) << shift)
>= size_of_int_loc_descriptor (GET_MODE_MASK (op_mode)) + 1
+ size_of_int_loc_descriptor (INTVAL (XEXP (rtl, 1))
& GET_MODE_MASK (op_mode))))
{
add_loc_descr (&op0, int_loc_descriptor (GET_MODE_MASK (op_mode)));
add_loc_descr (&op0, new_loc_descr (DW_OP_and, 0, 0));
op1 = int_loc_descriptor (INTVAL (XEXP (rtl, 1))
& GET_MODE_MASK (op_mode));
return compare_loc_descriptor (op, op0, op1);
}
} }
add_loc_descr (&op0, int_loc_descriptor (shift)); add_loc_descr (&op0, int_loc_descriptor (shift));
add_loc_descr (&op0, new_loc_descr (DW_OP_shl, 0, 0)); add_loc_descr (&op0, new_loc_descr (DW_OP_shl, 0, 0));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment