* [PATCH][C] Do not expand array-refs via pointer arithmetic
@ 2011-04-14 15:01 Richard Guenther
2011-04-21 16:44 ` Joseph S. Myers
0 siblings, 1 reply; 2+ messages in thread
From: Richard Guenther @ 2011-04-14 15:01 UTC (permalink / raw)
To: gcc-patches; +Cc: Joseph S. Myers
This patch adjusts the C frontend to retain array-refs in
address-taking operations instead of expanding them via
pointer arithmetic. As seen in PR48571 we can't re-construct
array-refs in the middle-end, thus we should keep information
as specified by the source level.
For
int a[10];
int *foo (int i)
{
return &a[i];
}
int *bar (int i)
{
return &i[a];
}
this will now emit
return &a[i];
instead of
return (int *) &a + (long unsigned int) ((long unsigned int) i * 4);
which is also shorter.
Bootstrapped and tested on x86_64-unknown-linux-gnu.
Ok for trunk?
Thanks,
Richard.
2011-04-14 Richard Guenther <rguenther@suse.de>
* c-typeck.c (build_unary_op): Do not expand array-refs via
pointer arithmetic. Only adjust qualifiers for function types.
Index: gcc/c-typeck.c
===================================================================
--- gcc/c-typeck.c (revision 172319)
+++ gcc/c-typeck.c (working copy)
@@ -3737,12 +3737,6 @@ build_unary_op (location_t location,
tree op0 = TREE_OPERAND (arg, 0);
if (!c_mark_addressable (op0))
return error_mark_node;
- return build_binary_op (location, PLUS_EXPR,
- (TREE_CODE (TREE_TYPE (op0)) == ARRAY_TYPE
- ? array_to_pointer_conversion (location,
- op0)
- : op0),
- TREE_OPERAND (arg, 1), 1);
}
/* Anything not already handled and not a true memory reference
@@ -3769,10 +3763,11 @@ build_unary_op (location_t location,
argtype = TREE_TYPE (arg);
/* If the lvalue is const or volatile, merge that into the type
- to which the address will point. This should only be needed
+ to which the address will point. This is only needed
for function types. */
if ((DECL_P (arg) || REFERENCE_CLASS_P (arg))
- && (TREE_READONLY (arg) || TREE_THIS_VOLATILE (arg)))
+ && (TREE_READONLY (arg) || TREE_THIS_VOLATILE (arg))
+ && TREE_CODE (argtype) == FUNCTION_TYPE)
{
int orig_quals = TYPE_QUALS (strip_array_types (argtype));
int quals = orig_quals;
@@ -3782,9 +3777,6 @@ build_unary_op (location_t location,
if (TREE_THIS_VOLATILE (arg))
quals |= TYPE_QUAL_VOLATILE;
- gcc_assert (quals == orig_quals
- || TREE_CODE (argtype) == FUNCTION_TYPE);
-
argtype = c_build_qualified_type (argtype, quals);
}
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH][C] Do not expand array-refs via pointer arithmetic
2011-04-14 15:01 [PATCH][C] Do not expand array-refs via pointer arithmetic Richard Guenther
@ 2011-04-21 16:44 ` Joseph S. Myers
0 siblings, 0 replies; 2+ messages in thread
From: Joseph S. Myers @ 2011-04-21 16:44 UTC (permalink / raw)
To: Richard Guenther; +Cc: gcc-patches
On Thu, 14 Apr 2011, Richard Guenther wrote:
> 2011-04-14 Richard Guenther <rguenther@suse.de>
>
> * c-typeck.c (build_unary_op): Do not expand array-refs via
> pointer arithmetic. Only adjust qualifiers for function types.
OK.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-04-21 16:10 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-14 15:01 [PATCH][C] Do not expand array-refs via pointer arithmetic Richard Guenther
2011-04-21 16:44 ` Joseph S. Myers
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).