[Committed] S/390: Add umulditi pattern
Hi, this patch adds support for the 64x64-128 bit unsigned multiplication to the s390 backend. We always the instruction but for some reason forgot to add a pattern :( Thanks to Torbjorn Granlund for the pointer! Committed to mainline after testing on s390 and s390x. Bye, -Andreas- 2011-10-07 Andreas Krebbel andreas.kreb...@de.ibm.com * config/s390/s390.md (DWH, dwh): New mode macros. (umulsidi3): Extend to support umulditi3 as well. Index: gcc/config/s390/s390.md === *** gcc/config/s390/s390.md.orig --- gcc/config/s390/s390.md *** *** 367,372 --- 367,376 (define_mode_iterator DW [(TI TARGET_ZARCH) (DI !TARGET_ZARCH)]) (define_mode_iterator W [(DI TARGET_ZARCH) (SI !TARGET_ZARCH)]) + ;; Used by the umul pattern to express modes having half the size. + (define_mode_attr DWH [(TI DI) (DI SI)]) + (define_mode_attr dwh [(TI di) (DI si)]) + ;; This mode iterator allows the QI and HI patterns to be defined from ;; the same template. (define_mode_iterator HQI [HI QI]) *** *** 5456,5476 (set_attr cpu_facility *,*,z10)]) ; ! ; umulsidi3 instruction pattern(s). ; ! (define_insn umulsidi3 ! [(set (match_operand:DI 0 register_operand =d,d) ! (mult:DI (zero_extend:DI ! (match_operand:SI 1 register_operand %0,0)) ! (zero_extend:DI ! (match_operand:SI 2 nonimmediate_operand d,RT] ! !TARGET_ZARCH TARGET_CPU_ZARCH @ !mlr\t%0,%2 !ml\t%0,%2 [(set_attr op_type RRE,RXY) !(set_attr type imulsi)]) ; ; mul(tf|df|sf|td|dd)3 instruction pattern(s). --- 5460,5481 (set_attr cpu_facility *,*,z10)]) ; ! ; umul instruction pattern(s). ; ! ; mlr, ml, mlgr, mlg ! (define_insn umuldwhmode3 ! [(set (match_operand:DW 0 register_operand =d, d) ! (mult:DW (zero_extend:DW ! (match_operand:DWH 1 register_operand %0, 0)) ! (zero_extend:DW ! (match_operand:DWH 2 nonimmediate_operand d,RT] ! TARGET_CPU_ZARCH @ !mltgr\t%0,%2 !mltg\t%0,%2 [(set_attr op_type RRE,RXY) !(set_attr type imuldwh)]) ; ; mul(tf|df|sf|td|dd)3 instruction pattern(s).
Re: PATCH: PR target/50603: [x32] Unnecessary lea
On Thu, Oct 6, 2011 at 11:33 PM, H.J. Lu hjl.to...@gmail.com wrote: OTOH, x86_64 and i686 targets can also benefit from this change. If combine can't create more complex address (covered by lea), then it will simply propagate memory operand back into the add insn. It looks to me that we can't loose here, so: /* Improve address combine. */ if (code == PLUS MEM_P (src2)) src2 = force_reg (mode, src2); Any opinions? It doesn't work with 64bit libstdc++: Yeah, yeah. ix86_output_mi_thunk has some ... issues. Please try attached patch that introduces ix86_emit_binop and uses it in a bunch of places. I tried it on GCC. There are no regressions. The bugs are fixed for x32. Here are size comparison with GCC runtime libraries on ia32, x32 and x86-64: 884093 18600 27064 929757 e2fdd old libstdc++.so 884189 18600 27064 929853 e303d new libs/libstdc++.so The new code is mov 0xc(%edi),%eax mov %eax,0x8(%esi) mov -0xc(%eax),%eax mov 0x10(%edi),%edx lea 0x8(%esi,%eax,1),%eax The old one is mov 0xc(%edi),%edx lea 0x8(%esi),%eax mov %edx,0x8(%esi) add -0xc(%edx),%eax mov 0x10(%edi),%edx The new code merged lea+add into one lea, so it looks quite OK to me. Do you have some performance numbers? I will report performance numbers in a few days. The differences in SPEC CPU 2006 on ia32, x86-64 and x32 are within noise range. Great. Attached is a slightly updated patch, where we consider only integer-mode PLUS RTXes. 2011-10-07 Uros Bizjak ubiz...@gmail.com H.J. Lu hongjiu...@intel.com PR target/50603 * config/i386/i386.c (ix86_fixup_binary_operands): Force src2 of integer PLUS RTX to a register to improve address combine. testsuite/ChangeLog: 2011-10-07 Uros Bizjak ubiz...@gmail.com H.J. Lu hongjiu...@intel.com PR target/50603 * gcc.target/i386/pr50603.c: New test. Tested on x86_64-pc-linux-gnu {,-m32}, committed to mainline SVN. Uros. Index: config/i386/i386.c === --- config/i386/i386.c (revision 179645) +++ config/i386/i386.c (working copy) @@ -15798,6 +15798,12 @@ ix86_fixup_binary_operands (enum rtx_code code, en if (MEM_P (src1) !rtx_equal_p (dst, src1)) src1 = force_reg (mode, src1); + /* Improve address combine. */ + if (code == PLUS + GET_MODE_CLASS (mode) == MODE_INT + MEM_P (src2)) +src2 = force_reg (mode, src2); + operands[1] = src1; operands[2] = src2; return dst; Index: testsuite/gcc.target/i386/pr50603.c === --- testsuite/gcc.target/i386/pr50603.c (revision 0) +++ testsuite/gcc.target/i386/pr50603.c (revision 0) @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options -O2 } */ + +extern int *foo; + +int +bar (int x) +{ + return foo[x]; +} +/* { dg-final { scan-assembler-not lea\[lq\] } } */
Re: [Patch, fortran] PR47844 - Array stride ignored for pointer-valued function results
Dear Steve, Thanks - I just noticed that the { dg-do run } is missing a space. It seemed to run correctly during regtesting but I will set it right anyway. Cheers Paul On Fri, Oct 7, 2011 at 1:29 AM, Steve Kargl s...@troutmask.apl.washington.edu wrote: On Thu, Oct 06, 2011 at 10:22:12PM +0200, Paul Richard Thomas wrote: 2011-10-06 Paul Thomas pa...@gcc.gnu.org PR fortran/47844 * trans-array.c (gfc_conv_array_index_offset): Use descriptor stride for pointer function results. 2011-10-06 Paul Thomas pa...@gcc.gnu.org PR fortran/47844 * gfortran.dg/pointer_function_result_1.f90 : New test. OK. -- Steve -- The knack of flying is learning how to throw yourself at the ground and miss. --Hitchhikers Guide to the Galaxy
Re: [RFC] split2 vs df
On 10/07/2011 12:15 AM, Richard Henderson wrote: diff --git a/gcc/recog.c b/gcc/recog.c index d3ecb73..e0557c5 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -3769,20 +3769,33 @@ struct rtl_opt_pass pass_split_all_insns = static unsigned int rest_of_handle_split_after_reload (void) { - /* If optimizing, then go ahead and split insns now. */ -#ifndef STACK_REGS - if (optimize 0) -#endif -split_all_insns (); + df_live_add_problem (); + df_set_flags (DF_DEFER_INSN_RESCAN); + + split_all_insns (); + df_analyze (); + return 0; } Setting TODO_df_finish (and perhaps TODO_df_verify) should be enough. The idea is: df_finish_pass calls df_process_deferred_rescans - calls df_bb_refs_record and df_insn_rescan - calls df_set_bb_dirty - sets df_lr-out_of_date_transfer_functions and this in turn skips the verification when that would fail. Paolo
Re: New warning for expanded vector operations
On Fri, Oct 7, 2011 at 6:22 AM, Artem Shinkarov artyom.shinkar...@gmail.com wrote: On Wed, Oct 5, 2011 at 12:35 PM, Richard Guenther richard.guent...@gmail.com wrote: On Wed, Oct 5, 2011 at 1:28 PM, Artem Shinkarov artyom.shinkar...@gmail.com wrote: On Wed, Oct 5, 2011 at 9:40 AM, Richard Guenther richard.guent...@gmail.com wrote: On Wed, Oct 5, 2011 at 12:18 AM, Artem Shinkarov artyom.shinkar...@gmail.com wrote: Hi Here is a patch to inform a programmer about the expanded vector operation. Bootstrapped on x86-unknown-linux-gnu. ChangeLog: * gcc/tree-vect-generic.c (expand_vector_piecewise): Adjust to produce the warning. (expand_vector_parallel): Adjust to produce the warning. Entries start without gcc/, they are relative to the gcc/ChangeLog file. Sure, sorry. (lower_vec_shuffle): Adjust to produce the warning. * gcc/common.opt: New warning Wvector-operation-expanded. * gcc/doc/invoke.texi: Document the wawning. Ok? I don't like the name -Wvector-operation-expanded. We emit a similar warning for missed inline expansions with -Winline, so maybe -Wvector-extensions (that's the name that appears in the C extension documentation). Hm, I don't care much about the name, unless it gets clear what the warning is used for. I am not really sure that Wvector-extensions makes it clear. Also, I don't see anything bad if the warning will pop up during the vectorisation. Any vector operation performed outside the SIMD accelerator looks suspicious, because it actually doesn't improve performance. Such a warning during the vectorisation could mean that a programmer forgot some flag, or the constant propagation failed to deliver a constant, or something else. Conceptually the text I am producing is not really a warning, it is more like an information, but I am not aware of the mechanisms that would allow me to introduce a flag triggering inform () or something similar. What I think we really need to avoid is including this warning in the standard Ox. + location_t loc = gimple_location (gsi_stmt (*gsi)); + + warning_at (loc, OPT_Wvector_operation_expanded, + vector operation will be expanded piecewise); v = VEC_alloc(constructor_elt, gc, (nunits + delta - 1) / delta); for (i = 0; i nunits; @@ -260,6 +264,10 @@ expand_vector_parallel (gimple_stmt_iter tree result, compute_type; enum machine_mode mode; int n_words = tree_low_cst (TYPE_SIZE_UNIT (type), 1) / UNITS_PER_WORD; + location_t loc = gimple_location (gsi_stmt (*gsi)); + + warning_at (loc, OPT_Wvector_operation_expanded, + vector operation will be expanded in parallel); what's the difference between 'piecewise' and 'in parallel'? Parallel is a little bit better for performance than piecewise. I see. That difference should probably be documented, maybe with an example. Richard. @@ -301,16 +309,15 @@ expand_vector_addition (gimple_stmt_iter { int parts_per_word = UNITS_PER_WORD / tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (type)), 1); + location_t loc = gimple_location (gsi_stmt (*gsi)); if (INTEGRAL_TYPE_P (TREE_TYPE (type)) parts_per_word = 4 TYPE_VECTOR_SUBPARTS (type) = 4) - return expand_vector_parallel (gsi, f_parallel, - type, a, b, code); + return expand_vector_parallel (gsi, f_parallel, type, a, b, code); else - return expand_vector_piecewise (gsi, f, - type, TREE_TYPE (type), - a, b, code); + return expand_vector_piecewise (gsi, f, type, + TREE_TYPE (type), a, b, code); } /* Check if vector VEC consists of all the equal elements and unless i miss something loc is unused here. Please avoid random whitespace changes (just review your patch yourself before posting and revert pieces that do nothing). Yes you are right, sorry. +@item -Wvector-operation-expanded +@opindex Wvector-operation-expanded +@opindex Wno-vector-operation-expanded +Warn if vector operation is not implemented via SIMD capabilities of the +architecture. Mainly useful for the performance tuning. I'd mention that this is for vector operations as of the C extension documented in Vector Extensions. The vectorizer can produce some operations that will need further lowering - we probably should make sure to _not_ warn about those. Try running the vect.exp testsuite with the new warning turned on (eventually disabling SSE), like with obj/gcc make check-gcc RUNTESTFLAGS=--target_board=unix/-Wvector-extensions/-mno-sse vect.exp Again, see the comment above. I think, if the warning can be triggered only manually, then we are fine. But I'll check anyway how many warnings I'll get from vect.exp. P.S. It is hard to write a reasonable testcase for the patch, because one needs to guess which
Re: [C++ Patch] PR 38980
Instead of adding the parameter, let's have the C++ front end call a different function that doesn't try to pull out the value from aggregate variables, like C has decl_constant_value_for_optimization. Jason
Re: [PATCH] Fix PR46556 (poor address generation)
On Thu, 6 Oct 2011, William J. Schmidt wrote: On Thu, 2011-10-06 at 16:16 +0200, Richard Guenther wrote: snip Doh, I thought you were matching gimple stmts that do the address computation. But now I see you are matching the tree returned from get_inner_reference. So no need to check anything for that case. But that keeps me wondering what you'll do if the accesses were all pointer arithmetic, not arrays. Thus, extern void foo (int, int, int); void f (int *p, unsigned int n) { foo (p[n], p[n+64], p[n+128]); } wouldn't that have the same issue and you wouldn't handle it? Richard. Good point. This indeed gets missed here, and that's more fuel for doing a generalized strength reduction along with the special cases like p-a[n] that are only exposed with get_inner_reference. (The pointer arithmetic cases were picked up in my earlier big-hammer approach using the aff-comb machinery, but that had too many problems in the end, as you know.) Yeah, I know. It's a very tricky area ;) So for the long term I will look into a full strength reducer for non-loop code. For the short term, what do you think about keeping this single transformation in reassoc to make sure it gets into 4.7? I would plan to strip it back out and fold it into the strength reducer thereafter, which might or might not make 4.7 depending on my other responsibilities and how the 4.7 schedule goes. I haven't seen anything official, but I'm guessing we're getting towards the end of 4.7 stage 1? It's a reasonable plan - you'd have to introduce a late reassoc pass though. Can you separate out the RTL fwprop changes? So we can iterate over the tree parts separately. Thanks, Richard.
Re: [PATCH] Fix PR46556 (poor address generation)
On Thu, 6 Oct 2011, Jeff Law wrote: -BEGIN PGP SIGNED MESSAGE- Hash: SHA1 On 10/06/11 04:13, Richard Guenther wrote: People have already commented on pieces, so I'm looking only at the tree-ssa-reassoc.c pieces (did you consider piggy-backing on IVOPTs instead? The idea is to expose additional CSE opportunities, right? So it's sort-of a strength-reduction optimization on scalar code (classically strength reduction in loops transforms for (i) { z = i*x; } to z = 0; for (i) { z += x }). That might be worth in general, even for non-address cases. So - if you rename that thing to tree-ssa-strength-reduce.c you can get away without piggy-backing on anything ;) If you structure it to detect a strength reduction opportunity (thus, you'd need to match two/multiple of the patterns at the same time) that would be a bonus ... generalizing it a little bit would be another. There's a variety of literature that uses PRE to detect and optimize straightline code strength reduction. I poked at it at one time (RTL gcse framework) and it looked reasonably promising. Never pushed it all the way through. I poked at it in the tree PRE framework at some point but never pushed it through either. At least it didn't feel like it fits PRE (and PRE should also be able to handle the loop case). Richard.
[PATCH] Fix PR50637
Committed. Richard. 2011-10-07 Richard Guenther rguent...@suse.de PR testsuite/50637 * gcc.dg/vect/vect-align-2.c: Increase array size. Index: gcc/testsuite/gcc.dg/vect/vect-align-2.c === --- gcc/testsuite/gcc.dg/vect/vect-align-2.c(revision 179647) +++ gcc/testsuite/gcc.dg/vect/vect-align-2.c(working copy) @@ -15,7 +15,7 @@ struct foo { } __attribute__ ((packed)); struct foo f2; -int z[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; +int z[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; __attribute__ ((noinline)) void fbar(struct foo *fp)
Re: [testsuite] Don't XFAIL gcc.dg/uninit-B.c etc. (PR middle-end/50125)
On Thu, Oct 6, 2011 at 5:57 PM, Rainer Orth r...@cebitec.uni-bielefeld.de wrote: After almost two months, two tests are still XPASSing everywhere: XPASS: gcc.dg/uninit-B.c uninit i warning (test for warnings, line 12) XPASS: gcc.dg/uninit-pr19430.c (test for warnings, line 32) XPASS: gcc.dg/uninit-pr19430.c uninitialized (test for warnings, line 41) I think it's time to remove the xfail's. Tested with the appropriate runtest invocation on i386-pc-solaris2.10, ok for mainline? Ok Thanks, Richard. Rainer 2011-10-06 Rainer Orth r...@cebitec.uni-bielefeld.de PR middle-end/50125 * gcc.dg/uninit-B.c (baz): Remove xfail *-*-*. * gcc.dg/uninit-pr19430.c (main): Remove xfail *-*-*. (bar3): Likewise. -- - Rainer Orth, Center for Biotechnology, Bielefeld University
Re: Builtin infrastructure change
On Fri, Oct 7, 2011 at 12:49 AM, Michael Meissner meiss...@linux.vnet.ibm.com wrote: On Thu, Oct 06, 2011 at 10:44:03AM -0400, Michael Meissner wrote: On Thu, Oct 06, 2011 at 03:23:07PM +0200, Tobias Burnus wrote: On 10/06/2011 03:02 PM, Michael Meissner wrote: On the x86 (with Fedora 13), I built and tested the C, C++, Objective C, Java, Ada, and Go languages with no regressions On a power6 box with RHEL 6.1, I have done the same for C, C++, Objective C, Java, and Ada languages with no regressions. Any reason for not building and testing Fortran? Especially as you patch gcc/fortran/{trans*.c,f95-lang.c}? Tobias Brain fault on my part. I tested the previous set of patches with Fortran. Since I had to explicitly add the languages to pick up Ada and Go, I seemed to have dropped Fortran. Sigh. Sorry about that. I just started the powerpc bootstrap, since that is a lot faster. I'm enclosing the revised patches that now provides the Fortran fixes as well. It passes bootstrap and make check on powerpc64-linux based on subversion id 179514. The current top of the tree doesn't bootstrap on x86 if I build go due to an issue with shrinkwrapping and split stack. Ok. Thanks, Richard.
Re: [PATCH] Fix PR46556 (poor address generation)
On 10/07/2011 10:00 AM, Richard Guenther wrote: It's a reasonable plan - you'd have to introduce a late reassoc pass though. Can you separate out the RTL fwprop changes? So we can iterate over the tree parts separately. That's indeed better, also because they became CSE changes. Paolo
Re: [Patch] Support DEC-C extensions
On Oct 6, 2011, at 4:12 PM, Joseph S. Myers wrote: On Thu, 6 Oct 2011, Tristan Gingold wrote: So the consensus is for a dedicated option. Which one do you prefer ? -funnamed-variadic-parameter -fpointless-variadic-functions -fallow-parameterless-variadic-functions I prefer -fallow-parameterless-variadic-functions. Here is my patch with the option renamed. Ok for trunk ? Bootstrapped on x86_64/Darwin, va-arg retested. Tristan. 2011-09-29 Tristan Gingold ging...@adacore.com * doc/invoke.texi: Document -fallow-parameterless-variadic-functions. * c-parser.c (c_parser_parms_list_declarator): Handle it. gcc/c-family/ChangeLog 2011-09-29 Tristan Gingold ging...@adacore.com * c.opt (fallow-parameterless-variadic-functions): New. gcc/testsuite/ChangeLog 2011-09-29 Tristan Gingold ging...@adacore.com * gcc.dg/va-arg-4.c: New test. * gcc.dg/va-arg-5.c: Ditto. diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index e6ac5dc..79287c4 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -700,6 +700,10 @@ Enforce class member access control semantics fall-virtual C++ ObjC++ Ignore Warn(switch %qs is no longer supported) +fallow-parameterless-variadic-functions +C ObjC Var(flag_allow_parameterless_variadic_functions) +Allow variadic functions without named parameter + falt-external-templates C++ ObjC++ Ignore Warn(switch %qs is no longer supported) No longer supported diff --git a/gcc/c-parser.c b/gcc/c-parser.c index ff376df..0ca0f04 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -3159,10 +3159,19 @@ c_parser_parms_list_declarator (c_parser *parser, tree attrs, tree expr) if (c_parser_next_token_is (parser, CPP_ELLIPSIS)) { struct c_arg_info *ret = build_arg_info (); - /* Suppress -Wold-style-definition for this case. */ - ret-types = error_mark_node; - error_at (c_parser_peek_token (parser)-location, - ISO C requires a named argument before %...%); + + if (flag_allow_parameterless_variadic_functions) +{ + /* F (...) is allowed. */ + ret-types = NULL_TREE; +} + else +{ + /* Suppress -Wold-style-definition for this case. */ + ret-types = error_mark_node; + error_at (c_parser_peek_token (parser)-location, +ISO C requires a named argument before %...%); +} c_parser_consume_token (parser); if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN)) { diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index e166964..d42af1d 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -170,7 +170,7 @@ in the following sections. @item C Language Options @xref{C Dialect Options,,Options Controlling C Dialect}. @gccoptlist{-ansi -std=@var{standard} -fgnu89-inline @gol --aux-info @var{filename} @gol +-aux-info @var{filename} -fallow-parameterless-variadic-functions @gol -fno-asm -fno-builtin -fno-builtin-@var{function} @gol -fhosted -ffreestanding -fopenmp -fms-extensions -fplan9-extensions @gol -trigraphs -no-integrated-cpp -traditional -traditional-cpp @gol @@ -1618,6 +1618,13 @@ character). In the case of function definitions, a KR-style list of arguments followed by their declarations is also provided, inside comments, after the declaration. +@item -fallow-parameterless-variadic-functions +Accept variadic functions without named parameters. + +Although it is possible to define such a function, this is not very +usefull as it is not possible to read the arguments. This is only +supported for C as this construct is allowed by C++. + @item -fno-asm @opindex fno-asm Do not recognize @code{asm}, @code{inline} or @code{typeof} as a diff --git a/gcc/testsuite/gcc.dg/va-arg-4.c b/gcc/testsuite/gcc.dg/va-arg-4.c new file mode 100644 index 000..6d737c4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/va-arg-4.c @@ -0,0 +1,3 @@ +/* { dg-do compile } */ +#include stdarg.h +extern void baz(...); /* { dg-error requires a named argument } */ diff --git a/gcc/testsuite/gcc.dg/va-arg-5.c b/gcc/testsuite/gcc.dg/va-arg-5.c new file mode 100644 index 000..a00616e --- /dev/null +++ b/gcc/testsuite/gcc.dg/va-arg-5.c @@ -0,0 +1,4 @@ +/* { dg-do compile } */ +/* { dg-options -fallow-parameterless-variadic-functions } */ +#include stdarg.h +extern void baz(...);
Re: [Patch, Fortran, committed] PR 50585: [4.6/4.7 Regression] ICE with assumed length character array argument
Hi Janus, I completely missed that this patch is still pending review as you wrote committed. However, it only applied to the ICE and not to the documentation and backporting. On 10/01/2011 02:00 PM, Janus Weil wrote: I have just committed as obvious a one-line patch to fix a regression which is triggered by -fwhole-file: http://gcc.gnu.org/viewcvs?root=gccview=revrev=179413 Should I backport to 4.6? And also to 4.5? Yes, please backport to 4.6. If you want, you can also backport to 4.5. However, I do not think that -fwhole-file gets used in 4.5 - especially, as it has some issues. Moreover, I noticed that http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gfortran/Code-Gen-Options.html#Code-Gen-Options falsely claims that -fwhole-file is not used by default (which it is since 4.6, see http://gcc.gnu.org/gcc-4.6/changes.html). Attached is a small documentation patch to fix this. Ok to apply to trunk and 4.6? OK. By the way, I was thinking of completely removing that option. -fwhole-file avoids some wrong-code issues, generates faster code, and improves diagnostic. Thus, there is no real reason* of keeping -fno-whole-file. Thus, I would like to deprecate the option. (* = one reason is to see whether a bug is due to this flag, but that does not really help with fixing the issue.) I think your wording is fine, I still wonder whether one should somehow imply more clearly that -fno-whole-file is not recommended and that the whole flag is deprecated. Tobias PS: I think except for procedure calls where the explicit interface is not known, gfortran generates finally the correct declaration for the middle end. At least I have not encountered any multiple-declaration issues for a long time!
RFA: Compare Elimination Pass: Fix use of dataflow info
Hi Richard, Hi Paulo, Following Paulo's suggestion, here is a patch to remove the calls to df_analyze from the compare-elimination pass, and to use df_get_live_[in/out]. I can confirm that with this patch applied PR 49801 is fixed. OK to apply ? For mainline and the 4.6 branch ? Cheers Nick gcc/ChangeLog 2011-10-07 Nick Clifton ni...@redhat.com PR middle-end/49801 * compare-elim.c (find_comparisons_in_bb): Use df_get_live_in and df_get_live_out instead of accessing the bitmaps directly. (execute_compare_elim_after_reload): Remove calls to df_set_flags, df_live_add_problem and df_analyze. Index: gcc/compare-elim.c === --- gcc/compare-elim.c (revision 179647) +++ gcc/compare-elim.c (working copy) @@ -356,7 +356,7 @@ /* Look to see if the flags register is live outgoing here, and incoming to any successor not part of the extended basic block. */ - if (bitmap_bit_p (DF_LIVE_BB_INFO (bb)-out, targetm.flags_regnum)) + if (bitmap_bit_p (df_get_live_out (bb), targetm.flags_regnum)) { edge e; edge_iterator ei; @@ -364,7 +364,7 @@ FOR_EACH_EDGE (e, ei, bb-succs) { basic_block dest = e-dest; - if (bitmap_bit_p (DF_LIVE_BB_INFO (dest)-in, + if (bitmap_bit_p (df_get_live_in (bb), targetm.flags_regnum) !single_pred_p (dest)) { @@ -580,10 +580,6 @@ static unsigned int execute_compare_elim_after_reload (void) { - df_set_flags (DF_DEFER_INSN_RESCAN); - df_live_add_problem (); - df_analyze (); - gcc_checking_assert (all_compares == NULL); /* Locate all comparisons and their uses, and eliminate duplicates. */ @@ -602,8 +598,6 @@ VEC_free (comparison_struct_p, heap, all_compares); all_compares = NULL; - - df_analyze (); } return 0;
[Patch, Fortran, OOP] PR 50625: [4.6/4.7 Regression] ALLOCATABLE attribute lost for module CLASS variables
Hi all, here is a small patch for an OOP regression. The title of the PR is a bit misleading, since it's actually not the ALLOCATABLE attribute which gets lost, but the 'class_ok' attribute, which we use for checking if a class declaration is valid. When reading class variables from a module, we can just set this attribute to '1' (if there was an error, it would have been caught earlier). Moreover there was a slight problem with backend_decl's not being present for class symbols, which is being fixed by the hunk in trans-decl.c. Regtested successfully on x86_64-unknown-linux-gnu (except for failure on entry_4 and select_type_12, which are known middle-end regressions). Ok for trunk and 4.6? Cheers, Janus 2011-10-07 Janus Weil ja...@gcc.gnu.org PR fortran/50625 * class.c (gfc_build_class_symbol): Fix whitespace. * module.c (mio_symbol): Set 'class_ok' attribute. * trans-decl.c (gfc_get_symbol_decl): Make sure the backend_decl has been built for class symbols. 2011-10-07 Janus Weil ja...@gcc.gnu.org PR fortran/50625 * gfortran.dg/class_46.f03: New. Index: gcc/fortran/class.c === --- gcc/fortran/class.c (revision 179647) +++ gcc/fortran/class.c (working copy) @@ -188,7 +188,7 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_a /* Class container has already been built. */ return SUCCESS; - attr-class_ok = attr-dummy || attr-pointer || attr-allocatable; + attr-class_ok = attr-dummy || attr-pointer || attr-allocatable; if (!attr-class_ok) /* We can not build the class container yet. */ Index: gcc/fortran/module.c === --- gcc/fortran/module.c (revision 179647) +++ gcc/fortran/module.c (working copy) @@ -3608,6 +3608,8 @@ mio_symbol (gfc_symbol *sym) mio_symbol_attribute (sym-attr); mio_typespec (sym-ts); + if (sym-ts.type == BT_CLASS) +sym-attr.class_ok = 1; if (iomode == IO_OUTPUT) mio_namespace_ref (sym-formal_ns); Index: gcc/fortran/trans-decl.c === --- gcc/fortran/trans-decl.c (revision 179647) +++ gcc/fortran/trans-decl.c (working copy) @@ -1179,7 +1179,10 @@ gfc_get_symbol_decl (gfc_symbol * sym) { gfc_component *c = CLASS_DATA (sym); if (!c-ts.u.derived-backend_decl) - gfc_find_derived_vtab (c-ts.u.derived); + { + gfc_find_derived_vtab (c-ts.u.derived); + gfc_get_derived_type (sym-ts.u.derived); + } } /* All deferred character length procedures need to retain the backend class_46.f03 Description: Binary data
Re: RFA: Compare Elimination Pass: Fix use of dataflow info
On 10/07/2011 12:06 PM, Nick Clifton wrote: - df_analyze (); - gcc_checking_assert (all_compares == NULL); Ok except that this particular df_analyze should stay. If it doesn't fix the bug, please try the parts of rth's patch that add the gate and the TODO_df_finish flag. Paolo
Re: [Patch, Fortran, OOP] PR 50625: [4.6/4.7 Regression] ALLOCATABLE attribute lost for module CLASS variables
On 10/07/2011 12:18 PM, Janus Weil wrote: Regtested successfully on x86_64-unknown-linux-gnu (except for failure on entry_4 and select_type_12, which are known middle-end regressions). Ok for trunk and 4.6? OK. Thanks for the patch - and for telling me that select_type_12 is a middle end regression (PR 50640); I already wondered why my being worked-on patch showed all of a sudden that failure. (I had self-caused select type failures before; thus, I didn't think of a ME problem.) Tobias 2011-10-07 Janus Weilja...@gcc.gnu.org PR fortran/50625 * class.c (gfc_build_class_symbol): Fix whitespace. * module.c (mio_symbol): Set 'class_ok' attribute. * trans-decl.c (gfc_get_symbol_decl): Make sure the backend_decl has been built for class symbols. 2011-10-07 Janus Weilja...@gcc.gnu.org PR fortran/50625 * gfortran.dg/class_46.f03: New.
[patch] Fix PR lto/50492
Hi, this is another LTO bootstrap failure with Ada enabled. There are 2 problems: 1. dwarf2out.c thinks that it is processing pure C++ code for gnat1 so it is invoking some C++-specific code paths that aren't compatible with Ada. Fixed by building TRANSLATION_UNIT_DECL nodes in Ada as well. 2. the recent change: * gimple.c (canonicalize_cond_expr_cond): Handle cast from boolean-type. breaks cross-language inlining. More specifically, it removes a necessary cast between an Ada boolean type and a C boolean type (hence a GIMPLE verification failure later) when __gnat_is_absolute_path is inlined into Is_Absolute_Path: extern int __gnat_is_absolute_path (char *, int); function Is_Absolute_Path (Name : String) return Boolean is function Is_Absolute_Path (Name : Address; Length : Integer) return Integer; pragma Import (C, Is_Absolute_Path, __gnat_is_absolute_path); begin return Is_Absolute_Path (Name'Address, Name'Length) /= 0; end Is_Absolute_Path; We start with: Ada_Boolean_Var = (Integer_Var != 0); and forwprop figures out that (Integer_Var != 0) is equivalent to iftmp.xxx. In combine_cond_expr_cond, the constant folder correctly turns this into: Ada_Boolean_Var = (Ada_Boolean_Type) iftmp.xxx; but the call to canonicalize_cond_expr_cond wrongly removes the cast. Note that changing Ada's boolean_type_node to a C-compatible type doesn't fix the problem as the boolean return type of Is_Absolute_Path has to be an Ada boolean type in any case, so a cast will be always necessary here. Since reverting the canonicalize_cond_expr_cond change apparently has no effect (no regressions detected on x86 and x86-64), the proposed fix is just that. Bootstrapped/regtested on x86_64-suse-linux, OK for mainline? 2011-10-07 Eric Botcazou ebotca...@adacore.com PR lto/50492 * gimple.c (canonicalize_cond_expr_cond): Revert 2011-08-02 change. ada/ * gcc-interface/gigi.h (gnat_pushdecl): Adjust comment. * gcc-interface/utils.c (global_context): New variable. (gnat_pushdecl): Initialize it and set it as the DECL_CONTEXT of DECLs that are either public external or at top level. Use No macro. (end_subprog_body): Call decl_function_context. (rest_of_subprog_body_compilation): Likewise. -- Eric Botcazou Index: ada/gcc-interface/utils.c === --- ada/gcc-interface/utils.c (revision 179488) +++ ada/gcc-interface/utils.c (working copy) @@ -200,6 +200,9 @@ static GTY(()) struct gnat_binding_level /* A chain of gnat_binding_level structures awaiting reuse. */ static GTY((deletable)) struct gnat_binding_level *free_binding_level; +/* The context to be used for global declarations. */ +static GTY(()) tree global_context; + /* An array of global declarations. */ static GTY(()) VEC(tree,gc) *global_decls; @@ -497,15 +500,19 @@ gnat_zaplevel (void) free_binding_level = level; } -/* Records a ..._DECL node DECL as belonging to the current lexical scope - and uses GNAT_NODE for location information and propagating flags. */ +/* Record DECL as belonging to the current lexical scope and use GNAT_NODE + for location information and flag propagation. */ void gnat_pushdecl (tree decl, Node_Id gnat_node) { - /* If this decl is public external or at toplevel, there is no context. */ + /* If DECL is public external or at top level, it has global context. */ if ((TREE_PUBLIC (decl) DECL_EXTERNAL (decl)) || global_bindings_p ()) -DECL_CONTEXT (decl) = 0; +{ + if (!global_context) + global_context = build_translation_unit_decl (NULL_TREE); + DECL_CONTEXT (decl) = global_context; + } else { DECL_CONTEXT (decl) = current_function_decl; @@ -518,11 +525,12 @@ gnat_pushdecl (tree decl, Node_Id gnat_n DECL_STATIC_CHAIN (decl) = 1; } - TREE_NO_WARNING (decl) = (gnat_node == Empty || Warnings_Off (gnat_node)); + TREE_NO_WARNING (decl) = (No (gnat_node) || Warnings_Off (gnat_node)); /* Set the location of DECL and emit a declaration for it. */ if (Present (gnat_node)) Sloc_to_locus (Sloc (gnat_node), DECL_SOURCE_LOCATION (decl)); + add_decl_expr (decl, gnat_node); /* Put the declaration on the list. The list of declarations is in reverse @@ -1982,7 +1990,7 @@ end_subprog_body (tree body) DECL_SAVED_TREE (fndecl) = body; - current_function_decl = DECL_CONTEXT (fndecl); + current_function_decl = decl_function_context (fndecl); /* We cannot track the location of errors past this point. */ error_gnat_node = Empty; @@ -1995,7 +2003,7 @@ end_subprog_body (tree body) dump_function (TDI_original, fndecl); /* ??? This special handling of nested functions is probably obsolete. */ - if (!DECL_CONTEXT (fndecl)) + if (!decl_function_context (fndecl)) cgraph_finalize_function (fndecl, false); else /* Register
Re: [patch] Fix PR lto/50492
On Fri, Oct 7, 2011 at 12:37 PM, Eric Botcazou ebotca...@adacore.com wrote: Hi, this is another LTO bootstrap failure with Ada enabled. There are 2 problems: 1. dwarf2out.c thinks that it is processing pure C++ code for gnat1 so it is invoking some C++-specific code paths that aren't compatible with Ada. Fixed by building TRANSLATION_UNIT_DECL nodes in Ada as well. 2. the recent change: * gimple.c (canonicalize_cond_expr_cond): Handle cast from boolean-type. breaks cross-language inlining. More specifically, it removes a necessary cast between an Ada boolean type and a C boolean type (hence a GIMPLE verification failure later) when __gnat_is_absolute_path is inlined into Is_Absolute_Path: extern int __gnat_is_absolute_path (char *, int); function Is_Absolute_Path (Name : String) return Boolean is function Is_Absolute_Path (Name : Address; Length : Integer) return Integer; pragma Import (C, Is_Absolute_Path, __gnat_is_absolute_path); begin return Is_Absolute_Path (Name'Address, Name'Length) /= 0; end Is_Absolute_Path; We start with: Ada_Boolean_Var = (Integer_Var != 0); and forwprop figures out that (Integer_Var != 0) is equivalent to iftmp.xxx. In combine_cond_expr_cond, the constant folder correctly turns this into: Ada_Boolean_Var = (Ada_Boolean_Type) iftmp.xxx; but the call to canonicalize_cond_expr_cond wrongly removes the cast. Note that changing Ada's boolean_type_node to a C-compatible type doesn't fix the problem as the boolean return type of Is_Absolute_Path has to be an Ada boolean type in any case, so a cast will be always necessary here. Hm, but canonicalize_cond_expr_cond is supposed to produce a tree that is suitable for a condition in a GIMPLE_COND, or a COND_EXPR. So the issue is that it is used for a tcc_comparison on a assignment RHS? Wouldn't the proper fix then be to verify that the result from forward_propagate_into_comparison_1 in forwprop is a suitable replacement of the assign rhs in forward_propagate_into_comparison? Thus, Index: gcc/tree-ssa-forwprop.c === --- gcc/tree-ssa-forwprop.c (revision 179647) +++ gcc/tree-ssa-forwprop.c (working copy) @@ -474,7 +474,9 @@ forward_propagate_into_comparison (gimpl TREE_TYPE (gimple_assign_lhs (stmt)), rhs1, rhs2); - if (tmp) + if (tmp + useless_type_conversion_p (TREE_TYPE (gimple_assign_lhs (stmt)), + TREE_TYPE (tmp))) { gimple_assign_set_rhs_from_tree (gsi, tmp); fold_stmt (gsi); ? Since reverting the canonicalize_cond_expr_cond change apparently has no effect (no regressions detected on x86 and x86-64), the proposed fix is just that. Bootstrapped/regtested on x86_64-suse-linux, OK for mainline? 2011-10-07 Eric Botcazou ebotca...@adacore.com PR lto/50492 * gimple.c (canonicalize_cond_expr_cond): Revert 2011-08-02 change. ada/ * gcc-interface/gigi.h (gnat_pushdecl): Adjust comment. * gcc-interface/utils.c (global_context): New variable. (gnat_pushdecl): Initialize it and set it as the DECL_CONTEXT of DECLs that are either public external or at top level. Use No macro. (end_subprog_body): Call decl_function_context. (rest_of_subprog_body_compilation): Likewise. -- Eric Botcazou
[PATCH] Fix htab lookup bug in reregister_specialization (issue5190046, take 2)
On Wed, Oct 05, 2011 at 09:44:34PM -0400, Jason Merrill wrote: On 10/05/2011 05:15 PM, Jakub Jelinek wrote: If optimize_specialization_lookup_p (tmpl) doesn't change return value in between the two calls, then you are right. But perhaps in that case you could avoid the second call and use slot != NULL instead. That makes sense too. Here is a modified patch then, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? Would just the reregister_specialization change be ok for 4.6 too? 2011-10-07 Jakub Jelinek ja...@redhat.com Diego Novillo dnovi...@google.com * pt.c (reregister_specialization): Use htab_find instead of htab_find_slot with INSERT. (maybe_process_partial_specialization, lookup_template_class_1): Change slot variable type to void ** to avoid aliasing problems. (register_specialization): Likewise. Use slot != NULL instead of more expensive !optimize_specialization_lookup_p (tmpl) test. --- gcc/cp/pt.c.jj 2011-10-03 14:27:49.0 +0200 +++ gcc/cp/pt.c 2011-10-07 09:14:12.0 +0200 @@ -892,7 +892,8 @@ maybe_process_partial_specialization (tr instantiation. Reassign it to the new member specialization template. */ spec_entry elt; - spec_entry **slot; + spec_entry *entry; + void **slot; elt.tmpl = most_general_template (tmpl); elt.args = CLASSTYPE_TI_ARGS (inst); @@ -903,10 +904,10 @@ maybe_process_partial_specialization (tr elt.tmpl = tmpl; elt.args = INNERMOST_TEMPLATE_ARGS (elt.args); - slot = (spec_entry **) - htab_find_slot (type_specializations, elt, INSERT); - *slot = ggc_alloc_spec_entry (); - **slot = elt; + slot = htab_find_slot (type_specializations, elt, INSERT); + entry = ggc_alloc_spec_entry (); + *entry = elt; + *slot = entry; } else if (COMPLETE_OR_OPEN_TYPE_P (inst)) /* But if we've had an implicit instantiation, that's a @@ -1294,7 +1295,7 @@ register_specialization (tree spec, tree hashval_t hash) { tree fn; - spec_entry **slot = NULL; + void **slot = NULL; spec_entry elt; gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL DECL_P (spec)); @@ -1327,10 +1328,10 @@ register_specialization (tree spec, tree if (hash == 0) hash = hash_specialization (elt); - slot = (spec_entry **) + slot = htab_find_slot_with_hash (decl_specializations, elt, hash, INSERT); if (*slot) - fn = (*slot)-spec; + fn = ((spec_entry *) *slot)-spec; else fn = NULL_TREE; } @@ -1423,11 +1424,12 @@ register_specialization (tree spec, tree !check_specialization_namespace (tmpl)) DECL_CONTEXT (spec) = DECL_CONTEXT (tmpl); - if (!optimize_specialization_lookup_p (tmpl)) + if (slot != NULL /* !optimize_specialization_lookup_p (tmpl) */) { + spec_entry *entry = ggc_alloc_spec_entry (); gcc_assert (tmpl args spec); - *slot = ggc_alloc_spec_entry (); - **slot = elt; + *entry = elt; + *slot = entry; if (TREE_CODE (spec) == FUNCTION_DECL DECL_NAMESPACE_SCOPE_P (spec) PRIMARY_TEMPLATE_P (tmpl) DECL_SAVED_TREE (DECL_TEMPLATE_RESULT (tmpl)) == NULL_TREE) @@ -1639,19 +1641,19 @@ iterative_hash_template_arg (tree arg, h bool reregister_specialization (tree spec, tree tinfo, tree new_spec) { - spec_entry **slot; + spec_entry *entry; spec_entry elt; elt.tmpl = most_general_template (TI_TEMPLATE (tinfo)); elt.args = TI_ARGS (tinfo); elt.spec = NULL_TREE; - slot = (spec_entry **) htab_find_slot (decl_specializations, elt, INSERT); - if (*slot) + entry = (spec_entry *) htab_find (decl_specializations, elt); + if (entry != NULL) { - gcc_assert ((*slot)-spec == spec || (*slot)-spec == new_spec); + gcc_assert (entry-spec == spec || entry-spec == new_spec); gcc_assert (new_spec != NULL_TREE); - (*slot)-spec = new_spec; + entry-spec = new_spec; return 1; } @@ -7042,7 +7044,7 @@ lookup_template_class_1 (tree d1, tree a { tree templ = NULL_TREE, parmlist; tree t; - spec_entry **slot; + void **slot; spec_entry *entry; spec_entry elt; hashval_t hash; @@ -7480,10 +7482,11 @@ lookup_template_class_1 (tree d1, tree a SET_TYPE_TEMPLATE_INFO (t, build_template_info (found, arglist)); elt.spec = t; - slot = (spec_entry **) htab_find_slot_with_hash (type_specializations, - elt, hash, INSERT); - *slot = ggc_alloc_spec_entry (); - **slot = elt; + slot = htab_find_slot_with_hash (type_specializations, +
[Ada] Implement NRV optimization in gigi
This implements a form of Named Return Value optimization in gigi. This helps a lot for small functions returning array types as well as for vectorization. Tested on i586-suse-linux, applied on the mainline. 2011-10-07 Eric Botcazou ebotca...@adacore.com * gcc-interface/gigi.h (gnat_useless_type_conversion): Declare. (rest_of_subprog_body_compilation): Likewise. * gcc-interface/decl.c (gnat_to_gnu_entity) E_Variable: For renaming, test for useless conversions by means of gnat_useless_type_conversion. * gcc-interface/trans.c: Include bitmap.h and cgraph.h. (language_function): Add named_ret_val and other_ret_val. (f_named_ret_val): New macro. (f_other_ret_val): Likewise. (gigi): Call rest_of_subprog_body_compilation. (struct nrv_data): New structure. (is_nrv_p): New predicate. (prune_nrv_r): New helper function. (prune_nrv_in_block): New function. (finalize_nrv_r): New helper function. (finalize_nrv): New function. (return_value_ok_for_nrv_p): New predicate. (build_return_expr): If optimization is enabled, record candidates for the Named Return Value optimization. (build_function_stub): Call rest_of_subprog_body_compilation. (Subprogram_Body_to_gnu): If optimization is enabled and there are candidates, finalize the Named Return Value optimization. Call rest_of_subprog_body_compilation. (call_to_gnu): At the end, if a return value is needed, simplify the result before wrapping it up in a COMPOUND_EXPR. * gcc-interface/utils.c (end_subprog_body): Split into... (rest_of_subprog_body_compilation): ...this. New function. (gnat_useless_type_conversion): Likewise. -- Eric Botcazou Index: gcc-interface/utils.c === --- gcc-interface/utils.c (revision 179488) +++ gcc-interface/utils.c (working copy) @@ -1958,7 +1958,7 @@ begin_subprog_body (tree subprog_decl) make_decl_rtl (subprog_decl); } -/* Finish the definition of the current subprogram BODY and finalize it. */ +/* Finish translating the current subprogram and set its BODY. */ void end_subprog_body (tree body) @@ -1983,7 +1983,13 @@ end_subprog_body (tree body) DECL_SAVED_TREE (fndecl) = body; current_function_decl = DECL_CONTEXT (fndecl); +} + +/* Wrap up compilation of SUBPROG_DECL, a subprogram body. */ +void +rest_of_subprog_body_compilation (tree subprog_decl) +{ /* We cannot track the location of errors past this point. */ error_gnat_node = Empty; @@ -1992,15 +1998,15 @@ end_subprog_body (tree body) return; /* Dump functions before gimplification. */ - dump_function (TDI_original, fndecl); + dump_function (TDI_original, subprog_decl); /* ??? This special handling of nested functions is probably obsolete. */ - if (!DECL_CONTEXT (fndecl)) -cgraph_finalize_function (fndecl, false); + if (!DECL_CONTEXT (subprog_decl)) +cgraph_finalize_function (subprog_decl, false); else /* Register this function with cgraph just far enough to get it added to our parent's nested function list. */ -(void) cgraph_get_create_node (fndecl); +(void) cgraph_get_create_node (subprog_decl); } tree @@ -2194,6 +2200,20 @@ gnat_types_compatible_p (tree t1, tree t return 0; } +/* Return true if EXPR is a useless type conversion. */ + +bool +gnat_useless_type_conversion (tree expr) +{ + if (CONVERT_EXPR_P (expr) + || TREE_CODE (expr) == VIEW_CONVERT_EXPR + || TREE_CODE (expr) == NON_LVALUE_EXPR) +return gnat_types_compatible_p (TREE_TYPE (expr), +TREE_TYPE (TREE_OPERAND (expr, 0))); + + return false; +} + /* Return true if T, a FUNCTION_TYPE, has the specified list of flags. */ bool Index: gcc-interface/decl.c === --- gcc-interface/decl.c (revision 179488) +++ gcc-interface/decl.c (working copy) @@ -949,10 +949,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entit if ((TREE_CODE (gnu_expr) == COMPONENT_REF TYPE_IS_PADDING_P (TREE_TYPE (TREE_OPERAND (gnu_expr, 0 /* Strip useless conversions around the object. */ - || (TREE_CODE (gnu_expr) == NOP_EXPR - gnat_types_compatible_p - (TREE_TYPE (gnu_expr), - TREE_TYPE (TREE_OPERAND (gnu_expr, 0) + || gnat_useless_type_conversion (gnu_expr)) { gnu_expr = TREE_OPERAND (gnu_expr, 0); gnu_type = TREE_TYPE (gnu_expr); Index: gcc-interface/gigi.h === --- gcc-interface/gigi.h (revision 179488) +++ gcc-interface/gigi.h (working copy) @@ -479,6 +479,9 @@ extern tree gnat_signed_type (tree type_ transparently converted to each other. */ extern int gnat_types_compatible_p (tree t1, tree t2); +/* Return true if EXPR is a useless type conversion. */ +extern bool
Re: [C++ Patch] PR 38980
Hi, Instead of adding the parameter, let's have the C++ front end call a different function that doesn't try to pull out the value from aggregate variables, like C has decl_constant_value_for_optimization. Ok. The below lives entirely inside the C++ front-end (actually I had already experimented with something similar) Note I'm using the name decl_constant_value_safe, thus I'm not overloading the name decl_constant_value_for_optimization, because the latter is only used by the C front-end but still exported by c-family. I could move back that decl_constant_value_for_optimization currently in c-common.c to the C front-end, but callers, also C front-end only, would remain in c-family. I'd rather not fiddle further with all of that (looks like long term people would like to have more shared code in c-common.c, seems indeed an excellent idea, but at the moment large chunks are actually used by the C front-end only...). Tested x86_64-linux. Paolo. / /cp 2011-10-07 Paolo Carlini paolo.carl...@oracle.com PR c++/38980 * init.c (constant_value_1): Add bool parameter. (decl_constant_value_safe): Add. (integral_constant_value): Adjust. (decl_constant_value): Adjust. * cp-tree.h (decl_constant_value_safe): Declare. * typeck.c (decay_conversion): Use decl_constant_value_safe. * call.c (convert_like_real): Likewise. /testsuite 2011-10-07 Paolo Carlini paolo.carl...@oracle.com PR c++/38980 * g++.dg/warn/format5.C: New. Index: testsuite/g++.dg/warn/format5.C === --- testsuite/g++.dg/warn/format5.C (revision 0) +++ testsuite/g++.dg/warn/format5.C (revision 0) @@ -0,0 +1,12 @@ +// PR c++/38980 +// { dg-options -Wformat } + +extern C +int printf(const char *format, ...) __attribute__((format(printf, 1, 2) )); + +const char fmt1[] = Hello, %s; + +void f() +{ + printf(fmt1, 3); // { dg-warning expects argument } +} Index: cp/typeck.c === --- cp/typeck.c (revision 179649) +++ cp/typeck.c (working copy) @@ -1827,7 +1827,7 @@ decay_conversion (tree exp) /* FIXME remove? at least need to remember that this isn't really a constant expression if EXP isn't decl_constant_var_p, like with C_MAYBE_CONST_EXPR. */ - exp = decl_constant_value (exp); + exp = decl_constant_value_safe (exp); if (error_operand_p (exp)) return error_mark_node; Index: cp/init.c === --- cp/init.c (revision 179649) +++ cp/init.c (working copy) @@ -1794,10 +1794,11 @@ build_offset_ref (tree type, tree member, bool add constant initializer, return the initializer (or, its initializers, recursively); otherwise, return DECL. If INTEGRAL_P, the initializer is only returned if DECL is an integral - constant-expression. */ + constant-expression. If RETURN_AGGREGATE_CST_OK_P, it is ok to + return an aggregate constant. */ static tree -constant_value_1 (tree decl, bool integral_p) +constant_value_1 (tree decl, bool integral_p, bool return_aggregate_cst_ok_p) { while (TREE_CODE (decl) == CONST_DECL || (integral_p @@ -1834,12 +1835,13 @@ static tree if (!init || !TREE_TYPE (init) || !TREE_CONSTANT (init) - || (!integral_p - /* Do not return an aggregate constant (of which -string literals are a special case), as we do not -want to make inadvertent copies of such entities, -and we must be sure that their addresses are the -same everywhere. */ + || (!integral_p !return_aggregate_cst_ok_p + /* Unless RETURN_AGGREGATE_CST_OK_P is true, do not +return an aggregate constant (of which string +literals are a special case), as we do not want +to make inadvertent copies of such entities, and +we must be sure that their addresses are the +same everywhere. */ (TREE_CODE (init) == CONSTRUCTOR || TREE_CODE (init) == STRING_CST))) break; @@ -1856,19 +1858,29 @@ static tree tree integral_constant_value (tree decl) { - return constant_value_1 (decl, /*integral_p=*/true); + return constant_value_1 (decl, /*integral_p=*/true, + /*return_aggregate_cst_ok_p=*/false); } /* A more relaxed version of integral_constant_value, used by the - common C/C++ code and by the C++ front end for optimization - purposes. */ + common C/C++ code. */ tree decl_constant_value (tree decl) { - return constant_value_1 (decl, - /*integral_p=*/processing_template_decl); + return constant_value_1 (decl, /*integral_p=*/processing_template_decl, + /*return_aggregate_cst_ok_p=*/true);
[PATCH] Fixed a regression caused by my vect_recog_mixed_size_cond_pattern changes (PR tree-optimization/50650)
Hi! Calling vect_is_simple_cond from the pattern recognized was a bad idea, as it calls vect_is_simple_use_1 rather than vect_is_simple_use and the former looks at STMT_VINFO_VECTYPE which by that time is only set for the data ref stmts (which is why in my test it worked well, that one did (a[i] b[i]) ? ... : and surprisingly nothing in the testsuite caught that either). Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux. Ok for trunk? 2011-10-07 Jakub Jelinek ja...@redhat.com PR tree-optimization/50650 * tree-vect-patterns.c (vect_recog_mixed_size_cond_pattern): Don't call vect_is_simple_cond here, instead fail if cond_expr isn't COMPARISON_CLASS_P or if get_vectype_for_scalar_type returns NULL for cond_expr's first operand. * tree-vect-stmts.c (vect_is_simple_cond): Static again. * tree-vectorizer.h (vect_is_simple_cond): Remove prototype. * gcc.c-torture/compile/pr50650.c: New test. --- gcc/tree-vect-patterns.c.jj 2011-10-07 10:03:28.0 +0200 +++ gcc/tree-vect-patterns.c2011-10-07 10:18:58.0 +0200 @@ -1269,8 +1269,12 @@ vect_recog_mixed_size_cond_pattern (VEC || TREE_CODE (else_clause) != INTEGER_CST) return NULL; - if (!vect_is_simple_cond (cond_expr, loop_vinfo, comp_vectype) - || !comp_vectype) + if (!COMPARISON_CLASS_P (cond_expr)) +return NULL; + + comp_vectype += get_vectype_for_scalar_type (TREE_TYPE (TREE_OPERAND (cond_expr, 0))); + if (comp_vectype == NULL_TREE) return NULL; type = gimple_expr_type (last_stmt); --- gcc/tree-vect-stmts.c.jj2011-10-07 10:03:28.0 +0200 +++ gcc/tree-vect-stmts.c 2011-10-07 10:04:45.0 +0200 @@ -4698,7 +4698,7 @@ vectorizable_load (gimple stmt, gimple_s Returns whether a COND can be vectorized. Checks whether condition operands are supportable using vec_is_simple_use. */ -bool +static bool vect_is_simple_cond (tree cond, loop_vec_info loop_vinfo, tree *comp_vectype) { tree lhs, rhs; --- gcc/tree-vectorizer.h.jj2011-10-07 10:03:28.0 +0200 +++ gcc/tree-vectorizer.h 2011-10-07 10:04:28.0 +0200 @@ -818,7 +818,6 @@ extern bool vect_transform_stmt (gimple, bool *, slp_tree, slp_instance); extern void vect_remove_stores (gimple); extern bool vect_analyze_stmt (gimple, bool *, slp_tree); -extern bool vect_is_simple_cond (tree, loop_vec_info, tree *); extern bool vectorizable_condition (gimple, gimple_stmt_iterator *, gimple *, tree, int); extern void vect_get_load_cost (struct data_reference *, int, bool, --- gcc/testsuite/gcc.c-torture/compile/pr50650.c.jj2011-10-07 11:12:27.0 +0200 +++ gcc/testsuite/gcc.c-torture/compile/pr50650.c 2011-10-07 11:11:30.0 +0200 @@ -0,0 +1,10 @@ +/* PR tree-optimization/50650 */ + +unsigned int +foo (unsigned int x, unsigned int y) +{ + int i; + for (i = 8; i--; x = 1) +y ^= (x ^ y) 0x80 ? 79U : 0U; + return y; +} Jakub
Re: [PATCH][ARM] Fix broken shift patterns
On 06/10/11 18:17, Paul Brook wrote: I believe this patch to be nothing but an improvement over the current state, and that a fix to the constraint problem should be a separate patch. In that basis, am I OK to commit? One minor nit: (define_special_predicate shift_operator ... + (ior (match_test GET_CODE (XEXP (op, 1)) == CONST_INT + ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op, 1))) 32) + (match_test REG_P (XEXP (op, 1)) We're already enforcing the REG_P elsewhere, and it's only valid in some contexts, so I'd change this to: (match_test GET_CODE (XEXP (op, 1)) != CONST_INT || ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op, 1))) 32) Done, and attached. 3. Consistently accept both power-of-two and 0..31 for shifts. Large shift counts give undefined results[1], so replace them with an arbitrary value (e.g. 0) during assembly output. Argualy not an entirely proper fix, but I think it'll keep everything happy. I think we need to be careful not to change the behaviour between different optimization levels and/or perturbations caused by minor code changes. I know this isn't a hard requirement for undefined behaviour, but I think it's still good practice. In this case, I believe the hardware simply shifts the the value clean out of the register, and always returns a zero (or maybe -1 for ashiftrt?). I'm not sure what it does for rotate. Anyway, my point is that I don't think that we could insert an immediate that had the same effect in all cases. For bonus points we should probably disallow MULT in the arm_shiftsi3 pattern, stop it interacting with the regulat mulsi3 pattern in undesirable ways. How might that be a problem? Is it not the case that canonical forms already deals with this? Anyway, it's easily achieved with an extra predicate. Andrew 2011-10-07 Andrew Stubbs a...@codesourcery.com gcc/ * config/arm/predicates.md (shift_amount_operand): Remove constant range check. (shift_operator): Check range of constants for all shift operators. gcc/testsuite/ * gcc.dg/pr50193-1.c: New file. * gcc.target/arm/shiftable.c: New file. --- a/gcc/config/arm/predicates.md +++ b/gcc/config/arm/predicates.md @@ -129,11 +129,12 @@ (ior (match_operand 0 arm_rhs_operand) (match_operand 0 memory_operand))) +;; This doesn't have to do much because the constant is already checked +;; in the shift_operator predicate. (define_predicate shift_amount_operand (ior (and (match_test TARGET_ARM) (match_operand 0 s_register_operand)) - (and (match_code const_int) - (match_test ((unsigned HOST_WIDE_INT) INTVAL (op)) 32 + (match_operand 0 const_int_operand))) (define_predicate arm_add_operand (ior (match_operand 0 arm_rhs_operand) @@ -219,13 +220,20 @@ (match_test mode == GET_MODE (op ;; True for shift operators. +;; Notes: +;; * mult is only permitted with a constant shift amount +;; * patterns that permit register shift amounts only in ARM mode use +;;shift_amount_operand, patterns that always allow registers do not, +;;so we don't have to worry about that sort of thing here. (define_special_predicate shift_operator (and (ior (ior (and (match_code mult) (match_test power_of_two_operand (XEXP (op, 1), mode))) (and (match_code rotate) (match_test GET_CODE (XEXP (op, 1)) == CONST_INT ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op, 1))) 32))) - (match_code ashift,ashiftrt,lshiftrt,rotatert)) + (and (match_code ashift,ashiftrt,lshiftrt,rotatert) + (match_test GET_CODE (XEXP (op, 1)) != CONST_INT + || ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op, 1))) 32))) (match_test mode == GET_MODE (op ;; True for shift operators which can be used with saturation instructions. --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr50193-1.c @@ -0,0 +1,10 @@ +/* PR 50193: ARM: ICE on a | (b negative-constant) */ +/* Ensure that the compiler doesn't ICE. */ + +/* { dg-options -O2 } */ + +int +foo(int a, int b) +{ + return a | (b -3); /* { dg-warning left shift count is negative } */ +} --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/shiftable.c @@ -0,0 +1,43 @@ +/* { dg-do compile } */ +/* { dg-options -O2 } */ +/* { dg-require-effective-target arm32 } */ + +int +plus (int a, int b) +{ + return (a * 64) + b; +} + +/* { dg-final { scan-assembler add.*\[al]sl #6 } } */ + +int +minus (int a, int b) +{ + return a - (b * 64); +} + +/* { dg-final { scan-assembler sub.*\[al]sl #6 } } */ + +int +ior (int a, int b) +{ + return (a * 64) | b; +} + +/* { dg-final { scan-assembler orr.*\[al]sl #6 } } */ + +int +xor (int a, int b) +{ + return (a * 64) ^ b; +} + +/* { dg-final { scan-assembler eor.*\[al]sl #6 } } */ + +int +and (int a, int b) +{ + return (a * 64) b; +} + +/* { dg-final { scan-assembler and.*\[al]sl #6 } } */
Re: [PATCH] Fixed a regression caused by my vect_recog_mixed_size_cond_pattern changes (PR tree-optimization/50650)
On Fri, 7 Oct 2011, Jakub Jelinek wrote: Hi! Calling vect_is_simple_cond from the pattern recognized was a bad idea, as it calls vect_is_simple_use_1 rather than vect_is_simple_use and the former looks at STMT_VINFO_VECTYPE which by that time is only set for the data ref stmts (which is why in my test it worked well, that one did (a[i] b[i]) ? ... : and surprisingly nothing in the testsuite caught that either). Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux. Ok for trunk? Ok. Thanks, Richard. 2011-10-07 Jakub Jelinek ja...@redhat.com PR tree-optimization/50650 * tree-vect-patterns.c (vect_recog_mixed_size_cond_pattern): Don't call vect_is_simple_cond here, instead fail if cond_expr isn't COMPARISON_CLASS_P or if get_vectype_for_scalar_type returns NULL for cond_expr's first operand. * tree-vect-stmts.c (vect_is_simple_cond): Static again. * tree-vectorizer.h (vect_is_simple_cond): Remove prototype. * gcc.c-torture/compile/pr50650.c: New test. --- gcc/tree-vect-patterns.c.jj 2011-10-07 10:03:28.0 +0200 +++ gcc/tree-vect-patterns.c 2011-10-07 10:18:58.0 +0200 @@ -1269,8 +1269,12 @@ vect_recog_mixed_size_cond_pattern (VEC || TREE_CODE (else_clause) != INTEGER_CST) return NULL; - if (!vect_is_simple_cond (cond_expr, loop_vinfo, comp_vectype) - || !comp_vectype) + if (!COMPARISON_CLASS_P (cond_expr)) +return NULL; + + comp_vectype += get_vectype_for_scalar_type (TREE_TYPE (TREE_OPERAND (cond_expr, 0))); + if (comp_vectype == NULL_TREE) return NULL; type = gimple_expr_type (last_stmt); --- gcc/tree-vect-stmts.c.jj 2011-10-07 10:03:28.0 +0200 +++ gcc/tree-vect-stmts.c 2011-10-07 10:04:45.0 +0200 @@ -4698,7 +4698,7 @@ vectorizable_load (gimple stmt, gimple_s Returns whether a COND can be vectorized. Checks whether condition operands are supportable using vec_is_simple_use. */ -bool +static bool vect_is_simple_cond (tree cond, loop_vec_info loop_vinfo, tree *comp_vectype) { tree lhs, rhs; --- gcc/tree-vectorizer.h.jj 2011-10-07 10:03:28.0 +0200 +++ gcc/tree-vectorizer.h 2011-10-07 10:04:28.0 +0200 @@ -818,7 +818,6 @@ extern bool vect_transform_stmt (gimple, bool *, slp_tree, slp_instance); extern void vect_remove_stores (gimple); extern bool vect_analyze_stmt (gimple, bool *, slp_tree); -extern bool vect_is_simple_cond (tree, loop_vec_info, tree *); extern bool vectorizable_condition (gimple, gimple_stmt_iterator *, gimple *, tree, int); extern void vect_get_load_cost (struct data_reference *, int, bool, --- gcc/testsuite/gcc.c-torture/compile/pr50650.c.jj 2011-10-07 11:12:27.0 +0200 +++ gcc/testsuite/gcc.c-torture/compile/pr50650.c 2011-10-07 11:11:30.0 +0200 @@ -0,0 +1,10 @@ +/* PR tree-optimization/50650 */ + +unsigned int +foo (unsigned int x, unsigned int y) +{ + int i; + for (i = 8; i--; x = 1) +y ^= (x ^ y) 0x80 ? 79U : 0U; + return y; +} Jakub -- Richard Guenther rguent...@suse.de SUSE / SUSE Labs SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer
Re: [PATCH][ARM] Fix broken shift patterns
On 06/10/11 16:01, Andrew Stubbs wrote: (define_special_predicate shift_operator (and (ior (ior (and (match_code mult) (match_test power_of_two_operand (XEXP (op, 1), mode))) (and (match_code rotate) (match_test GET_CODE (XEXP (op, 1)) == CONST_INT ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op, 1))) 32))) - (match_code ashift,ashiftrt,lshiftrt,rotatert)) + (and (match_code ashift,ashiftrt,lshiftrt,rotatert) +(ior (match_test GET_CODE (XEXP (op, 1)) == CONST_INT + ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op, 1))) 32) + (match_test REG_P (XEXP (op, 1)) (match_test mode == GET_MODE (op Oh, I forgot to say, I don't understand why the rotate operator is special cased? If I understand it correctly, the effect of the (existing) rotate is both to check the constant range, AND to disallow registers as the shift amount. This difference has no effect on Thumb, but might cause ARM mode some troubles? Is this likely to be deliberate, or an oversight? I can't see any reason in the ARM ARM why this should be the case. Andrew
Re: [patch] Fix PR lto/50492
Hm, but canonicalize_cond_expr_cond is supposed to produce a tree that is suitable for a condition in a GIMPLE_COND, or a COND_EXPR. So the issue is that it is used for a tcc_comparison on a assignment RHS? It is called on (Ada_Boolean_Type) iftmp.xxx, which comes from the RHS of Ada_Boolean_Var = (Integer_Var != 0); Wouldn't the proper fix then be to verify that the result from forward_propagate_into_comparison_1 in forwprop is a suitable replacement of the assign rhs in forward_propagate_into_comparison? Not clear whether it is the proper fix, as you explicitly pass the type in the call to forward_propagate_into_comparison_1 just above: tmp = forward_propagate_into_comparison_1 (stmt, gimple_assign_rhs_code (stmt), TREE_TYPE (gimple_assign_lhs (stmt)), rhs1, rhs2); and then to combine_cond_expr_cond, so you would expect that both functions return a tree with the specified type. But this would probably work, yes. -- Eric Botcazou
[testsuite] Disable ABI warnings for gcc.c-torture/execute/vector-compare-2.c (PR tree-optimization/50575)
gcc.c-torture/execute/vector-compare-2.c was FAILing on Solaris 8 and 9/x86 with ABI warnings output is: /vol/gcc/src/hg/trunk/local/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.c: In function 'foo': /vol/gcc/src/hg/trunk/local/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.c:7:1: note: The ABI for passing parameters with 16-byte alignment has changed in GCC 4.6 In file included from :0:0: /vol/gcc/src/hg/trunk/local/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.c: In function 'foo': /vol/gcc/src/hg/trunk/local/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.c:7:1: note: The ABI for passing parameters with 16-byte alignment has changed in GCC 4.6 FAIL: gcc.c-torture/execute/vector-compare-2.c compilation, -O2 -flto -flto-partition=none but strangely only with -flto, although the message also appears without. Closer investigation revealed a mess: * If I just run this single test with runtest, it fails for all options, not just -flto. * The notes are pruned by gcc-dg-prune, but that isn't normally loaded by execute.exp. If you do load it explicitly, the notes are pruned as during a regular testsuite run. I suspect that some other driver is loaded together with execute.exp which causes this. * The -flto tests still fail because of a single message that isn't pruned: In file included from :0:0: Only lto.exp (not loaded here) does prune that one. To avoid that mess, I've simply added a .x file which adds -Wno-psabi. Tested with the appropriate runtest invocation on i386-pc-solaris2.8 and i386-pc-solaris2.11, installed on mainline. Rainer 2011-10-07 Rainer Orth r...@cebitec.uni-bielefeld.de PR tree-optimization/50575 * gcc.c-torture/execute/vector-compare-2.x: New file. # HG changeset patch # Parent 9a920c885d78e91628abbcba90693e8bb3e6f1a0 Disable ABI warnings for gcc.c-torture/execute/vector-compare-2.c (PR tree-optimization/50575) diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.x b/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.x new file mode 100644 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.x @@ -0,0 +1,2 @@ +set additional_flags -Wno-psabi +return 0 -- - Rainer Orth, Center for Biotechnology, Bielefeld University
Re: [patch] Fix PR lto/50492
On Fri, Oct 7, 2011 at 1:37 PM, Eric Botcazou ebotca...@adacore.com wrote: Hm, but canonicalize_cond_expr_cond is supposed to produce a tree that is suitable for a condition in a GIMPLE_COND, or a COND_EXPR. So the issue is that it is used for a tcc_comparison on a assignment RHS? It is called on (Ada_Boolean_Type) iftmp.xxx, which comes from the RHS of Ada_Boolean_Var = (Integer_Var != 0); Wouldn't the proper fix then be to verify that the result from forward_propagate_into_comparison_1 in forwprop is a suitable replacement of the assign rhs in forward_propagate_into_comparison? Not clear whether it is the proper fix, as you explicitly pass the type in the call to forward_propagate_into_comparison_1 just above: tmp = forward_propagate_into_comparison_1 (stmt, gimple_assign_rhs_code (stmt), TREE_TYPE (gimple_assign_lhs (stmt)), rhs1, rhs2); and then to combine_cond_expr_cond, so you would expect that both functions return a tree with the specified type. But this would probably work, yes. Yeah, it uses the type to do t = fold_binary_loc (gimple_location (stmt), code, type, op0, op1); and using the original type is surely the best idea for that. It could also simply use boolean_type_node nowadays, not sure if that would cause more fails on the type checking that is needed in forward_propagate_into_comparison. I suppose at most for Ada, so maybe you can check that. If it doesn't make a difference then stripping the type argument from the call chain and using boolean_type_node in combine_cond_expr_cond would be a good cleanup. But the original suggested patch is ok if it bootstraps tests if you just want to go forward. Thanks, Richard. -- Eric Botcazou
Re: [PATCH] Fix PR46556 (poor address generation)
On Fri, 2011-10-07 at 11:17 +0200, Paolo Bonzini wrote: On 10/07/2011 10:00 AM, Richard Guenther wrote: It's a reasonable plan - you'd have to introduce a late reassoc pass though. Can you separate out the RTL fwprop changes? So we can iterate over the tree parts separately. That's indeed better, also because they became CSE changes. Paolo Yes, I'll plan to work these two separately. Paolo, I should be able to shepherd your suggested patch through. Normally company policy frowns on committing other people's patches, but in a case like this where you're no longer actively doing GCC development, I should be able to overcome that. BTW, Richard, whatever my former issues with update_stmt were are gone, so I'll be able to clean up that wart. Thanks, Bill
Re: [PATCH][ARM] Fix broken shift patterns
Oh, I forgot to say, I don't understand why the rotate operator is special cased? If I understand it correctly, the effect of the (existing) rotate is both to check the constant range, AND to disallow registers as the shift amount. This difference has no effect on Thumb, but might cause ARM mode some troubles? Is this likely to be deliberate, or an oversight? I can't see any reason in the ARM ARM why this should be the case. Deliberate. ARM only has rotatert (which for immediate operands can be substituted at assembly generation time). Paul
Re: [PATCH][ARM] Fix broken shift patterns
Done, and attached. Ok. Two changes to the testcase that I'll pre-approve: - Add a comment along the lines of /* ARM has shift-and-alu insns. Depending on the ALU op GCC represents some of these as a left shift, others as a multiply. Check that we match the right one. */ - Also test (a * 64) - b [rsb] and ~(a * 64) [mvn] 3. Consistently accept both power-of-two and 0..31 for shifts. Large shift counts give undefined results[1], so replace them with an arbitrary value (e.g. 0) during assembly output. Argualy not an entirely proper fix, but I think it'll keep everything happy. I think we need to be careful not to change the behaviour between different optimization levels and/or perturbations caused by minor code changes. I know this isn't a hard requirement for undefined behaviour, but I think it's still good practice. In this case, I believe the hardware simply shifts the the value clean out of the register, and always returns a zero (or maybe -1 for ashiftrt?). I'm not convinced. ARM instructions shift modulo 256 (i.e. a (b 0xff). I'm pretty sure anything that gets constant-folded by earlier passes will not honor these semantics. For bonus points we should probably disallow MULT in the arm_shiftsi3 pattern, stop it interacting with the regular mulsi3 pattern in undesirable ways. How might that be a problem? Is it not the case that canonical forms already deals with this? Mainly just general principle that having two insns with the same pattern is wrong - reload can't flip between them like it can different altrnatives, and there's obscure rules about which one wins when both match. In this case the shiftsi variant is very restricted and should never occur in the first place so it probably doesn't matter. Paul
Re: [RFC] Split -mrecip
Hi, On Wed, 5 Oct 2011, Uros Bizjak wrote: Like so. Currently regstrapping on x86_64-linux. Okay if that succeeds? OK, with a nit - I'd introduce RECIP_MASK_NONE and use it in place of 0 in a couple of places. Okay. r179608 it is. Ciao, Michael.
[Patch,AVR] Fix PR50652
Fix of wrong data_section_start for ATmega164A. Ok? Johann PR target/50652 * config/avr/avr-mcus.def (AVR_MCU): Set .data_section_start of atmega164a to 0x100. Index: config/avr/avr-mcus.def === --- config/avr/avr-mcus.def (revision 179594) +++ config/avr/avr-mcus.def (working copy) @@ -117,7 +117,7 @@ AVR_MCU (atmega16a,ARCH_AV AVR_MCU (atmega161,ARCH_AVR5, __AVR_ATmega161__, 0, 0, 0x0060, m161) AVR_MCU (atmega162,ARCH_AVR5, __AVR_ATmega162__, 0, 0, 0x0100, m162) AVR_MCU (atmega163,ARCH_AVR5, __AVR_ATmega163__, 0, 0, 0x0060, m163) -AVR_MCU (atmega164a, ARCH_AVR5, __AVR_ATmega164A__,0, 0, 0x0060, m164a) +AVR_MCU (atmega164a, ARCH_AVR5, __AVR_ATmega164A__,0, 0, 0x0100, m164a) AVR_MCU (atmega164p, ARCH_AVR5, __AVR_ATmega164P__,0, 0, 0x0100, m164p) AVR_MCU (atmega165,ARCH_AVR5, __AVR_ATmega165__, 0, 0, 0x0100, m165) AVR_MCU (atmega165a, ARCH_AVR5, __AVR_ATmega165A__,0, 0, 0x0100, m165a)
Re: Modify gcc for use with gdb (issue5132047)
Jeff == Jeff Law l...@redhat.com writes: Jeff Presumably it hasn't been included because not all gdb's understand Jeff those bits and we typically don't build with -g3. GCC is pretty much the perfect candidate for a -g3 build. All those macros... The needed gdb changes have been in since right around when I added that patch to the incremental branch. Anybody with a 3 year old gdb should upgrade :-) Tom
Re: Modify gcc for use with gdb (issue5132047)
On Fri, Oct 07, 2011 at 07:42:44AM -0600, Tom Tromey wrote: Jeff == Jeff Law l...@redhat.com writes: Jeff Presumably it hasn't been included because not all gdb's understand Jeff those bits and we typically don't build with -g3. GCC is pretty much the perfect candidate for a -g3 build. All those macros... The needed gdb changes have been in since right around when I added that patch to the incremental branch. Anybody with a 3 year old gdb should upgrade :-) A 3 years old gdb is useless for debugging gcc anyway, it won't understand epilogue unwind info, discriminators, lots of .debug_info stuff added in the last few years and not even the .debug_macro format. Jakub
[Committed] S/390: Make TLS work without -fpic
Hi, this fixes the tls testsuite fails on s390. Calls to __tls_get_offset require the GOT pointer to be loaded what so far only happened when building pic code. With the attached patch the GOT pointer is loaded on demand when calling __tls_get_offset. Committed to mainline. Bye, -Andreas- 2011-10-07 Andreas Krebbel andreas.kreb...@de.ibm.com * config/s390/s390.c (s390_emit_tls_call_insn): Remove assertion. Load GOT pointer for non-pic builds. (s390_load_got): Replace pic_offset_table_rtx with hardcoded r12. (s390_emit_call): Likewise. Index: gcc/config/s390/s390.c === *** gcc/config/s390/s390.c.orig --- gcc/config/s390/s390.c *** s390_emit_tls_call_insn (rtx result_reg, *** 3604,3610 { rtx insn; ! gcc_assert (flag_pic); if (!s390_tls_symbol) s390_tls_symbol = gen_rtx_SYMBOL_REF (Pmode, __tls_get_offset); --- 3604,3611 { rtx insn; ! if (!flag_pic) ! emit_insn (s390_load_got ()); if (!s390_tls_symbol) s390_tls_symbol = gen_rtx_SYMBOL_REF (Pmode, __tls_get_offset); *** s390_load_got (void) *** 7859,7864 --- 7860,7871 { rtx insns; + /* We cannot use pic_offset_table_rtx here since we use this + function also for non-pic if __tls_get_offset is called and in + that case PIC_OFFSET_TABLE_REGNUM as well as pic_offset_table_rtx + aren't usable. */ + rtx got_rtx = gen_rtx_REG (Pmode, 12); + if (!got_symbol) { got_symbol = gen_rtx_SYMBOL_REF (Pmode, _GLOBAL_OFFSET_TABLE_); *** s390_load_got (void) *** 7869,7875 if (TARGET_CPU_ZARCH) { ! emit_move_insn (pic_offset_table_rtx, got_symbol); } else { --- 7876,7882 if (TARGET_CPU_ZARCH) { ! emit_move_insn (got_rtx, got_symbol); } else { *** s390_load_got (void) *** 7880,7892 offset = gen_rtx_CONST (Pmode, offset); offset = force_const_mem (Pmode, offset); ! emit_move_insn (pic_offset_table_rtx, offset); offset = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (offset, 0)), UNSPEC_LTREL_BASE); ! offset = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, offset); ! emit_move_insn (pic_offset_table_rtx, offset); } insns = get_insns (); --- 7887,7899 offset = gen_rtx_CONST (Pmode, offset); offset = force_const_mem (Pmode, offset); ! emit_move_insn (got_rtx, offset); offset = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, XEXP (offset, 0)), UNSPEC_LTREL_BASE); ! offset = gen_rtx_PLUS (Pmode, got_rtx, offset); ! emit_move_insn (got_rtx, offset); } insns = get_insns (); *** s390_emit_call (rtx addr_location, rtx t *** 9827,9834 /* s390_function_ok_for_sibcall should have denied sibcalls in this case. */ gcc_assert (retaddr_reg != NULL_RTX); ! ! use_reg (CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx); } return insn; } --- 9834,9840 /* s390_function_ok_for_sibcall should have denied sibcalls in this case. */ gcc_assert (retaddr_reg != NULL_RTX); ! use_reg (CALL_INSN_FUNCTION_USAGE (insn), gen_rtx_REG (Pmode, 12)); } return insn; }
[Patch, fortran] [00/14] PR fortran/50420 Support coarray subreferences
Hello, the following patches propose to fix bug fortran/50420: gfortran has been rejecting coarrays as argument to the coarray intrinsics ({l,u}cobound, image_index) if they had a subreference. The standard, however, has: A subobject of a coarray is a coarray if it does not have any cosubscripts, vector subscripts, allocatable component selection, or pointer component selection. The recent scalarizer patchset at http://gcc.gnu.org/ml/fortran/2011-09/msg00056.html makes thing worse by changing a rejects-valid bug into a ice-on-valid bug. These patches make the necessary change to accept coarray subreferences The full patchset has passed the fortran testsuite successfully. OK for trunk? Patches layout 01..04/14: Add support for non-full arrays in descriptor initialization code. 05..09/14: Make walk_coarray initialize the scalarizer structs properly to accept expression with subreferences. 10..11/14: Fix corank checking 12/14: Accept coarray subreferences in simplify_cobound 13/14: Fix gfc_build_array_type 14/14: Fix gfc_build_array_ref 2011-10-06 Mikael Morin mikael.mo...@sfr.fr PR fortran/50420 * gfortran.dg/coarray_subobject_1.f90: New test. * gfortran.dg/coarray/subobject_1.f90: New test. ! { dg-do compile } ! { dg-options -fcoarray=single } ! ! PR fortran/50420 ! Coarray subobjects were not accepted as valid coarrays ! They should still be rejected if one of the component reference is allocatable ! or pointer type t integer :: i end type t type t2 type(t), allocatable :: a type(t), pointer :: c end type t2 type(t2) :: b[5:*] allocate(b%a) allocate(b%c) b%a%i = 7 b%c%i = 13 if (b%a%i /= 7) call abort if (any (lcobound(b%a) /= (/ 5 /))) call abort ! { dg-error Expected coarray variable } if (ucobound(b%a, dim=1) /= this_image() + 4) call abort ! { dg-error Expected coarray variable } if (any (lcobound(b%a%i) /= (/ 5 /))) call abort ! { dg-error Expected coarray variable } if (ucobound(b%a%i, dim=1) /= this_image() + 4) call abort ! { dg-error Expected coarray variable } if (b%c%i /= 13) call abort if (any (lcobound(b%c) /= (/ 5 /))) call abort ! { dg-error Expected coarray variable } if (ucobound(b%c, dim=1) /= this_image() + 4) call abort ! { dg-error Expected coarray variable } if (any (lcobound(b%c%i) /= (/ 5 /))) call abort ! { dg-error Expected coarray variable } if (ucobound(b%c%i, dim=1) /= this_image() + 4) call abort ! { dg-error Expected coarray variable } end ! { dg-do run } ! ! PR fortran/50420 ! Coarray subobjects were not accepted as valid coarrays integer :: i integer, parameter :: la = 4, lb = 5, lc = 8 integer, parameter :: init(la) = -4 + (/ (i, i=1,la) /) type t integer :: i end type t type t2 type(t), allocatable :: a[:] end type t2 type t3 type(t), allocatable :: a(:)[:] end type t3 type(t2) :: b type(t3) :: c allocate(b%a[lb:*]) b%a%i = 7 if (b%a%i /= 7) call abort if (any (lcobound(b%a) /= (/ lb /))) call abort if (ucobound(b%a, dim=1) /= this_image() + lb - 1) call abort if (any (lcobound(b%a%i) /= (/ lb /))) call abort if (ucobound(b%a%i, dim=1) /= this_image() + lb - 1) call abort allocate(c%a(la)[lc:*]) c%a%i = init if (any(c%a%i /= init)) call abort if (any (lcobound(c%a) /= (/ lc /))) call abort if (ucobound(c%a, dim=1) /= this_image() + lc - 1) call abort if (any (lcobound(c%a%i) /= (/ lc /))) call abort if (ucobound(c%a%i, dim=1) /= this_image() + lc - 1) call abort if (c%a(2)%i /= init(2)) call abort if (any (lcobound(c%a(2)) /= (/ lc /))) call abort if (ucobound(c%a(2), dim=1) /= this_image() + lc - 1) call abort if (any (lcobound(c%a(2)%i) /= (/ lc /))) call abort if (ucobound(c%a(2)%i, dim=1) /= this_image() + lc - 1) call abort deallocate(b%a, c%a) end
[Patch, fortran] [10..11/14] Support coarray subreferences: Fix dim_corank_check
dim_corank_check uses gfc_find_array_ref to get coarray's array ref. It won't work for obvious reasons for the case coarray(1,1) which is a non-arrray (but still a coarray). As the whole point of this is to get the corank, patch 10 replaces the call to gfc_find_array_ref with a call to gfc_get_corank. Then, in gfc_find_array_ref the coarray-specific code can be removed. This is patch 11. OK? 2011-10-06 Mikael Morin mikael.mo...@sfr.fr PR fortran/50420 * check.c (dim_corank_check): Use gfc_get_corank to get corank. diff --git a/check.c b/check.c index 9b8ec21..9b1e3a9 100644 --- a/check.c +++ b/check.c @@ -511,7 +511,6 @@ dim_check (gfc_expr *dim, int n, bool optional) static gfc_try dim_corank_check (gfc_expr *dim, gfc_expr *array) { - gfc_array_ref *ar; int corank; gcc_assert (array-expr_type == EXPR_VARIABLE); @@ -519,8 +518,7 @@ dim_corank_check (gfc_expr *dim, gfc_expr *array) if (dim-expr_type != EXPR_CONSTANT) return SUCCESS; - ar = gfc_find_array_ref (array); - corank = ar-as-corank; + corank = gfc_get_corank (array); if (mpz_cmp_ui (dim-value.integer, 1) 0 || mpz_cmp_ui (dim-value.integer, corank) 0) 2011-10-06 Mikael Morin mikael.mo...@sfr.fr * array.c (gfc_find_array_ref): Remove coarray-specific handling. diff --git a/array.c b/array.c index aa9cc0c..3e6b9d2 100644 --- a/array.c +++ b/array.c @@ -2296,8 +2296,7 @@ gfc_find_array_ref (gfc_expr *e) for (ref = e-ref; ref; ref = ref-next) if (ref-type == REF_ARRAY - (ref-u.ar.type == AR_FULL || ref-u.ar.type == AR_SECTION - || (ref-u.ar.type == AR_ELEMENT ref-u.ar.dimen == 0))) + (ref-u.ar.type == AR_FULL || ref-u.ar.type == AR_SECTION)) break; if (ref == NULL)
[Patch, fortran] [05..09/14] Support coarray subreferences: Add support for array elements.
The walk_coarray function introduced at http://gcc.gnu.org/ml/fortran/2011-09/msg00074.html doesn't (like the code it replaces) support subreferences after the coarray. These patches are going to change that. - The first step is, while looking for the coarray reference, to really look for it, instead of walking blindly to the last ref (patch 7). - Then, in the code generated, an offset to the full array has to be added, corresponding to the subreference. The path taken is to reuse the scalarizer initialization handling for array sections subreferences in gfc_walk_variable_expr, and then let the rest of the scalarizer do the right thing with that (patch 9). - For that to work, we need to skip the array ref lookup in gfc_walk_variable_expr, which is not valid for coarrays. A new funtion gfc_walk_array_ref is introduced, containing all of gfc_walk_variable_expr's code but the array ref lookup (patch 5). - Then for array elements (like coarray(1,1)), we change them from AR_ELEMENT to AR_SECTION so that they get the same treatment as normal arrays in gfc_walk_array_ref (patch 8). - There is a small problem with the latter change; there is an assertion in gfc_walk_array_ref that in the AR_SECTION case, rank is non-zero. Patch 6 fixes that. OK? PS: The patch numbering is odd, because I have tried to reorder patches so that no regression is introduced. However, I haven't checked that it is actually the case. All I know is at the end, it's fine. ;-) 2011-10-06 Mikael Morin mikael.mo...@sfr.fr * trans-array.h (gfc_walk_array_ref): New prototype. * trans-array.c (gfc_walk_array_ref): New function, containing all but the beginning of gfc_walk_variable_expr's code. (gfc_walk_variable_expr): Use gfc_walk_array_ref. diff --git a/trans-array.c b/trans-array.c index 605b356..1cfe382 100644 --- a/trans-array.c +++ b/trans-array.c @@ -7591,14 +7591,22 @@ static gfc_ss * gfc_walk_variable_expr (gfc_ss * ss, gfc_expr * expr) { gfc_ref *ref; - gfc_array_ref *ar; - gfc_ss *newss; - int n; for (ref = expr-ref; ref; ref = ref-next) if (ref-type == REF_ARRAY ref-u.ar.type != AR_ELEMENT) break; + return gfc_walk_array_ref (ss, expr, ref); +} + + +gfc_ss * +gfc_walk_array_ref (gfc_ss * ss, gfc_expr * expr, gfc_ref * ref) +{ + gfc_array_ref *ar; + gfc_ss *newss; + int n; + for (; ref; ref = ref-next) { if (ref-type == REF_SUBSTRING) diff --git a/trans-array.h b/trans-array.h index 73d8c40..4d737bd 100644 --- a/trans-array.h +++ b/trans-array.h @@ -70,6 +70,8 @@ void gfc_trans_static_array_pointer (gfc_symbol *); gfc_ss *gfc_walk_expr (gfc_expr *); /* Workhorse for gfc_walk_expr. */ gfc_ss *gfc_walk_subexpr (gfc_ss *, gfc_expr *); +/* Workhorse for gfc_walk_variable_expr. */ +gfc_ss *gfc_walk_array_ref (gfc_ss *, gfc_expr *, gfc_ref * ref); /* Walk the arguments of an elemental function. */ gfc_ss *gfc_walk_elemental_function_args (gfc_ss *, gfc_actual_arglist *, gfc_ss_type); 2011-10-06 Mikael Morin mikael.mo...@sfr.fr PR fortran/50420 * trans-array.c (gfc_walk_array_ref): Allow zero rank arrays if they are coarrays. diff --git a/trans-array.c b/trans-array.c index 1cfe382..4158a32 100644 --- a/trans-array.c +++ b/trans-array.c @@ -7688,8 +7688,10 @@ gfc_walk_array_ref (gfc_ss * ss, gfc_expr * expr, gfc_ref * ref) gcc_unreachable (); } } - /* We should have at least one non-elemental dimension. */ - gcc_assert (newss-data.info.dimen 0); + /* We should have at least one non-elemental dimension, + unless we are creating a descriptor for a (scalar) coarray. */ + gcc_assert (newss-data.info.dimen 0 + || newss-data.info.ref-u.ar.as-corank 0); ss = newss; break; 2011-10-06 Mikael Morin mikael.mo...@sfr.fr PR fortran/50420 * trans-intrinsic.c (walk_coarray): Allow subreferences after a coarray object reference. diff --git a/trans-intrinsic.c b/trans-intrinsic.c index c47e678..7d12eb9 100644 --- a/trans-intrinsic.c +++ b/trans-intrinsic.c @@ -941,10 +941,16 @@ walk_coarray (gfc_expr *e) ss = gfc_get_array_ss (gfc_ss_terminator, e, 0, GFC_SS_SECTION); ref = e-ref; - while (ref-next) - ref = ref-next; + while (ref) + { + if (ref-type == REF_ARRAY + ref-u.ar.codimen 0) + break; + + ref = ref-next; + } - gcc_assert (ref-type == REF_ARRAY ref-u.ar.codimen 0); + gcc_assert (ref != NULL); ref-u.ar.type = AR_FULL; ss-data.info.ref = ref; } 2011-10-06 Mikael Morin mikael.mo...@sfr.fr PR fortran/50420 * trans-intrinsic.c (walk_coarray): Change AR_ELEMENT to AR_SECTION. diff --git a/trans-intrinsic.c b/trans-intrinsic.c index 7d12eb9..e4a8873 100644 --- a/trans-intrinsic.c +++ b/trans-intrinsic.c @@ -951,7 +951,8 @@ walk_coarray (gfc_expr *e) } gcc_assert (ref != NULL); - ref-u.ar.type = AR_FULL; +
[Patch, fortran] [14/14] Support coarray subreferences: fix gfc_build_array_ref
This fixes a failing assertion in gfc_build_array_ref. While array(x,:) still refers to an array, array(x,y) is a single element, and thus coarray(x,y) is a descriptor whose data component points to something that is not an array. gfc_conv_expr_descriptor, to update data pointer with subreferences, calls gfc_get_dataptr_offset which in turn calls gfc_build_array_ref, which expects an array. In the non-array case, as there is no extra offset corresponding to array element, there is nothing to do here. This patch returns early in that case. OK? PS: I'm not very confident with the span stuff this function is about, so I wouldn't mind Paul having a look. 2011-10-06 Mikael Morin mikael.mo...@sfr.fr PR fortran/50420 * trans.c (gfc_build_array_ref): If type is not an array, check that there is nothing to do, and do nothing. diff --git a/trans.c b/trans.c index 764bdf4..1deff32 100644 --- a/trans.c +++ b/trans.c @@ -323,7 +323,14 @@ gfc_build_array_ref (tree base, tree offset, tree decl) return fold_convert (TYPE_MAIN_VARIANT (type), base); } - gcc_assert (TREE_CODE (type) == ARRAY_TYPE); + /* Scalar coarray, there is nothing to do. */ + if (TREE_CODE (type) != ARRAY_TYPE) +{ + gcc_assert (decl == NULL_TREE); + gcc_assert (integer_zerop (offset)); + return base; +} + type = TREE_TYPE (type); if (DECL_P (base))
[Patch, fortran] [01..04/14] Support coarray subreferences: Add subreferences support in gfc_conv_expr_descriptor
These patches change the descriptor initialization code in gfc_conv_expr_descriptor introduced by the recent scalarizer patchset at http://gcc.gnu.org/ml/fortran/2011-09/msg00056.html. It was supposing (just like the code it was replacing) that coarrays were always full, but a subobject of a coarray is also a coarray (if non-allocatable, non-pointer). Thus, if `a' is a coarray of rank 2; `a', `a(1,:)' and `a(1,2)' are all valid coarrays. Because of the two latter ones, we have to distinguish between the full array rank (2 in the three cases above), and the partial reference rank (respectively 2, 1, 0). As a result: - in patch 4, we use loop.dimen (partial rank) instead of ndim (full rank) for accessing loop and descriptor elements. - in patch 3, we count codimensions from 0 and add to it either ndim or loop.dimen depending on whether we access array ref's elements or loop elements. Patches 1 and 2 are preliminary changes. OK? 2011-10-06 Mikael Morin mikael.mo...@sfr.fr * trans-array.c (gfc_conv_expr_descriptor): Move ndim initialization earlier. diff --git a/trans-array.c b/trans-array.c index 5144398..1db2186 100644 --- a/trans-array.c +++ b/trans-array.c @@ -5962,6 +5962,8 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) tree to; tree base; + ndim = info-ref ? info-ref-u.ar.dimen : info-dimen; + if (se-want_coarray) { codim = gfc_get_corank (expr); @@ -6034,7 +6036,6 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) else base = NULL_TREE; - ndim = info-ref ? info-ref-u.ar.dimen : info-dimen; for (n = 0; n ndim; n++) { stride = gfc_conv_array_stride (desc, n); 2011-10-06 Mikael Morin mikael.mo...@sfr.fr * trans-array.c (gfc_conv_expr_descriptor): Save some horizontal space. diff --git a/trans-array.c b/trans-array.c index 1db2186..034486d 100644 --- a/trans-array.c +++ b/trans-array.c @@ -5966,16 +5966,18 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) if (se-want_coarray) { + gfc_array_ref *ar = info-ref-u.ar; + codim = gfc_get_corank (expr); for (n = ss-data.info.dimen; n ss-data.info.dimen + codim - 1; n++) { /* Make sure we are not lost somehow. */ - gcc_assert (info-ref-u.ar.dimen_type[n] == DIMEN_THIS_IMAGE); + gcc_assert (ar-dimen_type[n] == DIMEN_THIS_IMAGE); /* Make sure the call to gfc_conv_section_startstride won't generate unnecessary code to calculate stride. */ - gcc_assert (info-ref-u.ar.stride[n] == NULL); + gcc_assert (ar-stride[n] == NULL); gfc_conv_section_startstride (loop, ss, n); loop.from[n] = info-start[n]; @@ -5983,7 +5985,7 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) } gcc_assert (n == ss-data.info.dimen + codim - 1); - evaluate_bound (loop.pre, info-start, info-ref-u.ar.start, + evaluate_bound (loop.pre, info-start, ar-start, info-descriptor, n, true); loop.from[n] = info-start[n]; } 2011-10-06 Mikael Morin mikael.mo...@sfr.fr PR fortran/50420 * trans-array.c (gfc_conv_expr_descriptor): Count codimensions starting from zero, and add then the relevant offset (either ndim or loop.dimen) depending on context. diff --git a/trans-array.c b/trans-array.c index 034486d..57534e0 100644 --- a/trans-array.c +++ b/trans-array.c @@ -5969,25 +5969,24 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) gfc_array_ref *ar = info-ref-u.ar; codim = gfc_get_corank (expr); - for (n = ss-data.info.dimen; n ss-data.info.dimen + codim - 1; - n++) + for (n = 0; n codim - 1; n++) { /* Make sure we are not lost somehow. */ - gcc_assert (ar-dimen_type[n] == DIMEN_THIS_IMAGE); + gcc_assert (ar-dimen_type[n + ndim] == DIMEN_THIS_IMAGE); /* Make sure the call to gfc_conv_section_startstride won't generate unnecessary code to calculate stride. */ - gcc_assert (ar-stride[n] == NULL); + gcc_assert (ar-stride[n + ndim] == NULL); - gfc_conv_section_startstride (loop, ss, n); - loop.from[n] = info-start[n]; - loop.to[n] = info-end[n]; + gfc_conv_section_startstride (loop, ss, n + ndim); + loop.from[n + loop.dimen] = info-start[n + ndim]; + loop.to[n + loop.dimen] = info-end[n + ndim]; } - gcc_assert (n == ss-data.info.dimen + codim - 1); + gcc_assert (n == codim - 1); evaluate_bound (loop.pre, info-start, ar-start, - info-descriptor, n, true); - loop.from[n] = info-start[n]; + info-descriptor, n + ndim, true); + loop.from[n + loop.dimen] = info-start[n + ndim]; } else codim = 0; 2011-10-06 Mikael Morin mikael.mo...@sfr.fr PR fortran/50420 * trans-array.c (gfc_conv_expr_descriptor): Use loop.dimen instead of ndim for the descriptor's
[Patch, fortran] [12/14] Support coarray subreferences: Fix simplify_cobound
simplify_cobound, when it looks for the coarray reference, in the AR_ELEMENT case, first checks that it is the last reference in the chain. As it is what we are trying to avoid, this patch removes that and uses the corank field directly. OK? 2011-10-06 Mikael Morin mikael.mo...@sfr.fr PR fortran/50420 * simplify.c (simplify_cobound): Accept non-last-in-ref-chain coarrays. Don't set already set array ref. diff --git a/simplify.c b/simplify.c index 13a9c51..63689bb 100644 --- a/simplify.c +++ b/simplify.c @@ -3512,11 +3512,9 @@ simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper) switch (ref-u.ar.type) { case AR_ELEMENT: - if (ref-next == NULL) + if (ref-u.ar.as-corank 0) { - gcc_assert (ref-u.ar.as-corank 0 - ref-u.ar.as-rank == 0); - as = ref-u.ar.as; + gcc_assert (as == ref-u.ar.as); goto done; } as = NULL;
[Patch, fortran] [13/14] Support coarray subreferences: don't force coarray lower bound to 1.
gfc_build_array_type was forcing the lower bound to zero in cases where it was unspecified (NULL). This is wrong for deferred (allocatable) coarrays at least, as their cobound is specified at allocation time. This patch fixes that. I don't think other cases beyond AS_DEFERRED need fixing, but I wouldn't mind a confirmation. ;-) OK? 2011-10-06 Mikael Morin mikael.mo...@sfr.fr PR fortran/50420 * trans-types.c (gfc_build_array_type): Don't force lower bound to one in the deferred case. diff --git a/trans-types.c b/trans-types.c index 43f1a19..652c009 100644 --- a/trans-types.c +++ b/trans-types.c @@ -1256,7 +1256,7 @@ gfc_build_array_type (tree type, gfc_array_spec * as, for (n = as-rank; n as-rank + as-corank; n++) { - if (as-lower[n] == NULL) + if (as-type != AS_DEFERRED as-lower[n] == NULL) lbound[n] = gfc_index_one_node; else lbound[n] = gfc_conv_array_bound (as-lower[n]);
Re: [Patch, Fortran, OOP] PR 50625: [4.6/4.7 Regression] ALLOCATABLE attribute lost for module CLASS variables
Regtested successfully on x86_64-unknown-linux-gnu (except for failure on entry_4 and select_type_12, which are known middle-end regressions). Ok for trunk and 4.6? OK. Thanks for the patch Thanks for the review. Committed to trunk as r179660. - and for telling me that select_type_12 is a middle end regression (PR 50640); I already wondered why my being worked-on patch showed all of a sudden that failure. (I had self-caused select type failures before; thus, I didn't think of a ME problem.) Yeah, at first I also thought that my local modifications were to blame. But then I noticed that it only fails with optimization (which is usually a very reliable sign for a middle-end problem) and that Dominique had already filed a PR. Cheers, Janus 2011-10-07 Janus Weilja...@gcc.gnu.org PR fortran/50625 * class.c (gfc_build_class_symbol): Fix whitespace. * module.c (mio_symbol): Set 'class_ok' attribute. * trans-decl.c (gfc_get_symbol_decl): Make sure the backend_decl has been built for class symbols. 2011-10-07 Janus Weilja...@gcc.gnu.org PR fortran/50625 * gfortran.dg/class_46.f03: New.
Re: [patch tree-optimization]: Improve handling of conditional-branches on targets with high branch costs
On Thu, Oct 6, 2011 at 4:25 PM, Kai Tietz kti...@redhat.com wrote: Hi, I modified the patch so, that it always just converts two leafs of a TRUTH(AND|OR)IF chain into a TRUTH_(AND|OR) expression, if branch costs are high and leafs are simple without side-effects. Additionally I added some testcases for it. 2011-10-06 Kai Tietz kti...@redhat.com * fold-const.c (fold_truth_andor): Convert TRUTH_(AND|OR)IF_EXPR to TRUTH_OR_EXPR, if suitable. 2011-10-06 Kai Tietz kti...@redhat.com * gcc.dg/tree-ssa/ssa-ifbranch-1.c: New test. * gcc.dg/tree-ssa/ssa-ifbranch-2.c: New test. * gcc.dg/tree-ssa/ssa-ifbranch-3.c: New test. * gcc.dg/tree-ssa/ssa-ifbranch-4.c: New test. Bootstrapped and tested for all languages (including Ada and Obj-C++) on host x86_64-unknown-linux-gnu. Ok for apply? Regards, Kai Index: gcc-head/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifbranch-1.c === --- /dev/null +++ gcc-head/gcc/testsuite/gcc.dg/tree-ssa/ssa-ifbranch-1.c @@ -0,0 +1,18 @@ +/* Skip on MIPS, S/390, and AVR due LOGICAL_OP_NON_SHORT_CIRCUIT, and + lower values in BRANCH_COST. */ +/* { dg-do compile { target { ! mips*-*-* s390*-*-* avr-*-* mn10300-*-* } } } */ +/* { dg-options -O2 -fdump-tree-gimple } */ +/* { dg-options -O2 -fdump-tree-gimple -march=i586 { target { i?86-*-* ilp32 } } } */ + +extern int doo1 (void); +extern int doo2 (void); + +int bar (int a, int b, int c) +{ + if (a b c) + return doo1 (); + return doo2 (); +} + +/* { dg-final { scan-tree-dump-times if 2 gimple } } */ +/* { dg-final { cleanup-tree-dump gimple } } */ Index: gcc-head/gcc/fold-const.c === --- gcc-head.orig/gcc/fold-const.c +++ gcc-head/gcc/fold-const.c @@ -8387,6 +8387,45 @@ fold_truth_andor (location_t loc, enum t if ((tem = fold_truthop (loc, code, type, arg0, arg1)) != 0) return tem; + if ((code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR) + !TREE_SIDE_EFFECTS (arg1) + LOGICAL_OP_NON_SHORT_CIRCUIT + /* floats might trap. */ + !FLOAT_TYPE_P (TREE_TYPE (arg1)) Floats don't trap on their own. If possibly trapping trees don't have TREE_SIDE_EFFECTS set then you want !tree_could_trap_p (arg1) here. + ((TREE_CODE_CLASS (TREE_CODE (arg1)) != tcc_comparison + TREE_CODE (arg1) != TRUTH_NOT_EXPR + simple_operand_p (arg1)) As I said previously simple_operand_p already rejects covers comparisons and TRUTH_NOT_EXPR. Also arg1 had better TREE_SIDE_EFFECTS set if the comparison might trap, as it might just be hidden in something more complicated - so the simple check isn't enough anyway (and if simple_operand_p would cover it, the check would be better placed there). + || ((TREE_CODE_CLASS (TREE_CODE (arg1)) == tcc_comparison + || TREE_CODE (arg1) == TRUTH_NOT_EXPR) + /* Float comparison might trap. */ + !FLOAT_TYPE_P (TREE_TYPE (TREE_OPERAND (arg1, 0))) + simple_operand_p (TREE_OPERAND (arg1, 0) + { + /* We want to combine truth-comparison for + ((W TRUTH-ANDOR X) TRUTH-ANDORIF Y) TRUTH-ANDORIF Z, + if Y and Z are simple operands and have no side-effect to + ((W TRUTH-ANDOR X) TRUTH-IF (Y TRUTH-ANDOR Z). */ No we don't. See down-thread. + if (TREE_CODE (arg0) == code + !TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)) + simple_operand_p (TREE_OPERAND (arg0, 1))) + { + tem = build2_loc (loc, + (code == TRUTH_ANDIF_EXPR ? TRUTH_AND_EXPR + : TRUTH_OR_EXPR), + type, TREE_OPERAND (arg0, 1), arg1); + return build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), + tem); All trees should be folded, don't use plain build without a good reason. + } + /* Convert X TRUTH-ANDORIF Y to X TRUTH-ANDOR Y, if X and Y + are simple operands and have no side-effects. */ + if (simple_operand_p (arg0) + !TREE_SIDE_EFFECTS (arg0)) Again, the checks you do for arg0 do not match those for arg1. OTOH it doesn't matter whether arg0 is simple or not or has side-effects or not for this transformation, so why check it at all? In fold_truthop we still have the same (albeit more restricted transform), but guarded with if (BRANCH_COST (optimize_function_for_speed_p (cfun), false) = 2 too. Why not here? Please delete redundant code in fold_truthop. It's also odd that this is only called from fold_truth_andor but has a more generic name, so maybe rename it to fold_truth_andor_1 on the way. Richard. + return build2_loc (loc, + (code == TRUTH_ANDIF_EXPR ? TRUTH_AND_EXPR +
Re: [Patch] Support DEC-C extensions
On Fri, 7 Oct 2011, Tristan Gingold wrote: Here is my patch with the option renamed. Ok for trunk ? OK with a spelling fix: +@item -fallow-parameterless-variadic-functions +Accept variadic functions without named parameters. + +Although it is possible to define such a function, this is not very +usefull as it is not possible to read the arguments. This is only useful -- Joseph S. Myers jos...@codesourcery.com
Re: [PATCH][ARM] Fix broken shift patterns
On 07/10/11 13:37, Paul Brook wrote: Done, and attached. Ok. Two changes to the testcase that I'll pre-approve: - Add a comment along the lines of /* ARM has shift-and-alu insns. Depending on the ALU op GCC represents some of these as a left shift, others as a multiply. Check that we match the right one. */ - Also test (a * 64) - b [rsb] and ~(a * 64) [mvn] Thanks, I've committed the attached. In this case, I believe the hardware simply shifts the the value clean out of the register, and always returns a zero (or maybe -1 for ashiftrt?). I'm not convinced. ARM instructions shift modulo 256 (i.e. a (b 0xff). I'm pretty sure anything that gets constant-folded by earlier passes will not honor these semantics. True, but I'm still not sure what the least wrong way to do this might be. For bonus points we should probably disallow MULT in the arm_shiftsi3 pattern, stop it interacting with the regular mulsi3 pattern in undesirable ways. How might that be a problem? Is it not the case that canonical forms already deals with this? Mainly just general principle that having two insns with the same pattern is wrong - reload can't flip between them like it can different altrnatives, and there's obscure rules about which one wins when both match. OK, so we'd just need a shift_operator_that_isnt_mult predicate, (probably not with that name). Andrew 2011-10-07 Andrew Stubbs a...@codesourcery.com gcc/ * config/arm/predicates.md (shift_amount_operand): Remove constant range check. (shift_operator): Check range of constants for all shift operators. gcc/testsuite/ * gcc.dg/pr50193-1.c: New file. * gcc.target/arm/shiftable.c: New file. --- a/gcc/config/arm/predicates.md +++ b/gcc/config/arm/predicates.md @@ -129,11 +129,12 @@ (ior (match_operand 0 arm_rhs_operand) (match_operand 0 memory_operand))) +;; This doesn't have to do much because the constant is already checked +;; in the shift_operator predicate. (define_predicate shift_amount_operand (ior (and (match_test TARGET_ARM) (match_operand 0 s_register_operand)) - (and (match_code const_int) - (match_test ((unsigned HOST_WIDE_INT) INTVAL (op)) 32 + (match_operand 0 const_int_operand))) (define_predicate arm_add_operand (ior (match_operand 0 arm_rhs_operand) @@ -219,13 +220,20 @@ (match_test mode == GET_MODE (op ;; True for shift operators. +;; Notes: +;; * mult is only permitted with a constant shift amount +;; * patterns that permit register shift amounts only in ARM mode use +;;shift_amount_operand, patterns that always allow registers do not, +;;so we don't have to worry about that sort of thing here. (define_special_predicate shift_operator (and (ior (ior (and (match_code mult) (match_test power_of_two_operand (XEXP (op, 1), mode))) (and (match_code rotate) (match_test GET_CODE (XEXP (op, 1)) == CONST_INT ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op, 1))) 32))) - (match_code ashift,ashiftrt,lshiftrt,rotatert)) + (and (match_code ashift,ashiftrt,lshiftrt,rotatert) + (match_test GET_CODE (XEXP (op, 1)) != CONST_INT + || ((unsigned HOST_WIDE_INT) INTVAL (XEXP (op, 1))) 32))) (match_test mode == GET_MODE (op ;; True for shift operators which can be used with saturation instructions. --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr50193-1.c @@ -0,0 +1,10 @@ +/* PR 50193: ARM: ICE on a | (b negative-constant) */ +/* Ensure that the compiler doesn't ICE. */ + +/* { dg-options -O2 } */ + +int +foo(int a, int b) +{ + return a | (b -3); /* { dg-warning left shift count is negative } */ +} --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/shiftable.c @@ -0,0 +1,63 @@ +/* { dg-do compile } */ +/* { dg-options -O2 } */ +/* { dg-require-effective-target arm32 } */ + +/* ARM has shift-and-alu insns. Depending on the ALU op GCC represents some + of these as a left shift, others as a multiply. Check that we match the +right one. */ + +int +plus (int a, int b) +{ + return (a * 64) + b; +} + +/* { dg-final { scan-assembler add.*\[al]sl #6 } } */ + +int +minus (int a, int b) +{ + return a - (b * 64); +} + +/* { dg-final { scan-assembler sub.*\[al]sl #6 } } */ + +int +ior (int a, int b) +{ + return (a * 64) | b; +} + +/* { dg-final { scan-assembler orr.*\[al]sl #6 } } */ + +int +xor (int a, int b) +{ + return (a * 64) ^ b; +} + +/* { dg-final { scan-assembler eor.*\[al]sl #6 } } */ + +int +and (int a, int b) +{ + return (a * 64) b; +} + +/* { dg-final { scan-assembler and.*\[al]sl #6 } } */ + +int +rsb (int a, int b) +{ + return (a * 64) - b; +} + +/* { dg-final { scan-assembler rsb.*\[al]sl #6 } } */ + +int +mvn (int a, int b) +{ + return ~(a * 64); +} + +/* { dg-final { scan-assembler mvn.*\[al]sl #6 } } */
[i386] add missing --with-cpu entries
* config.gcc (x86_64-*): Add core-avx-i, core-avx2 for with_cpu. diff --git a/gcc/config.gcc b/gcc/config.gcc index 8b380ac..8099ed7 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -3302,7 +3302,7 @@ case ${target} in | k8 | k8-sse3 | athlon64 | athlon64-sse3 | opteron \ | opteron-sse3 | athlon-fx | bdver2 | bdver1 | btver1 \ | amdfam10 | barcelona | nocona | core2 | corei7 \ - | corei7-avx | atom) + | corei7-avx | core-avx-i | core-avx2 | atom) # OK ;; *)
Re: Modify gcc for use with gdb (issue5132047)
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 On 10/07/11 07:42, Tom Tromey wrote: Jeff == Jeff Law l...@redhat.com writes: Jeff Presumably it hasn't been included because not all gdb's understand Jeff those bits and we typically don't build with -g3. GCC is pretty much the perfect candidate for a -g3 build. All those macros... The needed gdb changes have been in since right around when I added that patch to the incremental branch. Anybody with a 3 year old gdb should upgrade :-) Hard to argue with that :-) Gone are the days when I'd build a binary tool of some sort and use it for many years thereafter. I doubt there's any binary on my boxes older than a year... jeff -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iQEcBAEBAgAGBQJOjx63AAoJEBRtltQi2kC7fXoH/13uE6l2klTOFPrAKbTszo5s 0fxtmLD9NQWyeOFuGL4P9O9J6rChdulFvY9oNlWUrJIwF7WTOp4FjqNZnhvzoIT8 zEqoT8yVO7pNS7KMyRbxJxz5iEx8pX0YW2O2Rl/qZGy/hFKatqaOgz/RuBZy4lg2 NpiKWULKRsc66FxPKhCPMqtSd338XOhC0S67D2GuK1qD93SFDEyoQbaViieMlmoo qr5oFn1052byWd3J1cPbu5vv76YLnzPEmBybm0k/ZaoGFC/JidDghQvR9uHtBbbl LLsFIej62rzCLWZTfbgaiAfKZv79msjhZIrhv8T9iSAolUG4KDvLCvP8SbUg6XI= =KKKR -END PGP SIGNATURE-
Fix PR50638 (segfault with emutls)
Hi, tree-emutls.c missed to called add_referenced_var for a variable that is referenced. That always was a bug, but meanwhile is fatal (causing a segfault). This fixes the problem. Okay for trunk if regstrapping succeeds? The related bugreport PR50640 (fortran segfaults for similar reasons) is a bit more involved and requires some pondering on my part. The PR50644 (LTO segfault) requires some analysis still, to know which variable causes this. Ciao, Michael. - PR middle-end/50638 * tree-emutls.c (gen_emutls_addr): Call add_referenced_var. Index: tree-emutls.c === --- tree-emutls.c (revision 179606) +++ tree-emutls.c (working copy) @@ -434,6 +434,7 @@ gen_emutls_addr (tree decl, struct lower addr = create_tmp_var (build_pointer_type (TREE_TYPE (decl)), NULL); x = gimple_build_call (d-builtin_decl, 1, build_fold_addr_expr (cdecl)); gimple_set_location (x, d-loc); + add_referenced_var (cdecl); addr = make_ssa_name (addr, x); gimple_call_set_lhs (x, addr);
[patch tree-optimization]: 2 of 6 Improve reassoc for bitwise operations
Hello, This patch adds the repropagation of expanded bitwise-not expressions. ChangeLog 2011-10-07 Kai Tietz kti...@redhat.com * tree-ssa-reassoc.c (walk_bitwise_stmt_elems): Helper to collect different kinds of operands of a bitwise-binary expression chain. (rebuild_vector_tree): Helper function to create out of a vector list a bitwise-binary kind statement-chain. (operate_bitwise_xor_stmt): Perform repropagation for a XOR statement chain. (operate_bitwise_stmt): Handler to repropagate a bitwise statement-chain. (repropagate_bitwise): Handler to repropage bitwise-binaries. (execute_reassoc): Make use of repropagate_bitwise. 2011-10-07 Kai Tietz kti...@redhat.com * gcc.dg/tree-ssa/reassoc-not-1.c: New file. Bootstrapped and regression-tested for all languages plus Ada and Obj-C++ on x86_64-pc-linux-gnu. Ok for apply? Regards, Kai Index: gcc/gcc/tree-ssa-reassoc.c === --- gcc.orig/gcc/tree-ssa-reassoc.c +++ gcc/gcc/tree-ssa-reassoc.c @@ -3110,6 +3110,366 @@ linearize_expr_tree (VEC(operand_entry_t add_to_ops_vec (ops, binrhs); } +/* Split up a binary tree-chain of code CODE - starting at STMT - into three + different kinds: + - vector VCST stores constant values. + - vector VNOT stores bitwise-not expressions. + - vector VEXRR stores the remaining rest. */ + +static void +walk_bitwise_stmt_elems (gimple stmt, enum tree_code code, +VEC(tree, heap) **vcst, +VEC(tree, heap) **vnot, +VEC(tree, heap) **vexpr) +{ + gimple s; + tree l; + + l = gimple_assign_rhs1 (stmt); + if (TREE_CODE (l) == INTEGER_CST) +VEC_safe_push (tree, heap, *vcst, l); + else if (TREE_CODE (l) != SSA_NAME + || (s = SSA_NAME_DEF_STMT (l)) == NULL + || !is_gimple_assign (s) + || !has_single_use (l)) +VEC_safe_push (tree, heap, *vexpr, l); + else if (gimple_assign_rhs_code (s) == code) +walk_bitwise_stmt_elems (s, code, vcst, vnot, vexpr); + else if (gimple_assign_rhs_code (s) == BIT_NOT_EXPR) +VEC_safe_push (tree, heap, *vnot, l); + else +VEC_safe_push (tree, heap, *vexpr, l); + + l = gimple_assign_rhs2 (stmt); + + if (TREE_CODE (l) == INTEGER_CST) +{ + VEC_safe_push (tree, heap, *vcst, l); + return; +} + if (TREE_CODE (l) != SSA_NAME + || (s = SSA_NAME_DEF_STMT (l)) == NULL + || !is_gimple_assign (s) + || !has_single_use (l)) +VEC_safe_push (tree, heap, *vexpr, l); + else if (gimple_assign_rhs_code (s) == code) +walk_bitwise_stmt_elems (s, code, vcst, vnot, vexpr); + else if (gimple_assign_rhs_code (s) == BIT_NOT_EXPR) +VEC_safe_push (tree, heap, *vnot, l); + else +VEC_safe_push (tree, heap, *vexpr, l); +} + +/* Helper function to rebuild a binary tree of CODE elements + from vector VEC. + If LASTP is NULL, then all elements are combined and the result is + returned. Otherwise the last element of vector VEC is stored in LASTP + and all - but the last - elements are merged and returned. + Note: for vector with just one element, this element is returned + and LASTP is set to NULL, if provided. + If INNER_LEFT has value TRUE, then the RHS1 operand of VEC elements + are used for combining. Otherwise the VEC elements itself are used. */ + +static tree +rebuild_vector_tree (VEC(tree, heap) *vec, +enum tree_code code, tree *lastp, bool inner_left) +{ + gimple s; + unsigned int i = 0; + tree r = NULL_TREE, x, r2 = NULL_TREE; + + FOR_EACH_VEC_ELT (tree, vec, i, x) +{ + s = SSA_NAME_DEF_STMT (x); + + if (inner_left) + x = gimple_assign_rhs1 (s); + if (!r) +r = x; + else if (!r2) +r2 = x; + else +{ + r = make_new_tmp_statement (TREE_TYPE (r), code, r, r2, s); + r2 = x; + } +} + if (lastp) +*lastp = r2; + else if (r r2) +{ + s = SSA_NAME_DEF_STMT (r); + r = make_new_tmp_statement (TREE_TYPE (r), code, r, r2, s); +} + return r; +} + +/* Sink not-expression out of xor-expression-sequences. This sequence + is made out of VNOT, VEXPR, and TCST. + It returns TRUE, if tree-chain PGSI - starting at STMT - was modified, + otherwise FALSE. */ + +static bool +operate_bitwise_xor_stmt (gimple_stmt_iterator *pgsi, gimple stmt, tree tcst, + VEC(tree, heap) *vnot, + VEC(tree, heap) *vexpr) +{ + unsigned int i = VEC_length (tree, vnot); + tree l = NULL_TREE, r = NULL_TREE; + bool inv = false; + + /* If the amount of not-expressions is odd, then we have two cases: + a) we have a constant, so we can sink one not into integeral constant +as ~X ^ CST - X ^ CST' with CST' = ~CST. + b) we need to add to the hole statment a bitwise-not expression. */ + if ((i 1) != 0) +{ +
[patch tree-optimization]: 1 of 6 Improve reassoc for bitwise operations
Hello, This patch adds to the break-up pass the facility to sink bitwise-not operations into bitwise-binary expressions. Additionally it handles special cases for ~(~X), and ~(X cmp Y). ChangeLog 2011-10-07 Kai Tietz kti...@redhat.com * tree-ssa-reassoc.c (remove_stmt_chain): Helper function to remove gimple-assignment tree with all arms. (make_new_tmp_statement): Helper function to create temporary register expression. (expand_not_bitwise_binary): Perform bitwise-not operation on gimple-assignment tree. (break_up_bitwise_combined_stmt): Break-up handler for bitwise- operations. (break_up_expr_bb): Adjust to call break_up_bitwise_combined_stmt. 2011-10-07 Kai Tietz kti...@redhat.com * gcc.dg/tree-ssa/reassoc-not-1.c: New file. * gcc.dg/tree-ssa/reassoc-not-2.c: New file. * gcc.dg/tree-ssa/reassoc-not-3.c: New file. Bootstrapped and regression-tested for all languages plus Ada and Obj-C++ on x86_64-pc-linux-gnu. Ok for apply? Regards, Kai Index: gcc/gcc/tree-ssa-reassoc.c === --- gcc.orig/gcc/tree-ssa-reassoc.c +++ gcc/gcc/tree-ssa-reassoc.c @@ -46,6 +46,7 @@ along with GCC; see the file COPYING3. /* Forwarders. */ static gimple build_and_add_sum (tree, tree, tree, enum tree_code); +static void remove_stmt_chain (tree); /* This is a simple global reassociation pass. It is, in part, based on the LLVM pass of the same name (They do some things more/less @@ -53,8 +54,11 @@ static gimple build_and_add_sum (tree, t It consists of five steps: -1. Breaking up subtract operations into addition + negate, where +1. Breaking up expressions +1.1. Breaking up subtract operations into addition + negate, where it would promote the reassociation of adds. +1.2. Breaking up to normalized form for bitwise-not operations +on bitwise-binary and for bitwise-not operation on compares. 2. Left linearization of the expression trees, so that (A+B)+(C+D) becomes (((A+B)+C)+D), which is easier for us to rewrite later. @@ -560,6 +564,265 @@ get_unary_op (tree name, enum tree_code return NULL_TREE; } +/* Create a temporary register expression with type TYPE, tree code CODE, and + operands OP1 and OP2. If REF_DEF is a valid gimple statement, we use its + location information for new generated temporary. + Function returns left-hand-side of new generated temporary register. */ + +static tree +make_new_tmp_statement (tree type, enum tree_code code, tree op1, tree op2, + gimple ref_def) +{ + gimple sum; + tree tmpvar = create_tmp_reg (type, NULL); + add_referenced_var (tmpvar); + sum = build_and_add_sum (tmpvar, op1, op2, code); + if (ref_def) +gimple_set_location (sum, gimple_location (ref_def)); + return gimple_get_lhs (sum); +} + +/* Perform on tree LHS with optional definition statement EXPR + the logic-not operation. TYPE is of kind boolean. */ + +static tree +expand_not_bitwise_binary (tree type, tree lhs, gimple expr) +{ + enum tree_code code = ERROR_MARK; + tree op1 = NULL, op2 = NULL; + gimple s1 = NULL, s2 = NULL; + + if (TREE_CODE (lhs) == INTEGER_CST) +return fold_build1 (BIT_NOT_EXPR, type, lhs); + + if (expr is_gimple_assign (expr)) +code = gimple_assign_rhs_code (expr); + + /* If statement lhs isn't a single-use statement, + we don't want to modify it. So we can do only default-case + operation for it. */ + if (code != ERROR_MARK !has_single_use (lhs)) +code = ERROR_MARK; + + if (TREE_CODE_CLASS (code) == tcc_comparison + || code == BIT_XOR_EXPR + || code == BIT_AND_EXPR + || code == BIT_IOR_EXPR) +{ + op1 = gimple_assign_rhs1 (expr); + op2 = gimple_assign_rhs2 (expr); +} + /* ~(~X) - X. */ + else if (code == BIT_NOT_EXPR) +return gimple_assign_rhs1 (expr); + else +return make_new_tmp_statement (TREE_TYPE (lhs), BIT_NOT_EXPR, lhs, + NULL_TREE, expr); + + /* ~(X cmp Y) - X cmp' Y, with cmp'=inverted comparison code, if allowed. + Otherwise fall through to default case. */ + if (TREE_CODE_CLASS (code) == tcc_comparison) +{ + enum tree_code ncode; + tree op1type = TREE_TYPE (op1); + + ncode = invert_tree_comparison (code, + HONOR_NANS (TYPE_MODE (op1type))); + if (ncode != ERROR_MARK) + return make_new_tmp_statement (type, ncode, op1, op2, expr); +} + /* Handle transformation for ~(A B) - ~A | ~B or ~(A | B) - ~A ~B. */ + else if (code == BIT_AND_EXPR || code == BIT_IOR_EXPR) +{ + /* See if left-hand operand is a gimple-assign, and has single-use. */ + if (TREE_CODE (op1) != SSA_NAME + || !(s1 = SSA_NAME_DEF_STMT (op1)) + || !is_gimple_assign (s1) + || !has_single_use (op1)) + s1 = NULL; + /* See if right-hand
[patch tree-optimization]: 3 of 6 Improve reassoc for bitwise operations
Hello, This patch adds to the break-up pass the facility to expand (X | Y) ==/!= 0 expression. This enables in later reassociation pass better results. ChangeLog 2011-10-07 Kai Tietz kti...@redhat.com * tree-ssa-reassoc.c (expand_cmp_ior): Helper for expanding (X | Y) ==/!= 0 statments. (break_up_bitwise_combined_stmt): Make use of expand_cmp_ior. 2011-10-07 Kai Tietz kti...@redhat.com * gcc.dg/tree-ssa/reassoc-cmpior-1.c: New file. * gcc.dg/tree-ssa/reassoc-cmpior-2.c: New file. * gcc.dg/tree-ssa/reassoc-cmpior-3.c: New file. Bootstrapped and regression-tested for all languages plus Ada and Obj-C++ on x86_64-pc-linux-gnu. Ok for apply? Regards, Kai Index: gcc/gcc/tree-ssa-reassoc.c === --- gcc.orig/gcc/tree-ssa-reassoc.c +++ gcc/gcc/tree-ssa-reassoc.c @@ -59,6 +59,8 @@ static void remove_stmt_chain (tree); it would promote the reassociation of adds. 1.2. Breaking up to normalized form for bitwise-not operations on bitwise-binary and for bitwise-not operation on compares. +1.3 Breaking up combined expression made out of boolean-typed bitwise +expressions for improving simplification. 2. Left linearization of the expression trees, so that (A+B)+(C+D) becomes (((A+B)+C)+D), which is easier for us to rewrite later. @@ -712,8 +714,89 @@ expand_not_bitwise_binary (tree type, tr NULL_TREE, expr); } +/* Routine to expand (X | Y) ==/!= 0 and doing + simplification on (X cmp Y) ==/!= 0. +- (X | Y) == 0 to (X == 0) (Y == 0) +- (X | Y) != 0 to (X != 0) | (Y != 0). +- (X cmp Y) == 0 to (X cmp' Y) with cmp'=invert of cmp. +- (X cmp Y) != 0 to (X cmp Y). + + The argument CODE can be either NE_EXPR, or EQ_EXPR. It indicates + what kind of expansion is performed. */ + +static tree +expand_cmp_ior (tree op, tree type, enum tree_code code) +{ + tree op1, op2; + gimple s = NULL; + enum tree_code hcode; + + /* Handle integral constant value case. */ + if (TREE_CODE (op) == INTEGER_CST) +{ + if (code == EQ_EXPR) +return fold_convert (type, (integer_zerop (op) ? integer_one_node + : integer_zero_node)); + return fold_convert (type, (!integer_zerop (op) ? integer_one_node + : integer_zero_node)); +} + + /* If operand OP isn't a gimple-assign, or has non-single use, + then simply creat a comparison != 0 for it. */ + if (TREE_CODE (op) != SSA_NAME + || !(s = SSA_NAME_DEF_STMT (op)) + || !is_gimple_assign (s) + || !has_single_use (op)) +return make_new_tmp_statement (type, code, op, + build_zero_cst (TREE_TYPE (op)), s); + + hcode = gimple_assign_rhs_code (s); + + /* Operand code of OP isn't of comparison kind, and not + a bitwise-not, then creat a comparison != 0 for it. */ + if (TREE_CODE_CLASS (hcode) != tcc_comparison + hcode != BIT_IOR_EXPR) +return make_new_tmp_statement (type, code, op, + build_zero_cst (TREE_TYPE (op)), s); + + op1 = gimple_assign_rhs1 (s); + op2 = gimple_assign_rhs2 (s); + + /* Simplify (X cmp Y) != 0 - (X cmp Y), and + (X cmp Y) == 0 - X cnp' Y, with cmp' = inverted cmp. */ + if (TREE_CODE_CLASS (hcode) == tcc_comparison) +{ + tree op1type = TREE_TYPE (op1); + + if (code == EQ_EXPR) +{ + enum tree_code ncode; + ncode = invert_tree_comparison (hcode, + HONOR_NANS (TYPE_MODE (op1type))); + if (ncode != ERROR_MARK) + return make_new_tmp_statement (type, ncode, op1, op2, s); +} + else +return make_new_tmp_statement (type, hcode, op1, op2, s); +} + + /* Break up (X | Y) ==/!= 0 case. */ + if (hcode == BIT_IOR_EXPR) +{ + op1 = expand_cmp_ior (op1, type, code); + op2 = expand_cmp_ior (op2, type, code); + return make_new_tmp_statement (type, (code == EQ_EXPR ? BIT_AND_EXPR + : BIT_IOR_EXPR), +op1, op2, s); +} + return make_new_tmp_statement (type, code, op, +build_zero_cst (TREE_TYPE (op)), s); +} + + /* Break up STMT if it is a combined statement made out of - bitwise operations. Handle expansion of ~(A op B). */ + bitwise operations. Handle expansion of ~(A op B), and + (A | B) !=/== 0. */ static bool break_up_bitwise_combined_stmt (gimple stmt) @@ -728,9 +811,13 @@ break_up_bitwise_combined_stmt (gimple s old_op1 = op1; old_op2 = op2 = NULL_TREE; + if (code == EQ_EXPR || code == NE_EXPR) +old_op2 = op2 = gimple_assign_rhs2 (stmt); + /* Check that CODE can be handled and that left-hand operand is of kind SSA_NAME. */ - if (code !=
[patch tree-optimization]: 5 of 6 Improve reassoc for bitwise operations
Hello, This patch adds to the break-up code the conversion for X ==/!= ~0 to ~X ==/!= 0. ChangeLog 2011-10-07 Kai Tietz kti...@redhat.com * tree-ssa-reassoc.c (break_up_bitwise_combined_stmt): Add handling for X !=/== 0 transformation to ~X !=/== 0. 2011-10-07 Kai Tietz kti...@redhat.com * gcc.dg/tree-ssa/reassoc-cmpior-4.c: New file. * gcc.dg/tree-ssa/reassoc-cmpior-5.c: New file. * gcc.dg/tree-ssa/reassoc-cmpior-6.c: New file. Bootstrapped and regression-tested for all languages plus Ada and Obj-C++ on x86_64-pc-linux-gnu. Ok for apply? Regards, Kai Index: gcc/gcc/tree-ssa-reassoc.c === --- gcc.orig/gcc/tree-ssa-reassoc.c +++ gcc/gcc/tree-ssa-reassoc.c @@ -795,8 +795,8 @@ expand_cmp_ior (tree op, tree type, enum /* Break up STMT if it is a combined statement made out of - bitwise operations. Handle expansion of ~(A op B), and - (A | B) !=/== 0. */ + bitwise operations. Handle expansion for ~(A op B), + for (A | B) !=/== 0, and transform X ==/!= ~0 to ~X ==/!= 0. */ static bool break_up_bitwise_combined_stmt (gimple stmt) @@ -821,6 +821,28 @@ break_up_bitwise_combined_stmt (gimple s || TREE_CODE (op1) != SSA_NAME) return false; + /* Transform X !=/== ~0 - ~X !=/== 0. */ + if ((code == EQ_EXPR || code == NE_EXPR) + INTEGRAL_TYPE_P (TREE_TYPE (op1)) + TREE_CODE (op2) == INTEGER_CST + integer_all_onesp (op2)) +{ + op1_def = SSA_NAME_DEF_STMT (op1); + if (!op1_def + || !is_gimple_assign (op1_def) + || !has_single_use (op1)) + op1_def = NULL; + op1 = expand_not_bitwise_binary (TREE_TYPE (op1), op1, op1_def); + op2 = build_zero_cst (TREE_TYPE (op1)); + + gsi = gsi_for_stmt (stmt); + gimple_assign_set_rhs_with_ops (gsi, code, op1, op2); + update_stmt (gsi_stmt (gsi)); + remove_stmt_chain (old_op1); + remove_stmt_chain (old_op2); + return true; +} + /* If left-hand operand isn't a gimple-assign, or isn't single-used, the we can't do anything. */ op1_def = SSA_NAME_DEF_STMT (op1); @@ -3216,6 +3238,8 @@ can_reassociate_p (tree op) Break up (X | Y) != 0 into (X != 0) | (Y != 0). + Break up X ==/!= ~0 to ~X ==/!= 0. + En passant, clear the GIMPLE visited flag on every statement. */ static void Index: gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-cmpior-4.c === --- /dev/null +++ gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-cmpior-4.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options -O2 -fdump-tree-optimized -ffast-math } */ + +int foo (int a, int b, int c, int d) +{ + int r1 = ~(a | b | c) == -1; + int r2 = (~(a | d | c) != -1) | (b == 0); + return ((~r1 == -1) | (~r2 != -1)); +} + +/* { dg-final { scan-tree-dump-times return 1 1 optimized} } */ +/* { dg-final { cleanup-tree-dump optimized } } */ + Index: gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-cmpior-5.c === --- /dev/null +++ gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-cmpior-5.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options -O2 -fdump-tree-optimized -ffast-math } */ + +int foo (int a, int b, int c, int d) +{ + int r1 = a != 0 c != 0 b != 0; + int r2 = a == 0 | b != 0 | d == 0; + return ((~r1 == -1) | (~r2 != -1)); +} + +/* { dg-final { scan-tree-dump-times return 1 1 optimized} } */ +/* { dg-final { cleanup-tree-dump optimized } } */ + Index: gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-cmpior-6.c === --- /dev/null +++ gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-cmpior-6.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options -O2 -fdump-tree-optimized -ffast-math } */ + +int foo (int a, int b, int c, int d) +{ + int r1 = a != 0 c != 0 b != 0; + int r2 = a == 0 | b != 0 | d == 0; + return ((~r1 != -1) (~r2 == -1)); +} + +/* { dg-final { scan-tree-dump-times return 0 1 optimized} } */ +/* { dg-final { cleanup-tree-dump optimized } } */ +
[patch tree-optimization]: 6 of 6 Improve reassoc for bitwise operations
Hello, This patch adds to the repropagation code the conversion for ~X ==/!= CST to X ==/!= CST' (with CST' = ~ CST). We need to do this back-conversion after initial bitwise-binary repropagation loop, as otherwise it would interfer. ChangeLog 2011-10-07 Kai Tietz kti...@redhat.com * tree-ssa-reassoc.c (repropagate_bitwise): Add handling for ~X !=/== CST conversion. 2011-10-07 Kai Tietz kti...@redhat.com * gcc.dg/tree-ssa/reassoc-repro_cmpior-4.c: New file. * gcc.dg/tree-ssa/reassoc-repro_cmpior-5.c: New file. * gcc.dg/tree-ssa/reassoc-repro_cmpior-6.c: New file. Bootstrapped and regression-tested for all languages plus Ada and Obj-C++ on x86_64-pc-linux-gnu. Ok for apply? Regards, Kai Index: gcc/gcc/tree-ssa-reassoc.c === --- gcc.orig/gcc/tree-ssa-reassoc.c +++ gcc/gcc/tree-ssa-reassoc.c @@ -3712,6 +3712,37 @@ repropagate_bitwise (basic_block bb) remove_stmt_chain (r); } + /* Now we are doing transformation ~X !=/== CST - X !=/== ~CST. */ + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (gsi)) +{ + gimple sub; + gimple stmt = gsi_stmt (gsi); + enum tree_code code; + tree l, r; + + if (!is_gimple_assign (stmt)) + continue; + + code = gimple_assign_rhs_code (stmt); + if (code != EQ_EXPR code != NE_EXPR) + continue; + l = gimple_assign_rhs1 (stmt); + r = gimple_assign_rhs2 (stmt); + if (TREE_CODE (l) != SSA_NAME + || TREE_CODE (r) != INTEGER_CST + || (sub = SSA_NAME_DEF_STMT (l)) == NULL + || !is_gimple_assign (sub) + || gimple_assign_rhs_code (sub) != BIT_NOT_EXPR + || !INTEGRAL_TYPE_P (TREE_TYPE (l))) + continue; + gimple_assign_set_rhs_with_ops (gsi, code, gimple_assign_rhs1 (sub), + fold_build1 (BIT_NOT_EXPR, + TREE_TYPE (l), r)); + update_stmt (stmt); + remove_stmt_chain (l); + remove_stmt_chain (r); +} + for (son = first_dom_son (CDI_DOMINATORS, bb); son; son = next_dom_son (CDI_DOMINATORS, son)) Index: gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-repro_cmpior-4.c === --- /dev/null +++ gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-repro_cmpior-4.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options -O2 -fdump-tree-optimized -ffast-math } */ + +int foo (int a, int b, int c, int d) +{ + int r = (a == -1) (b == -1); + int q = (c == -1) (d == -1); + return r q; +} + +int bar (int a, int b, int c, int d) +{ + int r = (a != -1) | (b != -1); + int q = (c != -1) | (d != -1); + return r | q; +} + +/* { dg-final { scan-tree-dump-times == -1 1 optimized} } */ +/* { dg-final { scan-tree-dump-times != -1 1 optimized} } */ +/* { dg-final { cleanup-tree-dump optimized } } */ + Index: gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-repro_cmpior-5.c === --- /dev/null +++ gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-repro_cmpior-5.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-options -O2 -fdump-tree-optimized -ffast-math } */ + +int foo (int a, char b, short c, long d) +{ + int r = (a == -1) (b == -1); + int q = (c == -1) (d == -1); + return r q; +} + +int bar (int a, char b, short c, long d) +{ + int r = (a != -1) | (b != -1); + int q = (c != -1) | (d != -1); + return r | q; +} + +/* { dg-final { scan-tree-dump-times == -1 1 optimized} } */ +/* { dg-final { scan-tree-dump-times != -1 1 optimized} } */ +/* { dg-final { cleanup-tree-dump optimized } } */ + Index: gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-repro_cmpior-6.c === --- /dev/null +++ gcc/gcc/testsuite/gcc.dg/tree-ssa/reassoc-repro_cmpior-6.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options -O2 -fdump-tree-optimized -ffast-math } */ + +int foo (int a, unsigned char b, unsigned short c, unsigned long d) +{ + unsigned char b1 = ~0; + unsigned short c1 = ~0; + unsigned long d1 = ~0; + int r = (a == -1) (b == b1); + int q = (c == c1) (d == d1); + return r q; +} + +int bar (int a, unsigned char b, unsigned short c, unsigned long d) +{ + unsigned char b1 = ~0; + unsigned short c1 = ~0; + unsigned long d1 = ~0; + int r = (a != -1) | (b != b1); + int q = (c != c1) | (d != d1); + return r | q; +} + +/* { dg-final { scan-tree-dump-times == -1 1 optimized} } */ +/* { dg-final { scan-tree-dump-times != -1 1 optimized} } */ +/* { dg-final { cleanup-tree-dump optimized } } */ +
[patch tree-optimization]: 4 of 6 Improve reassoc for bitwise operations
Hello, This patch adds to the repropagation pass for bitwise-expression the conversion of (X != 0) | (Y != 0) - (X | Y) != 0, and of (X == 0) (Y == 0) - (X | Y) == 0. ChangeLog 2011-10-07 Kai Tietz kti...@redhat.com * tree-ssa-reassoc.c (walk_bitwise_stmt_elems): Add new argument to store compare to zero elements. (merge_bitwise_compares): Helper to do reconstructing merged comparison block from vector by grouping. (operate_bitwise_stmt): Use merge_bitwise_compares. 2011-10-07 Kai Tietz kti...@redhat.com * gcc.dg/tree-ssa/reassoc-repro_cmpior-1.c: New file. * gcc.dg/tree-ssa/reassoc-repro_cmpior-2.c: New file. * gcc.dg/tree-ssa/reassoc-repro_cmpior-3.c: New file. Bootstrapped and regression-tested for all languages plus Ada and Obj-C++ on x86_64-pc-linux-gnu. Ok for apply? Regards, Kai Index: gcc/gcc/tree-ssa-reassoc.c === --- gcc.orig/gcc/tree-ssa-reassoc.c +++ gcc/gcc/tree-ssa-reassoc.c @@ -3110,16 +3110,18 @@ linearize_expr_tree (VEC(operand_entry_t add_to_ops_vec (ops, binrhs); } -/* Split up a binary tree-chain of code CODE - starting at STMT - into three +/* Split up a binary tree-chain of code CODE - starting at STMT - into four different kinds: - vector VCST stores constant values. - vector VNOT stores bitwise-not expressions. + - vector VCMP_ZERO stores comparisons to zero. - vector VEXRR stores the remaining rest. */ static void walk_bitwise_stmt_elems (gimple stmt, enum tree_code code, VEC(tree, heap) **vcst, VEC(tree, heap) **vnot, +VEC(tree, heap) **vcmp_zero, VEC(tree, heap) **vexpr) { gimple s; @@ -3134,9 +3136,19 @@ walk_bitwise_stmt_elems (gimple stmt, en || !has_single_use (l)) VEC_safe_push (tree, heap, *vexpr, l); else if (gimple_assign_rhs_code (s) == code) -walk_bitwise_stmt_elems (s, code, vcst, vnot, vexpr); +walk_bitwise_stmt_elems (s, code, vcst, vnot, vcmp_zero, vexpr); else if (gimple_assign_rhs_code (s) == BIT_NOT_EXPR) VEC_safe_push (tree, heap, *vnot, l); + /* (A == 0) (B == 0) - (A | B) == 0 + (A != 0) | (B != 0) - (A | B) != 0. */ + else if (((code == BIT_AND_EXPR + gimple_assign_rhs_code (s) == EQ_EXPR) + || (code == BIT_IOR_EXPR +gimple_assign_rhs_code (s) == NE_EXPR)) + INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (s))) + TREE_CODE (gimple_assign_rhs2 (s)) == INTEGER_CST + integer_zerop (gimple_assign_rhs2 (s))) +VEC_safe_push (tree, heap, *vcmp_zero, l); else VEC_safe_push (tree, heap, *vexpr, l); @@ -3153,9 +3165,19 @@ walk_bitwise_stmt_elems (gimple stmt, en || !has_single_use (l)) VEC_safe_push (tree, heap, *vexpr, l); else if (gimple_assign_rhs_code (s) == code) -walk_bitwise_stmt_elems (s, code, vcst, vnot, vexpr); +walk_bitwise_stmt_elems (s, code, vcst, vnot, vcmp_zero, vexpr); else if (gimple_assign_rhs_code (s) == BIT_NOT_EXPR) VEC_safe_push (tree, heap, *vnot, l); + /* (A == 0) (B == 0) - (A | B) == 0 + (A != 0) | (B != 0) - (A | B) != 0. */ + else if (((code == BIT_AND_EXPR + gimple_assign_rhs_code (s) == EQ_EXPR) + || (code == BIT_IOR_EXPR +gimple_assign_rhs_code (s) == NE_EXPR)) + INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_rhs1 (s))) + TREE_CODE (gimple_assign_rhs2 (s)) == INTEGER_CST + integer_zerop (gimple_assign_rhs2 (s))) +VEC_safe_push (tree, heap, *vcmp_zero, l); else VEC_safe_push (tree, heap, *vexpr, l); } @@ -3289,6 +3311,209 @@ operate_bitwise_xor_stmt (gimple_stmt_it return true; } +/* This function merges:compares + It merges VCMP elements + - (X != 0) | (Y != 0) - (X | Y) != 0 + - (X == 0) (Y == 0) - (X | Y) == 0. + Additionally it sorts and merges for the new generated left-hand + bitwise-or tree-chain the bitwise-not expressions. + + CODE specifies the final compare expression code. It can be either + EQ_EXPR, or NE_EXPR. + + If PGSI is not NULL, then final compare instruction + gets assigned to the statement it points to. Otherwise an new + temporary is created for the comparison and stored in VEXPR vector. + + Special note: We try to merge first elements of compatible + types, before doing final merge by casting up to widest type. + For the bitwise-and case, we need to make sure sign-expansion is + done always for type-expansion. */ + +static void +merge_bitwise_compares (VEC(tree, heap) **vcmp, VEC(tree, heap) **vexpr, + enum tree_code code, gimple_stmt_iterator *pgsi) +{ + unsigned int i; + unsigned int len = VEC_length (tree, *vcmp); + tree l, r, x, cmp_type = NULL_TREE; + VEC(tree, heap) *vtmp = NULL; + VEC(tree, heap) *vtmp_not = NULL; + enum tree_code cmp_code; +
Re: [testsuite] Disable ABI warnings for gcc.c-torture/execute/vector-compare-2.c (PR tree-optimization/50575)
On Oct 7, 2011, at 4:53 AM, Rainer Orth wrote: gcc.c-torture/execute/vector-compare-2.c was FAILing on Solaris 8 and 9/x86 with ABI warnings Closer investigation revealed a mess: So, the compile testsuite does: gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] -w in compile.exp. So, to be similar, would a better fix be to add a -w to the execute.exp script someplace. Not a huge fan of -w, but... I like predictability and similarity.
Fix 2 avx256 test cases for avx2
When Jakub added the 'i' alternatives for avx2, these broke. r~ * gcc.target/i386/avx256-unaligned-load-2.c: Tweek vinsert pattern match for avx2. * gcc.target/i386/avx256-unaligned-store-2.c: Similarly. diff --git a/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-2.c b/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-2.c index 7d188e2..f1d7979 100644 --- a/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-2.c +++ b/gcc/testsuite/gcc.target/i386/avx256-unaligned-load-2.c @@ -26,4 +26,4 @@ avx_test (void) /* { dg-final { scan-assembler-not \\*avx_movdqu256/1 } } */ /* { dg-final { scan-assembler \\*sse2_movdqu/1 } } */ -/* { dg-final { scan-assembler vinsertf128 } } */ +/* { dg-final { scan-assembler vinsert.128 } } */ diff --git a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c index d8ae5a9..3339cc5 100644 --- a/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c +++ b/gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c @@ -26,4 +26,4 @@ avx_test (void) /* { dg-final { scan-assembler-not \\*avx_movdqu256/2 } } */ /* { dg-final { scan-assembler vmovdqu.*\\*movv16qi_internal/3 } } */ -/* { dg-final { scan-assembler vextractf128 } } */ +/* { dg-final { scan-assembler vextract.128 } } */
[PATCH] Fix VIS3 assembler check and conditionalize testsuite on VIS3 support.
Committed to trunk. gcc/ PR 50655 * configure.ac: Add .register directives to VIS3 test. * configure: Regenerate. gcc/testsuite/ PR 50655 * gcc.target/sparc/sparc.exp: Add vis3 target test. * gcc.target/sparc/cmask.c: Use it. * gcc.target/sparc/fhalve.c: Likewise. * gcc.target/sparc/fnegop.c: Likewise. * gcc.target/sparc/fpadds.c: Likewise. * gcc.target/sparc/fshift.c: Likewise. * gcc.target/sparc/fucmp.c: Likewise. * gcc.target/sparc/lzd.c: Likewise. * gcc.target/sparc/vis3misc.c: Likewise. * gcc.target/sparc/xmul.c: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@179667 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog |6 ++ gcc/configure |2 ++ gcc/configure.ac |2 ++ gcc/testsuite/ChangeLog | 16 +++- gcc/testsuite/gcc.target/sparc/cmask.c|2 +- gcc/testsuite/gcc.target/sparc/fhalve.c |2 +- gcc/testsuite/gcc.target/sparc/fnegop.c |2 +- gcc/testsuite/gcc.target/sparc/fpadds.c |2 +- gcc/testsuite/gcc.target/sparc/fshift.c |2 +- gcc/testsuite/gcc.target/sparc/fucmp.c|2 +- gcc/testsuite/gcc.target/sparc/lzd.c |2 +- gcc/testsuite/gcc.target/sparc/sparc.exp | 11 +++ gcc/testsuite/gcc.target/sparc/vis3misc.c |2 +- gcc/testsuite/gcc.target/sparc/xmul.c |2 +- 14 files changed, 45 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f840e46..573ce6e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-10-07 David S. Miller da...@davemloft.net + + PR 50655 + * configure.ac: Add .register directives to VIS3 test. + * configure: Regenerate. + 2011-10-07 Richard Henderson r...@redhat.com * config.gcc (x86_64-*): Add core-avx-i, core-avx2 for with_cpu. diff --git a/gcc/configure b/gcc/configure index ac32705..cb55dda 100755 --- a/gcc/configure +++ b/gcc/configure @@ -24060,6 +24060,8 @@ else gcc_cv_as_sparc_fmaf=no if test x$gcc_cv_as != x; then $as_echo '.text + .register %g2, #scratch + .register %g3, #scratch .align 4 fmaddd %f0, %f2, %f4, %f6 addxccc %g1, %g2, %g3 diff --git a/gcc/configure.ac b/gcc/configure.ac index ed52c91..a7b94e6 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -3491,6 +3491,8 @@ foo: gcc_cv_as_sparc_fmaf,, [-xarch=v9d], [.text + .register %g2, #scratch + .register %g3, #scratch .align 4 fmaddd %f0, %f2, %f4, %f6 addxccc %g1, %g2, %g3 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aff35a6..ea79b60 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,17 @@ +2011-10-07 David S. Miller da...@davemloft.net + + PR 50655 + * gcc.target/sparc/sparc.exp: Add vis3 target test. + * gcc.target/sparc/cmask.c: Use it. + * gcc.target/sparc/fhalve.c: Likewise. + * gcc.target/sparc/fnegop.c: Likewise. + * gcc.target/sparc/fpadds.c: Likewise. + * gcc.target/sparc/fshift.c: Likewise. + * gcc.target/sparc/fucmp.c: Likewise. + * gcc.target/sparc/lzd.c: Likewise. + * gcc.target/sparc/vis3misc.c: Likewise. + * gcc.target/sparc/xmul.c: Likewise. + 2011-10-07 Richard Henderson r...@redhat.com * gcc.target/i386/avx256-unaligned-load-2.c: Tweek vinsert pattern @@ -17,7 +31,7 @@ 2011-10-06 Joern Rennecke joern.renne...@embecosm.com * gcc.dg/pr47276.c (ASMNAME, ASMNAME2, STRING): Define. - (__EI___vsyslog_chk, __EI_syslog, __EI_vsyslog): Use ASMNAME. + (__EI___vsyslog_chk, __EI_syslog, __EI_vsyslog): Use ASMNAME. (syslog, vsyslog, __vsyslog_chk): Likewise. * gcc.dg/lto/20081222_1.c (ASMNAME, ASMNAME2, STRING): Define. diff --git a/gcc/testsuite/gcc.target/sparc/cmask.c b/gcc/testsuite/gcc.target/sparc/cmask.c index b3168ec..989274c 100644 --- a/gcc/testsuite/gcc.target/sparc/cmask.c +++ b/gcc/testsuite/gcc.target/sparc/cmask.c @@ -1,4 +1,4 @@ -/* { dg-do compile } */ +/* { dg-do compile { target { vis3 } } } */ /* { dg-options -mcpu=niagara3 -mvis } */ void test_cm8 (long x) diff --git a/gcc/testsuite/gcc.target/sparc/fhalve.c b/gcc/testsuite/gcc.target/sparc/fhalve.c index 340b936..737fc71 100644 --- a/gcc/testsuite/gcc.target/sparc/fhalve.c +++ b/gcc/testsuite/gcc.target/sparc/fhalve.c @@ -1,4 +1,4 @@ -/* { dg-do compile } */ +/* { dg-do compile { target { vis3 } } } */ /* { dg-options -mcpu=niagara3 -mvis } */ float test_fhadds (float x, float y) diff --git a/gcc/testsuite/gcc.target/sparc/fnegop.c b/gcc/testsuite/gcc.target/sparc/fnegop.c index 25f8c19..3e3e72c 100644 --- a/gcc/testsuite/gcc.target/sparc/fnegop.c +++ b/gcc/testsuite/gcc.target/sparc/fnegop.c @@ -1,4 +1,4 @@ -/* { dg-do compile } */ +/* { dg-do
Re: [Patch,AVR] Fix PR50652
2011/10/7 Georg-Johann Lay a...@gjlay.de: Fix of wrong data_section_start for ATmega164A. Ok? Johann PR target/50652 * config/avr/avr-mcus.def (AVR_MCU): Set .data_section_start of atmega164a to 0x100. Approved. Denis.
Fix avx2 incorrect representations of shifts
On 10/05/2011 12:07 PM, Uros Bizjak wrote: We already have V2TImode, but hidden in VIMAX_AVX2 mode iterator. Based on that, I would suggest that we model correct insn functionality and try to avoid unspec. On the related note, there is no move insn for V2TImode, so V2TI should be added to V16 mode iterator and a couple of other places (please grep for V1TImode, used for SSE full-register shift insns only). Ah, so we do. And, interestingly, we already had a pattern for the shifts using that VIMAX_AVX2 iterator. At the same time I found that palignr was using the wrong mode, so I fixed that too. Tested --with-cpu=core-avx2 on the intel sde. Committed. r~ + * config/i386/i386.c (bdesc_args): Update code for + __builtin_ia32_palignr256. Change type of __builtin_ia32_pslldqi256, + and __builtin_ia32_psrldqi256 to V4DI_FTYPE_V4DI_INT_CONVERT. + (ix86_expand_args_builtin): Handle V4DI_FTYPE_V4DI_INT_CONVERT. + * config/i386/sse.md (mode iterator V16): Add V2TI. + (mode iterator SSESCALARMODE): Use V2TI not V4DI. + (mode attr ssse3_avx2): Add V2TI. + (avx2_lshrqv4di3, avx2_lshlqv4di3): Remove. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 85dccf9..9611f1f 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -26107,7 +26107,7 @@ static const struct builtin_description bdesc_args[] = { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_ssaddv16hi3, __builtin_ia32_paddsw256, IX86_BUILTIN_PADDSW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V16HI }, { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_usaddv32qi3, __builtin_ia32_paddusb256, IX86_BUILTIN_PADDUSB256, UNKNOWN, (int) V32QI_FTYPE_V32QI_V32QI }, { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_usaddv16hi3, __builtin_ia32_paddusw256, IX86_BUILTIN_PADDUSW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V16HI }, - { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_palignrv4di, __builtin_ia32_palignr256, IX86_BUILTIN_PALIGNR256, UNKNOWN, (int) V4DI_FTYPE_V4DI_V4DI_INT_CONVERT }, + { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_palignrv2ti, __builtin_ia32_palignr256, IX86_BUILTIN_PALIGNR256, UNKNOWN, (int) V4DI_FTYPE_V4DI_V4DI_INT_CONVERT }, { OPTION_MASK_ISA_AVX2, CODE_FOR_andv4di3, __builtin_ia32_andsi256, IX86_BUILTIN_AND256I, UNKNOWN, (int) V4DI_FTYPE_V4DI_V4DI }, { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_andnotv4di3, __builtin_ia32_andnotsi256, IX86_BUILTIN_ANDNOT256I, UNKNOWN, (int) V4DI_FTYPE_V4DI_V4DI }, { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_uavgv32qi3, __builtin_ia32_pavgb256, IX86_BUILTIN_PAVGB256, UNKNOWN, (int) V32QI_FTYPE_V32QI_V32QI }, @@ -26171,7 +26171,7 @@ static const struct builtin_description bdesc_args[] = { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_psignv32qi3, __builtin_ia32_psignb256, IX86_BUILTIN_PSIGNB256, UNKNOWN, (int) V32QI_FTYPE_V32QI_V32QI }, { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_psignv16hi3, __builtin_ia32_psignw256, IX86_BUILTIN_PSIGNW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V16HI }, { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_psignv8si3 , __builtin_ia32_psignd256, IX86_BUILTIN_PSIGND256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V8SI }, - { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_lshlqv4di3, __builtin_ia32_pslldqi256, IX86_BUILTIN_PSLLDQI256, UNKNOWN, (int) V4DI_FTYPE_V4DI_INT }, + { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_ashlv2ti3, __builtin_ia32_pslldqi256, IX86_BUILTIN_PSLLDQI256, UNKNOWN, (int) V4DI_FTYPE_V4DI_INT_CONVERT }, { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_lshlv16hi3, __builtin_ia32_psllwi256, IX86_BUILTIN_PSLLWI256 , UNKNOWN, (int) V16HI_FTYPE_V16HI_SI_COUNT }, { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_lshlv16hi3, __builtin_ia32_psllw256, IX86_BUILTIN_PSLLW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V8HI_COUNT }, { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_lshlv8si3, __builtin_ia32_pslldi256, IX86_BUILTIN_PSLLDI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_SI_COUNT }, @@ -26182,7 +26182,7 @@ static const struct builtin_description bdesc_args[] = { OPTION_MASK_ISA_AVX2, CODE_FOR_ashrv16hi3, __builtin_ia32_psraw256, IX86_BUILTIN_PSRAW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V8HI_COUNT }, { OPTION_MASK_ISA_AVX2, CODE_FOR_ashrv8si3, __builtin_ia32_psradi256, IX86_BUILTIN_PSRADI256, UNKNOWN, (int) V8SI_FTYPE_V8SI_SI_COUNT }, { OPTION_MASK_ISA_AVX2, CODE_FOR_ashrv8si3, __builtin_ia32_psrad256, IX86_BUILTIN_PSRAD256, UNKNOWN, (int) V8SI_FTYPE_V8SI_V4SI_COUNT }, - { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_lshrqv4di3, __builtin_ia32_psrldqi256, IX86_BUILTIN_PSRLDQI256, UNKNOWN, (int) V4DI_FTYPE_V4DI_INT }, + { OPTION_MASK_ISA_AVX2, CODE_FOR_avx2_lshrv2ti3, __builtin_ia32_psrldqi256, IX86_BUILTIN_PSRLDQI256, UNKNOWN, (int) V4DI_FTYPE_V4DI_INT_CONVERT }, { OPTION_MASK_ISA_AVX2, CODE_FOR_lshrv16hi3, __builtin_ia32_psrlwi256, IX86_BUILTIN_PSRLWI256 , UNKNOWN, (int) V16HI_FTYPE_V16HI_SI_COUNT }, { OPTION_MASK_ISA_AVX2, CODE_FOR_lshrv16hi3, __builtin_ia32_psrlw256, IX86_BUILTIN_PSRLW256, UNKNOWN, (int) V16HI_FTYPE_V16HI_V8HI_COUNT }, { OPTION_MASK_ISA_AVX2, CODE_FOR_lshrv8si3,
[pph] De-inline streamer functions. (issue5245043)
Move several static inline functions from pph-streamer.h to pph-streamer-{out,in}.c. This is part 1 of several patches, and minimizes diffs. Index: gcc/cp/ChangeLog.pph 2011-10-07 Lawrence Crowl cr...@google.com * pph-streamer.h (pph_out_tree_array): Remove unused. (pph_in_tree_array): Remove unused. (pph_in_tree_VEC): Remove unused. (pph_out_uint): Moved to pph-streamer-out.c as extern. (pph_out_record_marker): Likewise. (pph_out_chain): Moved to pph-streamer-out.c as static. (pph_out_mergeable_chain): Likewise. (pph_out_bitpack): Likewise. (pph_in_uint): Moved to pph-streamer-in.c as extern. (pph_in_location): Likewise. (pph_in_tree): Likewise. (pph_in_record_marker): Likewise. (pph_in_uhwi): Moved to pph-streamer-in.c as static. (pph_in_hwi): Likewise. (pph_in_uchar): Likewise. (pph_in_bytes): Likewise. Index: gcc/cp/pph-streamer-in.c === --- gcc/cp/pph-streamer-in.c(revision 179636) +++ gcc/cp/pph-streamer-in.c(working copy) @@ -146,6 +146,89 @@ pph_init_read (pph_stream *stream) } +/* Read an unsigned char VALUE to STREAM. */ +static unsigned char +pph_in_uchar (pph_stream *stream) +{ + unsigned char n = streamer_read_uchar (stream-encoder.r.ib); + if (flag_pph_tracer = 4) +pph_trace_uint (stream, n); + return n; +} + +/* Read a HOST_WIDE_INT from STREAM. */ +static inline HOST_WIDE_INT +pph_in_hwi (pph_stream *stream) +{ + return streamer_read_hwi (stream-encoder.r.ib); +} + + +/* Read an unsigned HOST_WIDE_INT from STREAM. */ +static inline unsigned HOST_WIDE_INT +pph_in_uhwi (pph_stream *stream) +{ + return streamer_read_uhwi (stream-encoder.r.ib); +} + + +/* Read an unsigned integer from STREAM. */ +unsigned int +pph_in_uint (pph_stream *stream) +{ + HOST_WIDE_INT unsigned n = streamer_read_uhwi (stream-encoder.r.ib); + gcc_assert (n == (unsigned) n); + if (flag_pph_tracer = 4) +pph_trace_uint (stream, n); + return (unsigned) n; +} + + +/* Read N bytes from STREAM into P. The caller is responsible for + allocating a sufficiently large buffer. */ +static void +pph_in_bytes (pph_stream *stream, void *p, size_t n) +{ + lto_input_data_block (stream-encoder.r.ib, p, n); + if (flag_pph_tracer = 4) +pph_trace_bytes (stream, p, n); +} + + +/* Read and return a string from STREAM. */ + +static const char * +pph_in_string (pph_stream *stream) +{ + const char *s = streamer_read_string (stream-encoder.r.data_in, +stream-encoder.r.ib); + if (flag_pph_tracer = 4) +pph_trace_string (stream, s); + return s; +} + + +/* Read and return a record marker from STREAM. On return, *TAG_P will + contain the tag for the data type stored in this record. */ +enum pph_record_marker +pph_in_record_marker (pph_stream *stream, enum pph_tag *tag_p) +{ + enum pph_record_marker m = (enum pph_record_marker) pph_in_uchar (stream); + gcc_assert (m == PPH_RECORD_START + || m == PPH_RECORD_START_NO_CACHE + || m == PPH_RECORD_START_MUTATED + || m == PPH_RECORD_END + || m == PPH_RECORD_IREF + || m == PPH_RECORD_XREF + || m == PPH_RECORD_PREF); + + *tag_p = (enum pph_tag) pph_in_uint (stream); + gcc_assert ((unsigned) *tag_p (unsigned) PPH_NUM_TAGS); + + return m; +} + + /* Read and return a record header from STREAM. EXPECTED_TAG indicates the data type that should be stored in this record. When a PPH_RECORD_START marker is read, the next word read is an index @@ -237,6 +320,22 @@ pph_read_location (struct lto_input_bloc } +/* Read and return a location_t from STREAM. + FIXME pph: If pph_trace didn't depend on STREAM, we could avoid having to + call this function, only for it to call lto_input_location, which calls the + streamer hook back to pph_read_location. */ + +location_t +pph_in_location (pph_stream *stream) +{ + location_t loc = pph_read_location (stream-encoder.r.ib, + stream-encoder.r.data_in); + if (flag_pph_tracer = 4) +pph_trace_location (stream, loc); + return loc; +} + + /* Load the tree value associated with TOKEN from STREAM. */ static void @@ -2280,6 +2379,16 @@ pph_read_tree (struct lto_input_block *i } +/* Load an AST from STREAM. Return the corresponding tree. */ +tree +pph_in_tree (pph_stream *stream) +{ + tree t = pph_read_any_tree (stream, NULL); + if (flag_pph_tracer = 4) +pph_trace_tree (stream, t); + return t; +} + /* Read a mergeable tree from STREAM into CHAIN. */ tree Index: gcc/cp/pph-streamer.h === --- gcc/cp/pph-streamer.h (revision 179636) +++ gcc/cp/pph-streamer.h (working copy) @@ -439,21 +439,6 @@ pph_cache_find (pph_stream *stream, enum return e-data; }
[testsuite] suppress warnings for powerpc for graphite vector test
Test gcc.dg/graphite/id-pr46845.c turns off warnings for x86 targets. powerpc targets warn about ABI issues with vector arguments for this test, so this patch includes powerpc*-*-* in the list of targets to turn off warnings. OK for trunk? 2011-10-07 Janis Johnson jani...@codesourcery.com * gcc.dg/graphite/id-pr46845.c: Include powerpc for warning options. Index: gcc/testsuite/gcc.dg/graphite/id-pr46845.c === --- gcc/testsuite/gcc.dg/graphite/id-pr46845.c (revision 179667) +++ gcc/testsuite/gcc.dg/graphite/id-pr46845.c (working copy) @@ -1,4 +1,4 @@ -/* { dg-options -O2 -ffast-math -fgraphite-identity -w -Wno-psabi { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-options -O2 -ffast-math -fgraphite-identity -w -Wno-psabi { target { i?86-*-* x86_64-*-* powerpc*-*-* } } } */ typedef float V2SF __attribute__ ((vector_size (128)));
Re: [testsuite] suppress warnings for powerpc for graphite vector test
On Oct 7, 2011, at 12:50 PM, Janis Johnson wrote: Test gcc.dg/graphite/id-pr46845.c turns off warnings for x86 targets. powerpc targets warn about ABI issues with vector arguments for this test, so this patch includes powerpc*-*-* in the list of targets to turn off warnings. OK for trunk? I'm hoping the graphite people have an even a better idea... If not, Ok.
Commit revisions (was: Re: [Patch, fortran] [00/21] Remove coarray support in the scalarizer)
On Friday 30 September 2011 18:51:21 Steve Kargl wrote: Mikael, I've finally made it through the set of patches, and did not find anything that raised a red flag. I'll note that I did not study the issue/question you raised with patch 6. Tobias is probably the best person to offer an opinion. After pinging patch 6 off of Tobias, I think the code can be committed. Thanks, I have (finally) committed the patches. Here are the commit revisions: 01: 179671 02: 179672 03: 179674 04: 179675 05: 179676 06: skipped 07: 179677 08: 179679 09: 179680 10: 179681 11: 179682 12: 179683 13: 179684 14: 179685 15: 179686 16: 179689 17: 179690 18: 179691 19: 179692 20: 179693 21: 179694 Mikael
Re: [Patch, Fortran, OOP] PR 50625: [4.6/4.7 Regression] ALLOCATABLE attribute lost for module CLASS variables
2011/10/7 Janus Weil ja...@gcc.gnu.org: Regtested successfully on x86_64-unknown-linux-gnu (except for failure on entry_4 and select_type_12, which are known middle-end regressions). Ok for trunk and 4.6? OK. Thanks for the patch Thanks for the review. Committed to trunk as r179660. ... and to the 4.6 branch as r179696. Cheers, Janus 2011-10-07 Janus Weilja...@gcc.gnu.org PR fortran/50625 * class.c (gfc_build_class_symbol): Fix whitespace. * module.c (mio_symbol): Set 'class_ok' attribute. * trans-decl.c (gfc_get_symbol_decl): Make sure the backend_decl has been built for class symbols. 2011-10-07 Janus Weilja...@gcc.gnu.org PR fortran/50625 * gfortran.dg/class_46.f03: New.
[i386, avx2] Fix representation of the 256-bit vpblendw
A representation with vec_merge and a 0..255 constant is incorrect. Both 128-bit lanes are merged with the same pattern, thus the rtl-level vec_merge operand should replicate the imm8 operand into two bytes. I created an expander with the old name and old interface so that we can continue using it to implement the builtin. Tested with the intel sde. Committed. r~ * config/i386/predicates.md (avx2_pblendw_operand): New. * config/i386/sse.md (sse4_1_pblendw): Un-macroize. (avx2_pblendw, *avx2_pblendw): New expander and insn. diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md index 89cc8a7..9ac3f9d 100644 --- a/gcc/config/i386/predicates.md +++ b/gcc/config/i386/predicates.md @@ -1210,3 +1210,12 @@ return false; return true; }) + +;; Return true if OP is a proper third operand to vpblendw256. +(define_predicate avx2_pblendw_operand + (match_code const_int) +{ + HOST_WIDE_INT val = INTVAL (op); + HOST_WIDE_INT low = val 0xff; + return val == (low 8) | low; +}) diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index a7df221..9dc9b46 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -9417,11 +9417,11 @@ (set_attr prefix orig,vex) (set_attr mode sseinsnmode)]) -(define_insn sse4_1_avx2_pblendw - [(set (match_operand:VI2_AVX2 0 register_operand =x,x) - (vec_merge:VI2_AVX2 - (match_operand:VI2_AVX2 2 nonimmediate_operand xm,xm) - (match_operand:VI2_AVX2 1 register_operand 0,x) +(define_insn sse4_1_pblendw + [(set (match_operand:V8HI 0 register_operand =x,x) + (vec_merge:V8HI + (match_operand:V8HI 2 nonimmediate_operand xm,xm) + (match_operand:V8HI 1 register_operand 0,x) (match_operand:SI 3 const_0_to_255_operand n,n)))] TARGET_SSE4_1 @ @@ -9432,7 +9432,37 @@ (set_attr prefix_extra 1) (set_attr length_immediate 1) (set_attr prefix orig,vex) - (set_attr mode sseinsnmode)]) + (set_attr mode TI)]) + +;; The builtin uses an 8-bit immediate. Expand that. +(define_expand avx2_pblendw + [(set (match_operand:V16HI 0 register_operand ) + (vec_merge:V16HI + (match_operand:V16HI 2 nonimmediate_operand ) + (match_operand:V16HI 1 register_operand ) + (match_operand:SI 3 const_0_to_255_operand )))] + TARGET_AVX2 +{ + HOST_WIDE_INT val = INTVAL (operands[3]) 0xff; + operands[3] = GEN_INT (val 8 | val); +}) + +(define_insn *avx2_pblendw + [(set (match_operand:V16HI 0 register_operand =x) + (vec_merge:V16HI + (match_operand:V16HI 2 nonimmediate_operand xm) + (match_operand:V16HI 1 register_operand x) + (match_operand:SI 3 avx2_pblendw_operand n)))] + TARGET_SSE4_1 +{ + operands[3] = GEN_INT (INTVAL (operands[3]) 0xff); + return vpblendw\t{%3, %2, %1, %0|%0, %1, %2, %3}; +} + [(set_attr type ssemov) + (set_attr prefix_extra 1) + (set_attr length_immediate 1) + (set_attr prefix vex) + (set_attr mode OI)]) (define_insn avx2_pblenddmode [(set (match_operand:VI4_AVX2 0 register_operand =x)
Re: [Patch, Fortran, committed] PR 50585: [4.6/4.7 Regression] ICE with assumed length character array argument
I have just committed as obvious a one-line patch to fix a regression which is triggered by -fwhole-file: http://gcc.gnu.org/viewcvs?root=gccview=revrev=179413 Should I backport to 4.6? And also to 4.5? Yes, please backport to 4.6. If you want, you can also backport to 4.5. However, I do not think that -fwhole-file gets used in 4.5 - especially, as it has some issues. Fixed on the 4.6 branch with r179696. It's probably not worth to backport to 4.5 ... Cheers, Janus
De-inline streamer functions part 2 (issue5250042)
Move several static inline functions from pph-streamer.h to pph-streamer-{out,in}.c. This is part 2 of several patches, and minimizes diffs. Index: gcc/cp/ChangeLog.pph 2011-10-07 Lawrence Crowl cr...@google.com * pph-streamer.h (pph_in_chain): Moved to pph-streamer-in.c as extern. (pph_read_mergeable_tree): Make static in pph-streamer-in.c. (pph_read_mergeable_chain): Likewise (pph_in_mergeable_tree): Moved to pph-streamer-in.c as static. (pph_in_mergeable_chain): Likewise. (pph_in_bitpack): Likewise. (pph_in_chain): Likewise. (pph_out_location): Moved to pph-streamer-out.c extern. (pph_out_tree): Likewise. (pph_out_tree_1): Moved to pph-streamer-out.c as static. (pph_out_mergeable_tree): Likewise. (pph_tree_code_to_tag): Comment unused. (pph_tag_to_tree_code): Likewise. Index: gcc/cp/pph-streamer-in.c === --- gcc/cp/pph-streamer-in.c(revision 179673) +++ gcc/cp/pph-streamer-in.c(working copy) @@ -208,6 +208,17 @@ pph_in_string (pph_stream *stream) } +/* Read a bitpack from STREAM. */ +static struct bitpack_d +pph_in_bitpack (pph_stream *stream) +{ + struct bitpack_d bp = streamer_read_bitpack (stream-encoder.r.ib); + if (flag_pph_tracer = 4) +pph_trace_bitpack (stream, bp); + return bp; +} + + /* Read and return a record marker from STREAM. On return, *TAG_P will contain the tag for the data type stored in this record. */ enum pph_record_marker @@ -608,6 +619,29 @@ pph_in_label_binding (pph_stream *stream } +/* Read a chain of ASTs from STREAM. */ +static tree +pph_in_chain (pph_stream *stream) +{ + tree t = streamer_read_chain (stream-encoder.r.ib, +stream-encoder.r.data_in); + if (flag_pph_tracer = 2) +pph_trace_chain (stream, t); + return t; +} + + +static void pph_read_mergeable_chain (pph_stream *stream, tree* chain); + + +/* Read and merge a chain of ASTs from STREAM into an existing CHAIN. */ +static inline void +pph_in_mergeable_chain (pph_stream *stream, tree* chain) +{ + pph_read_mergeable_chain (stream, chain); +} + + /* Read and return an instance of cp_binding_level from STREAM. TO_REGISTER is used when the caller wants to read a binding level, but register a different binding level in the streaming cache. @@ -2389,15 +2423,27 @@ pph_in_tree (pph_stream *stream) return t; } + /* Read a mergeable tree from STREAM into CHAIN. */ -tree +static tree pph_read_mergeable_tree (pph_stream *stream, tree *chain) { return pph_read_any_tree (stream, chain); } +/* Load an AST in an ENCLOSING_NAMESPACE from STREAM. + Return the corresponding tree. */ +static void +pph_in_mergeable_tree (pph_stream *stream, tree *chain) +{ + tree t = pph_read_mergeable_tree (stream, chain); + if (flag_pph_tracer = 3) +pph_trace_tree (stream, t); +} + + /* Read a chain of tree nodes from STREAM. */ void Index: gcc/cp/pph-streamer-out.c === --- gcc/cp/pph-streamer-out.c (revision 179673) +++ gcc/cp/pph-streamer-out.c (working copy) @@ -204,6 +204,17 @@ pph_write_location (struct output_block } +/* Write location LOC of length to STREAM. */ + +void +pph_out_location (pph_stream *stream, location_t loc) +{ + if (flag_pph_tracer = 4) +pph_trace_location (stream, loc); + pph_write_location (stream-encoder.w.ob, loc); +} + + /* Write a chain of ASTs to STREAM starting with FIRST. */ static void pph_out_chain (pph_stream *stream, tree first) @@ -609,6 +620,37 @@ pph_out_token_cache (pph_stream *f, cp_t pph_out_token (f, tok); } + +/* Output AST T to STREAM. If -fpph-tracer is set to TLEVEL or + higher, T is sent to pph_trace_tree. */ +static void +pph_out_tree_1 (pph_stream *stream, tree t, int tlevel) +{ + if (flag_pph_tracer = tlevel) +pph_trace_tree (stream, t); + pph_write_tree (stream-encoder.w.ob, t, false); +} + +/* Output AST T to STREAM. Trigger tracing at -fpph-tracer=2. */ +void +pph_out_tree (pph_stream *stream, tree t) +{ + pph_out_tree_1 (stream, t, 2); +} + +static void pph_write_mergeable_tree (pph_stream *stream, tree expr); + +/* Output AST T from ENCLOSING_NAMESPACE to STREAM. + Trigger tracing at -fpph-tracer=2. */ +static void +pph_out_mergeable_tree (pph_stream *stream, tree t) +{ + if (flag_pph_tracer = 2) +pph_trace_tree (stream, t); + pph_write_mergeable_tree (stream, t); +} + + /* Write all the fields in lang_decl_base instance LDB to OB. */ static void Index: gcc/cp/pph-streamer.h === --- gcc/cp/pph-streamer.h (revision 179673) +++ gcc/cp/pph-streamer.h (working copy) @@ -336,7 +336,9 @@ unsigned pph_get_signature (tree, size_t void pph_flush_buffers (pph_stream *); void pph_init_write (pph_stream *); void
Re: [patch tree-optimization]: Improve handling of conditional-branches on targets with high branch costs
Hello, this is the updated version with the suggestion 2011/10/7 Richard Guenther richard.guent...@gmail.com: On Thu, Oct 6, 2011 at 4:25 PM, Kai Tietz kti...@redhat.com wrote: + ((TREE_CODE_CLASS (TREE_CODE (arg1)) != tcc_comparison + TREE_CODE (arg1) != TRUTH_NOT_EXPR + simple_operand_p (arg1)) As I said previously simple_operand_p already rejects covers comparisons and TRUTH_NOT_EXPR. Also arg1 had better TREE_SIDE_EFFECTS set if the comparison might trap, as it might just be hidden in something more complicated - so the simple check isn't enough anyway (and if simple_operand_p would cover it, the check would be better placed there). I reworked simple_operand_p so that it does this special-casing and additionally also checks for trapping. + if (TREE_CODE (arg0) == code + !TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)) + simple_operand_p (TREE_OPERAND (arg0, 1))) + { + tem = build2_loc (loc, + (code == TRUTH_ANDIF_EXPR ? TRUTH_AND_EXPR + : TRUTH_OR_EXPR), + type, TREE_OPERAND (arg0, 1), arg1); + return build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), + tem); All trees should be folded, don't use plain build without a good reason. Ok, done + } + /* Convert X TRUTH-ANDORIF Y to X TRUTH-ANDOR Y, if X and Y + are simple operands and have no side-effects. */ + if (simple_operand_p (arg0) + !TREE_SIDE_EFFECTS (arg0)) Again, the checks you do for arg0 do not match those for arg1. OTOH it doesn't matter whether arg0 is simple or not or has side-effects or not for this transformation, so why check it at all? It is required. For left-hand operand, if it isn't a logical and/or/xor, we need to check for side-effects (and for trapping). I see that calling of simple_operand_p is wrong here, as it rejects too much. Nevertheless the check for side-effects is necessary for having valid sequence-points. Without that checking a simple test int getter (void); int foo (void) { int c, r = 0; while ((c = getter ()) != '' c = 0) r +=c; return r; } would give a warning about sequence-points. As left-hand operand has side-effects, but right-hand not. If we would combine it as AND, the operands are exchange-able. So right-hand operand needs to be another ANDIF expression instead. Same apply on trapping. In fold_truthop we still have the same (albeit more restricted transform), but guarded with if (BRANCH_COST (optimize_function_for_speed_p (cfun), false) = 2 too. Why not here? Please delete redundant code in fold_truthop. Well, in general this is the default definition of LOGICAL_OP_NON_SHORT_CIRCUIT, so I missed that. As for some targets the macro LOGICAL_OP_NON_SHORT_CIRCUIT might be defined differently, it might make sense to check for BRANCH_COST again. It's also odd that this is only called from fold_truth_andor but has a more generic name, so maybe rename it to fold_truth_andor_1 on the way. I renamed it. Richard. ChangeLog 2011-10-07 Kai Tietz kti...@redhat.com * fold-const.c (simple_operand_p): Make argument non-const and add floating-point trapping check, and special cases for comparisons, and logical-not's. (fold_truthop): Rename to (fold_truth_andor_1): function name. Additionally remove here TRUTH-AND|OR_EXPR generation. (fold_truth_andor): Handle branching at one place. Bootstrapped and regression-tested for all languages plus Ada and Obj-C++ on x86_64-pc-linux-gnu. Ok for apply? Regards, Kai Index: gcc/gcc/fold-const.c === --- gcc.orig/gcc/fold-const.c +++ gcc/gcc/fold-const.c @@ -111,14 +111,13 @@ static tree decode_field_reference (loca tree *, tree *); static int all_ones_mask_p (const_tree, int); static tree sign_bit_p (tree, const_tree); -static int simple_operand_p (const_tree); +static int simple_operand_p (tree); static tree range_binop (enum tree_code, tree, tree, int, tree, int); static tree range_predecessor (tree); static tree range_successor (tree); static tree fold_range_test (location_t, enum tree_code, tree, tree, tree); static tree fold_cond_expr_with_comparison (location_t, tree, tree, tree, tree); static tree unextend (tree, int, int, tree); -static tree fold_truthop (location_t, enum tree_code, tree, tree, tree); static tree optimize_minmax_comparison (location_t, enum tree_code, tree, tree, tree); static tree extract_muldiv (tree, tree, enum tree_code, tree, bool *); @@ -3500,7 +3499,7 @@ optimize_bit_field_compare (location_t l return lhs; } -/* Subroutine for fold_truthop: decode a field reference. +/* Subroutine for fold_truth_andor_1: decode a
Re: [i386, avx2] Fix representation of the 256-bit vpblendw
On Fri, Oct 07, 2011 at 02:13:40PM -0700, Richard Henderson wrote: +(define_insn *avx2_pblendw + [(set (match_operand:V16HI 0 register_operand =x) + (vec_merge:V16HI + (match_operand:V16HI 2 nonimmediate_operand xm) + (match_operand:V16HI 1 register_operand x) + (match_operand:SI 3 avx2_pblendw_operand n)))] + TARGET_SSE4_1 TARGET_AVX2 instead? +{ + operands[3] = GEN_INT (INTVAL (operands[3]) 0xff); + return vpblendw\t{%3, %2, %1, %0|%0, %1, %2, %3}; +} + [(set_attr type ssemov) + (set_attr prefix_extra 1) + (set_attr length_immediate 1) + (set_attr prefix vex) + (set_attr mode OI)]) (define_insn avx2_pblenddmode [(set (match_operand:VI4_AVX2 0 register_operand =x) Jakub
Re: [i386, avx2] Fix representation of the 256-bit vpblendw
On 10/07/2011 02:40 PM, Jakub Jelinek wrote: On Fri, Oct 07, 2011 at 02:13:40PM -0700, Richard Henderson wrote: +(define_insn *avx2_pblendw + [(set (match_operand:V16HI 0 register_operand =x) +(vec_merge:V16HI + (match_operand:V16HI 2 nonimmediate_operand xm) + (match_operand:V16HI 1 register_operand x) + (match_operand:SI 3 avx2_pblendw_operand n)))] + TARGET_SSE4_1 TARGET_AVX2 instead? Blah. Yes. I changed the expander but not the insn. r~
Re: patch ping: thread testing infrastructure
First, thanks so much for tackling this review. I don't think anyone's overly enthusiastic about reviewing dejagnu crap^H^H^H^Hcode. On 10/04/11 08:43, Aldy Hernandez wrote: http://gcc.gnu.org/ml/gcc-patches/2011-09/msg01272.html So others have already mentioned the name memmodel as being unsatisfactory... From the list, I liked simulate-thread (before looking at your message where you voted for simulate-thread). Done. in memmodel-gdb-test, is there any reasonable way to detect if we're not exactly 3 frames down from dg-test and that the local variable name holds the filename of hte testcase? Are these requirements documented anywhere? I have no idea. To be honest, I just copied what every other dg* kludge was doing. In the same code, don't you want to use somethign other than GUALITY_GDB_NAME? Clearly we've got two gcc testing frameworks that need gdb. A generic name might work better GDB_FOR_GCC_TESTING? Or something like that. Ok, I got rid of the entire dependence on the guality infrastructure. It was overkill to begin with. I just used it because it was there. All we really want is the path to a gdb. And if it exists, we can fail the tests themselves if the gdb isn't working as expected. I have added a generic function gdb-exists() that can test the presence of a gdb in the path, and then it'll be up to the consumer to determine if it's working as desired. This function can use/set GDB_FOR_GCC_TESTING in a generic way as you have suggested. With the current revamp, the tests will fail if the given gdb does not work. In remote_expect_target, don't you need to reorder the cases to have the too-old-gdb case first. Otherwise you can get inconsistent results due to the way matching works in tcl/expect. On a larger note, can you use the routines from gcc-gdb-test.exp rather than duplicating it? The order was what the guality harness had. I have swapped them as you suggested. The bits in gcc-simulate-thread.exp are sufficiently different to make abstracting the common bits with gcc-gdb-test.exp a bit uncomfortable. If you feel strongly about it, I can think harder. Do we have allow-store-data-races as a parameter in GCC right now? If not you'll need to do something about the tests themselves. It's already there in mainline. It was part of the original C++ memory model bitfield patch that has caused so much grief. Which reminds me, I need to continue on that... How do you like this approach? It's a lot cleaner, has less dependencies and shorter to boot! testsuite/ * lib/gcc-simulate-thread.exp: New. * gcc.dg/simulate-thread/guality.h: New. * gcc.dg/simulate-thread/simulate-thread.h: New. * gcc.dg/simulate-thread/simulate-thread.exp: New. * gcc.dg/simulate-thread/simulate-thread.gdb: New. * gcc.dg/simulate-thread/README: New. * g++.dg/simulate-thread/guality.h: New. * g++.dg/simulate-thread/simulate-thread.h: New. * g++.dg/simulate-thread/simulate-thread.exp: New. * g++.dg/simulate-thread/simulate-thread.gdb: New. * c-c++-common/cxxbitfields-2.c: Remove. * c-c++-common/cxxbitfields.c: Remove. * c-c++-common/cxxbitfields-4.c: Remove. * c-c++-common/cxxbitfields-5.c: Remove. * c-c++-common/simulate-thread/bitfields-1.c: New. * c-c++-common/simulate-thread/bitfields-2.c: New. * c-c++-common/simulate-thread/bitfields-3.c: New. * c-c++-common/simulate-thread/bitfields-4.c: New. Index: testsuite/lib/gcc-dg.exp === --- testsuite/lib/gcc-dg.exp(revision 178608) +++ testsuite/lib/gcc-dg.exp(working copy) @@ -747,4 +747,26 @@ proc dg-message { args } { process-message saved-dg-warning $args } +# Check the existence of a gdb in the path, and return true if there +# is one. +# +# Set env(GDB_FOR_GCC_TESTING) accordingly. + +proc gdb-exists { args } { +if ![info exists ::env(GDB_FOR_GCC_TESTING)] { + global GDB + if ![info exists ::env(GDB_FOR_GCC_TESTING)] { + if [info exists GDB] { + setenv GDB_FOR_GCC_TESTING $GDB + } else { + setenv GDB_FOR_GCC_TESTING [transform gdb] + } + } +} +if { [which $::env(GDB_FOR_GCC_TESTING)] != 0 } { + return 1; +} +return 0; +} + set additional_prunes Index: testsuite/lib/gcc-simulate-thread.exp === --- testsuite/lib/gcc-simulate-thread.exp (revision 0) +++ testsuite/lib/gcc-simulate-thread.exp (revision 0) @@ -0,0 +1,90 @@ +# Copyright (C) 2011 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version.
De-inline streamer functions part 3 (issue5247042)
Remove #if 0 scaffolding. This is part 3 of several patches, and minimizes diffs. Index: gcc/cp/ChangeLog.pph 2011-10-07 Lawrence Crowl cr...@google.com * pph-streamer.h: Remove #if 0 scaffolding. Index: gcc/cp/pph-streamer.h === --- gcc/cp/pph-streamer.h (revision 179698) +++ gcc/cp/pph-streamer.h (working copy) @@ -336,9 +336,6 @@ unsigned pph_get_signature (tree, size_t void pph_flush_buffers (pph_stream *); void pph_init_write (pph_stream *); void pph_write_tree (struct output_block *, tree, bool); -#if 0 -void pph_write_mergeable_tree (pph_stream *, tree); -#endif void pph_write_mergeable_chain (pph_stream *, tree); void pph_add_decl_to_symtab (tree, enum pph_symtab_action, bool, bool); void pph_add_include (pph_stream *); @@ -354,10 +351,6 @@ struct binding_table_s *pph_in_binding_t /* In pph-streamer-in.c. */ void pph_init_read (pph_stream *); tree pph_read_tree (struct lto_input_block *, struct data_in *); -#if 0 -tree pph_read_mergeable_tree (pph_stream *, tree *); -void pph_read_mergeable_chain (pph_stream *, tree *); -#endif location_t pph_read_location (struct lto_input_block *, struct data_in *); void pph_read_file (const char *); void pph_reader_finish (void); @@ -444,314 +437,21 @@ pph_cache_find (pph_stream *stream, enum } -#if 0 -/* Output AST T to STREAM. If -fpph-tracer is set to TLEVEL or - higher, T is sent to pph_trace_tree. */ -static inline void -pph_out_tree_1 (pph_stream *stream, tree t, int tlevel) -{ - if (flag_pph_tracer = tlevel) -pph_trace_tree (stream, t); - pph_write_tree (stream-encoder.w.ob, t, false); -} - -/* Output AST T to STREAM. Trigger tracing at -fpph-tracer=2. */ -static inline void -pph_out_tree (pph_stream *stream, tree t) -{ - pph_out_tree_1 (stream, t, 2); -} - -/* Output AST T from ENCLOSING_NAMESPACE to STREAM. - Trigger tracing at -fpph-tracer=2. */ -static inline void -pph_out_mergeable_tree (pph_stream *stream, tree t) -{ - if (flag_pph_tracer = 2) -pph_trace_tree (stream, t); - pph_write_mergeable_tree (stream, t); -} -#else extern void pph_out_tree (pph_stream *stream, tree t); -#endif - -#if 0 -/* Write an unsigned int VALUE to STREAM. */ -static inline void -pph_out_uint (pph_stream *stream, unsigned int value) -{ - if (flag_pph_tracer = 4) -pph_trace_uint (stream, value); - streamer_write_uhwi (stream-encoder.w.ob, value); -} - -/* Write an unsigned HOST_WIDE_INT VALUE to STREAM. */ -static inline void -pph_out_uhwi (pph_stream *stream, unsigned HOST_WIDE_INT value) -{ - streamer_write_uhwi (stream-encoder.w.ob, value); -} - -/* Write a HOST_WIDE_INT VALUE to stream. */ -static inline void -pph_out_hwi (pph_stream *stream, HOST_WIDE_INT value) -{ - streamer_write_hwi (stream-encoder.w.ob, value); -} - -/* Write an unsigned char VALUE to STREAM. */ -static inline void -pph_out_uchar (pph_stream *stream, unsigned char value) -{ - if (flag_pph_tracer = 4) -pph_trace_uint (stream, value); - streamer_write_char_stream (stream-encoder.w.ob-main_stream, value); -} - -/* Write N bytes from P to STREAM. */ -static inline void -pph_out_bytes (pph_stream *stream, const void *p, size_t n) -{ - if (flag_pph_tracer = 4) -pph_trace_bytes (stream, p, n); - lto_output_data_stream (stream-encoder.w.ob-main_stream, p, n); -} -/* Write string STR to STREAM. */ -static inline void -pph_out_string (pph_stream *stream, const char *str) -{ - if (flag_pph_tracer = 4) -pph_trace_string (stream, str); - streamer_write_string (stream-encoder.w.ob, -stream-encoder.w.ob-main_stream, str, false); -} - -/* Write string STR of length LEN to STREAM. */ -static inline void -pph_out_string_with_length (pph_stream *stream, const char *str, - unsigned int len) -{ - if (flag_pph_tracer = 4) -pph_trace_string_with_length (stream, str, len); - streamer_write_string_with_length (stream-encoder.w.ob, -stream-encoder.w.ob-main_stream, -str, len + 1, false); -} -#else extern void pph_out_uint (pph_stream *stream, unsigned int value); -#endif -#if 0 -/* Write location LOC of length to STREAM. */ -static inline void -pph_out_location (pph_stream *stream, location_t loc) -{ - if (flag_pph_tracer = 4) -pph_trace_location (stream, loc); - pph_write_location (stream-encoder.w.ob, loc); -} -#else extern void pph_out_location (pph_stream *stream, location_t loc); -#endif - -#if 0 -/* Write a chain of ASTs to STREAM starting with FIRST. */ -static inline void -pph_out_chain (pph_stream *stream, tree first) -{ - if (flag_pph_tracer = 2) -pph_trace_chain (stream, first); - streamer_write_chain (stream-encoder.w.ob, first, false); -} - -/* Write a chain of ASTs to STREAM starting with FIRST. */ -static inline void -pph_out_mergeable_chain (pph_stream *stream, tree first) -{ - if
PATCH RFA: New configure option --with-native-system-header-dir
I would like to bring Simon's patch for the --with-native-system-header-dir configure option from the google/integration branch into gcc mainline. This patch permits changing the system header directory from /usr/include to something else. It's mainly useful in conjunction with sysroot, so that the header files don't have to live in usr/include under the sysroot. Simon's original patch: http://gcc.gnu.org/ml/gcc-patches/2011-01/msg01811.html Bootstrapped and tested on x86_64-unknown-linux-gnu. OK for mainline? Ian 2011-10-07 Simon Baldwin sim...@google.com * configure.ac: Add --with-native-system-header-dir option. * configure: Rebuild from configure.ac. * Makefile.in: Support --with-native-system-header-dir. * doc/install.texi: Document --with-native-system-header-dir. Index: configure.ac === --- configure.ac (revision 179665) +++ configure.ac (working copy) @@ -725,6 +725,23 @@ AC_ARG_ENABLE(shared, ], [enable_shared=yes]) AC_SUBST(enable_shared) +# The use of native_system_header_dir here is for the value (optionally) +# configured here. Uses of NATIVE_SYSTEM_HEADER_DIR in this file refer +# to the make variable defined in Makefile or in target make fragments. +AC_ARG_WITH([native-system-header-dir], + [ --with-native-system-header-dir=dir + use dir as the directory to look for standard + system header files in. Defaults to /usr/include.], +[ + case ${with_native_system_header_dir} in + yes|no) AC_MSG_ERROR([bad value ${withval} given for native system include directory]) ;; + /*) ;; + *) AC_MSG_ERROR([${withval} should be an absolute directory]) ;; + esac + native_system_header_dir=${withval} +], [native_system_header_dir=/usr/include]) +AC_SUBST(NATIVE_SYSTEM_HEADER_DIR, $native_system_header_dir) + AC_ARG_WITH(build-sysroot, [AS_HELP_STRING([--with-build-sysroot=sysroot], [use sysroot as the system root during the build])], @@ -4515,14 +4532,14 @@ if test x$host != x$target || test x$TA elif test x$with_sysroot = x; then target_header_dir=${exec_prefix}/${target_noncanonical}/sys-include elif test x$with_build_sysroot != x; then -target_header_dir=${with_build_sysroot}/usr/include +target_header_dir=${with_build_sysroot}${native_system_header_dir} elif test x$with_sysroot = xyes; then -target_header_dir=${exec_prefix}/${target_noncanonical}/sys-root/usr/include +target_header_dir=${exec_prefix}/${target_noncanonical}/sys-root${native_system_header_dir} else -target_header_dir=${with_sysroot}/usr/include +target_header_dir=${with_sysroot}${native_system_header_dir} fi else - target_header_dir=/usr/include + target_header_dir=${native_system_header_dir} fi # Test for stack protector support in target C library. Index: Makefile.in === --- Makefile.in (revision 179665) +++ Makefile.in (working copy) @@ -455,7 +455,7 @@ LINKER_PLUGIN_API_H = $(srcdir)/../inclu LTO_SYMTAB_H = $(srcdir)/../include/lto-symtab.h # Default native SYSTEM_HEADER_DIR, to be overridden by targets. -NATIVE_SYSTEM_HEADER_DIR = /usr/include +NATIVE_SYSTEM_HEADER_DIR = @NATIVE_SYSTEM_HEADER_DIR@ # Default cross SYSTEM_HEADER_DIR, to be overridden by targets. CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@ Index: doc/install.texi === --- doc/install.texi (revision 179665) +++ doc/install.texi (working copy) @@ -903,6 +903,18 @@ ideas of what it is for. People use it install part of GCC@. Perhaps they make this assumption because installing GCC creates the directory. +@item --with-native-system-header-dir=@var{dirname} +Specifies that @var{dirname} is the directory that contains native system +header files, rather than @file{/usr/include}. This option is most useful +if you are creating a compiler that should be isolated from the system +as much as possible. It is most commonly used with the +@option{--with-sysroot} option and will cause GCC to search +@var{dirname} inside the system root specified by that option. + +Please note that for certain targets, such as DJGPP, this value is +ignored. If the target specifies a default value for native system +header files then this option is ignored. + @item --enable-shared[=@var{package}[,@dots{}]] Build shared versions of libraries, if shared libraries are supported on the target platform. Unlike GCC 2.95.x and earlier, shared libraries @@ -1736,6 +1748,10 @@ target libraries (which runs on the buil installed with @code{make install}; it does not affect the compiler which is used to build GCC itself. +If you specify the @option{--with-native-system-header-dir=@var{dirname}} +option then the compiler will search that directory within @var{dirname} for +native system headers rather than the default
Re: PATCH RFA: New configure option --with-native-system-header-dir
On Fri, 7 Oct 2011, Ian Lance Taylor wrote: 2011-10-07 Simon Baldwin sim...@google.com * configure.ac: Add --with-native-system-header-dir option. * configure: Rebuild from configure.ac. * Makefile.in: Support --with-native-system-header-dir. * doc/install.texi: Document --with-native-system-header-dir. How does this end up affecting the paths in cppdefault.c, and which of the macros there does it affect? (I don't see how STANDARD_INCLUDE_DIR, the normal /usr/include path, gets affected by this patch; I can only see how it affects the paths used to find inputs to fixincludes.) -- Joseph S. Myers jos...@codesourcery.com
Rename vshuffle/vec_shuffle to vec_perm
Our existing vector permutation support uses the name vec_perm. The new support added for __builtin_shuffle used a variety of names. This brings all the internals into line with vec_perm. I've added documentation for the (existing) variable permute rtl named pattern (vec_perm). I've also added documentation for the (intended) constant permute rtl named pattern (vec_perm_const). I've not actually added the support for vec_perm_const yet, but plan to do so shortly. It was just easiest to do the docs for both at the same time. The builtin is still named shuffle in honor of the OpenCL primitive on which this feature is based. I've improved the documentation for the builtin a bit to make it clear that the selector modulus is part of the interface. Tested on x86_64-linux. r~ + * doc/extend.texi (__builtin_shuffle): Improve the description to + include the modulus of the selector. Mention OpenCL. + * doc/md.texi (vec_perm, vec_perm_const): Document named patterns. + + * tree.def (VEC_PERM_EXPR): Rename from VEC_SHUFFLE_EXPR. + * genopinit.c (optabs): Rename vshuffle to vec_perm. + * c-typeck.c (c_build_vec_perm_expr): Rename from + c_build_vec_shuffle_expr. Update for name changes. + * optabs.c (expand_vec_perm_expr_p): Rename from + expand_vec_shuffle_expr_p. + (expand_vec_perm_expr): Rename from expand_vec_shuffle_expr. + * optabs.h (OTI_vec_perm): Rename from DOI_vshuffle. + (vec_perm_optab): Rename from vshuffle_optab. + * expr.c, gimple-pretty-print.c, gimple.c, gimplify.c, + c-tree.h, c-parser.c, tree-cfg.c, tree-inline.c, tree-pretty-print.c, + tree-ssa-operands.c, tree-vect-generic.c: Update for name changes. + + * config/i386/i386.c (ix86_expand_vec_perm): Rename from + ix86_expand_vshuffle. + * config/i386/i386-protos.h: Update. + * config/i386/sse.md (VEC_PERM_AVX2): Rename from VSHUFFLE_AVX2. + (vec_permVEC_PERM_AVX2): Rename from vshuffleVSHUFFLE_AVX2. diff --git a/gcc/c-parser.c b/gcc/c-parser.c index a1ed48d..c948b80 100644 --- a/gcc/c-parser.c +++ b/gcc/c-parser.c @@ -5990,7 +5990,7 @@ c_parser_alignof_expression (c_parser *parser) } /* Helper function to read arguments of builtins which are interfaces - for the middle-end nodes like COMPLEX_EXPR, VEC_SHUFFLE_EXPR and + for the middle-end nodes like COMPLEX_EXPR, VEC_PERM_EXPR and others. The name of the builtin is passed using BNAME parameter. Function returns true if there were no errors while parsing and stores the arguments in CEXPR_LIST. */ @@ -6534,13 +6534,13 @@ c_parser_postfix_expression (c_parser *parser) if (VEC_length (c_expr_t, cexpr_list) == 2) expr.value = - c_build_vec_shuffle_expr + c_build_vec_perm_expr (loc, VEC_index (c_expr_t, cexpr_list, 0)-value, NULL_TREE, VEC_index (c_expr_t, cexpr_list, 1)-value); else if (VEC_length (c_expr_t, cexpr_list) == 3) expr.value = - c_build_vec_shuffle_expr + c_build_vec_perm_expr (loc, VEC_index (c_expr_t, cexpr_list, 0)-value, VEC_index (c_expr_t, cexpr_list, 1)-value, VEC_index (c_expr_t, cexpr_list, 2)-value); diff --git a/gcc/c-tree.h b/gcc/c-tree.h index 0e46525..b3e756c 100644 --- a/gcc/c-tree.h +++ b/gcc/c-tree.h @@ -595,7 +595,7 @@ extern tree c_begin_omp_task (void); extern tree c_finish_omp_task (location_t, tree, tree); extern tree c_finish_omp_clauses (tree); extern tree c_build_va_arg (location_t, tree, tree); -extern tree c_build_vec_shuffle_expr (location_t, tree, tree, tree); +extern tree c_build_vec_perm_expr (location_t, tree, tree, tree); /* Set to 0 at beginning of a function definition, set to 1 if a return statement that specifies a return value is seen. */ diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index e7528a7..6dc0210 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -2846,7 +2846,7 @@ build_function_call_vec (location_t loc, tree function, VEC(tree,gc) *params, return require_complete_type (result); } -/* Build a VEC_SHUFFLE_EXPR if V0, V1 and MASK are not error_mark_nodes +/* Build a VEC_PERM_EXPR if V0, V1 and MASK are not error_mark_nodes and have vector types, V0 has the same type as V1, and the number of elements of V0, V1, MASK is the same. @@ -2857,9 +2857,9 @@ build_function_call_vec (location_t loc, tree function, VEC(tree,gc) *params, an implementation accident and this semantics is not guaranteed to the user. */ tree -c_build_vec_shuffle_expr (location_t loc, tree v0, tree v1, tree mask) +c_build_vec_perm_expr (location_t loc, tree v0, tree v1, tree mask) { - tree vec_shuffle; + tree ret; bool wrap = true; bool maybe_const = false; bool two_arguments = false; @@ -2915,7 +2915,7 @@ c_build_vec_shuffle_expr (location_t loc, tree v0, tree v1, tree
Re: patch ping: thread testing infrastructure
On Oct 7, 2011, at 2:52 PM, Aldy Hernandez wrote: First, thanks so much for tackling this review. I don't think anyone's overly enthusiastic about reviewing dejagnu crap^H^H^H^Hcode. I'll review it. :-) The last version looks fine to me, watch out for failures. How do you like this approach? Ok.
Patch committed: Fix -fsplit-stack with very large parameters
The -fsplit-stack runtime support code has a bug reported in PR 46093: if the size of the stack parameters is exceptionally large, the parameters can overrun the entire newly allocated stack segment. This patch fixes the problem. Bootstrapped and tested on x86_64-unknown-linux-gnu. Committed to mainline. Ian 2011-10-07 Ian Lance Taylor i...@google.com PR target/46093 * generic-morestack.c (__generic_morestack): Make sure the segment is large enough for both the stack frame and the copied parameters. Index: generic-morestack.c === --- generic-morestack.c (revision 179665) +++ generic-morestack.c (working copy) @@ -512,7 +512,7 @@ __generic_morestack (size_t *pframe_size current = *pp; if (current == NULL) -current = allocate_segment (frame_size); +current = allocate_segment (frame_size + param_size); current-old_stack = old_stack;
Patch committed: #include errno.h in generic-morestack-thread.c
The file libgcc/generic-morestack-thread.c refers to EAGAIN, so for cleanliness it should really #include errno.h. This does not introduce any new build problems, as generic-morestack.c already #includes errno.h anyhow. This patch adds the #include. Bootstrapped and tested on x86_64-unknown-linux-gnu. Committed to mainline. Ian 2011-10-07 Ian Lance Taylor i...@google.com * generic-morestack-thread.c: #include errno.h. Index: generic-morestack-thread.c === --- generic-morestack-thread.c (revision 179665) +++ generic-morestack-thread.c (working copy) @@ -1,5 +1,5 @@ /* Thread library support for -fsplit-stack. */ -/* Copyright (C) 2009, 2010 Free Software Foundation, Inc. +/* Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. Contributed by Ian Lance Taylor i...@google.com. This file is part of GCC. @@ -36,6 +36,7 @@ see the files COPYING3 and COPYING.RUNTI #ifndef inhibit_libc +#include errno.h #include pthread.h #include generic-morestack.h
[C++ Patch] PR 34927
Hi, this diagnostic PR is about duplicate inform messages for this kind of testcase, where C has a cloned destructor: class A {}; struct C : A { virtual ~C () = 0; } c; The fix seems easy: output a cloned destructor only once (+ output any other member functions normally). Patch tested x86_64-linux for regressions. Ok? Thanks, Paolo. /// 2011-10-07 Paolo Carlini paolo.carl...@oracle.com PR c++/34927 * typeck2.c (abstract_virtuals_error_sfinae): Don't produce duplicate inform messages in case of cloned destructor. Index: typeck2.c === --- typeck2.c (revision 179660) +++ typeck2.c (working copy) @@ -340,7 +340,17 @@ abstract_virtuals_error_sfinae (tree decl, tree ty type); FOR_EACH_VEC_ELT (tree, pure, ix, fn) - inform (input_location, \t%+#D, fn); + { + static bool done_cloned_dest = false; + + bool is_cloned_dest = DECL_CLONED_FUNCTION_P (fn); + if (! is_cloned_dest || ! done_cloned_dest) + inform (input_location, \t%+#D, fn); + + if (is_cloned_dest) + done_cloned_dest = true; + } + /* Now truncate the vector. This leaves it non-null, so we know there are pure virtuals, but empty so we don't list them out again. */
patch ping: Dump the degree of overlap to compare static profile with instrumentation profile
http://gcc.gnu.org/ml/gcc-patches/2011-09/msg01293.html
Re: patch ping: Dump the degree of overlap to compare static profile with instrumentation profile
Yes, this is useful for static prediction tuning. David On Fri, Oct 7, 2011 at 6:40 PM, Dehao Chen de...@google.com wrote: http://gcc.gnu.org/ml/gcc-patches/2011-09/msg01293.html
[pph] Make pph.h _the_ interface header. (issue5247044)
This patch makes pph.h the single interface header for PPH. The pph-streamer.h header is now an internal header for use within the pph*.c files. Some declarations have moved from one header to the other to make that possible. Index: gcc/cp/ChangeLog.pph 2011-10-07 Lawrence Crowl cr...@google.com * pph-streamer.h (typedef pph_stream): Move to pph.h. (enum pph_symtab_action): Likewise. (enum pph_record_marker): Likewise. (enum pph_tag): Likewise. (extern pph_out_uint): Liekwise. (extern pph_out_location): Likewise. (extern pph_out_tree): Likewise. (extern pph_out_record_marker): Likewise. (extern pph_add_decl_to_symtab): Likewise. (extern pph_in_uint): Likewise. (extern pph_in_location): Likewise. (extern pph_in_tree): Likewise. (extern pph_record_marker): Likewise. (extern struct binding_table_s): Likewise. (extern pph_out_binding_table): Likewise. (extern pph_in_binding_table): Likewise. (extern pph_out_pending_templates_list): Likewise. (extern pph_out_spec_entry_tables): Likewise. (extern pph_in_pending_templates_list): Likewise. (extern pph_in_spec_entry_tables): Likewise. (pph_writer_enabled_p): Likewise. (pph_enabled_p): Likewise. * pph.h (cp_token_hunk): Remove unused. (cp_token_hunk_ptr): Likewise. (DEF_VEC_P (cp_token_hunk_ptr)): Likewise. (DEF_VEC_ALLOC_P (cp_token_hunk_ptr,gc)): Likewise. (#error diagnostic): Likewise. (extern pph_tree_code_text): Move to pph-streamer.h. (extern pph_dump_min_decl): Likewise. (extern pph_dump_namespace): Likewise. * pph.h: Remove includes for hashtab.h, line-map.h, parser.h, and timevar.h. * pph-streamer.h: Add include pph.h. * pph-streamer-in.c: Add include parser.h. * pph-streamer-out.c: Likewise. * decl.c: Include pph.h instead of pph-streamer.h. * semantics.c: Likewise. * parser.c: Remove include of pph-streamer.h. * name-lookup.c: Likewise. * Make-lang.in: Adjust dependences to reflect the above. Index: gcc/cp/decl.c === --- gcc/cp/decl.c (revision 179580) +++ gcc/cp/decl.c (working copy) @@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. #include coretypes.h #include tm.h #include tree.h +#include pph.h #include flags.h #include cp-tree.h #include tree-iterator.h @@ -54,7 +55,6 @@ along with GCC; see the file COPYING3. #include pointer-set.h #include splay-tree.h #include plugin.h -#include pph-streamer.h /* Possible cases of bad specifiers type used by bad_specifiers. */ enum bad_spec_place { Index: gcc/cp/Make-lang.in === --- gcc/cp/Make-lang.in (revision 179580) +++ gcc/cp/Make-lang.in (working copy) @@ -265,10 +265,9 @@ CXX_TREE_H = $(TREE_H) cp/name-lookup.h $(srcdir)/../include/hashtab.h CXX_PARSER_H = tree.h c-family/c-pragma.h cp/parser.h CXX_PRETTY_PRINT_H = cp/cxx-pretty-print.h $(C_PRETTY_PRINT_H) -CXX_PPH_H = $(srcdir)/../libcpp/include/line-map.h $(HASHTAB_H) \ - $(CXX_PARSER_H) $(TIMEVAR_H) $(CXX_TREE_H) cp/pph.h -CXX_PPH_STREAMER_H = $(LTO_STREAMER_H) cp/pph-streamer.h $(TREE_H) \ - $(DATA_STREAMER_H) $(TREE_STREAMER_H) +CXX_PPH_H = $(CXX_TREE_H) cp/pph.h +CXX_PPH_STREAMER_H = $(LTO_STREAMER_H) $(DATA_STREAMER_H) $(TREE_STREAMER_H) \ + $(TREE_H) $(CXX_PPH_H) cp/pph-streamer.h cp/lex.o: cp/lex.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) \ $(C_PRAGMA_H) output.h input.h cp/operators.def $(TM_P_H) \ @@ -281,7 +280,7 @@ cp/decl.o: cp/decl.c $(CXX_TREE_H) $(TM_ cp/operators.def $(TM_P_H) $(TREE_INLINE_H) $(DIAGNOSTIC_H) $(C_PRAGMA_H) \ debug.h gt-cp-decl.h $(TIMEVAR_H) $(TARGET_H) $(PLUGIN_H) \ intl.h tree-iterator.h pointer-set.h $(SPLAY_TREE_H) \ - c-family/c-objc.h $(CXX_PPH_STREAMER_H) + c-family/c-objc.h $(CXX_PPH_H) cp/decl2.o: cp/decl2.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) cp/decl.h \ output.h toplev.h $(C_COMMON_H) gt-cp-decl2.h $(CGRAPH_H) \ $(C_PRAGMA_H) $(TREE_DUMP_H) intl.h $(TARGET_H) $(GIMPLE_H) pointer-set.h \ @@ -301,7 +300,7 @@ cp/class.o: cp/class.c $(CXX_TREE_H) $(T $(SPLAY_TREE_H) pointer-set.h cp/call.o: cp/call.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) toplev.h \ $(DIAGNOSTIC_CORE_H) intl.h gt-cp-call.h convert.h $(TARGET_H) langhooks.h \ - $(TIMEVAR_H) $(CXX_PPH_H) c-family/c-objc.h + $(TIMEVAR_H) c-family/c-objc.h cp/friend.o: cp/friend.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) cp/init.o: cp/init.c $(CXX_TREE_H) $(TM_H) $(FLAGS_H) \ $(EXCEPT_H) $(TARGET_H) @@ -332,7 +331,7 @@ cp/repo.o: cp/repo.c $(CXX_TREE_H) $(TM_ cp/semantics.o: cp/semantics.c $(CXX_TREE_H) $(TM_H) toplev.h \ $(FLAGS_H) output.h $(RTL_H) $(TIMEVAR_H) \ $(TREE_INLINE_H) $(CGRAPH_H) $(TARGET_H) $(C_COMMON_H) $(GIMPLE_H) \ -