free is a killer

2013-10-26 Thread Marc Glisse

Hello,

this patch teaches gcc that free kills the memory its argument points to. 
The equality test is probably too strict, I guess we can loosen it later 
(unless you have suggestions?).


Note that the corresponding code for BUILT_IN_MEMCPY and others seems 
suspicious to me, it looks like it is testing for equality between a 
pointer and a mem_ref, which is unlikely to happen.


Bootstrap+testsuite on x86_64-unknown-linux-gnu.

2013-10-27  Marc Glisse  marc.gli...@inria.fr

PR tree-optimization/19831
gcc/
* tree-ssa-alias.c (stmt_kills_ref_p_1): Handle BUILT_IN_FREE.

gcc/testsuite/
* gcc.dg/tree-ssa/alias-25.c: New file.

--
Marc GlisseIndex: gcc/testsuite/gcc.dg/tree-ssa/alias-25.c
===
--- gcc/testsuite/gcc.dg/tree-ssa/alias-25.c(revision 0)
+++ gcc/testsuite/gcc.dg/tree-ssa/alias-25.c(working copy)
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options -O1 -fdump-tree-optimized } */
+
+void f (long *p) {
+  *p = 42;
+  p[4] = 42;
+  __builtin_free (p);
+}
+
+/* { dg-final { scan-tree-dump-not = 42 optimized } } */
+/* { dg-final { cleanup-tree-dump optimized } } */
+

Property changes on: gcc/testsuite/gcc.dg/tree-ssa/alias-25.c
___
Added: svn:keywords
## -0,0 +1 ##
+Author Date Id Revision URL
\ No newline at end of property
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: gcc/tree-ssa-alias.c
===
--- gcc/tree-ssa-alias.c(revision 204088)
+++ gcc/tree-ssa-alias.c(working copy)
@@ -2053,20 +2053,30 @@ stmt_kills_ref_p_1 (gimple stmt, ao_ref
}
 }
 
   if (is_gimple_call (stmt))
 {
   tree callee = gimple_call_fndecl (stmt);
   if (callee != NULL_TREE
   DECL_BUILT_IN_CLASS (callee) == BUILT_IN_NORMAL)
switch (DECL_FUNCTION_CODE (callee))
  {
+ case BUILT_IN_FREE:
+   {
+ tree ptr = gimple_call_arg (stmt, 0);
+ tree base = ao_ref_base (ref);
+ if (base  TREE_CODE (base) == MEM_REF
+  TREE_OPERAND (base, 0) == ptr)
+   return true;
+ break;
+   }
+
  case BUILT_IN_MEMCPY:
  case BUILT_IN_MEMPCPY:
  case BUILT_IN_MEMMOVE:
  case BUILT_IN_MEMSET:
  case BUILT_IN_MEMCPY_CHK:
  case BUILT_IN_MEMPCPY_CHK:
  case BUILT_IN_MEMMOVE_CHK:
  case BUILT_IN_MEMSET_CHK:
{
  tree dest = gimple_call_arg (stmt, 0);


vzeroupper mode-switching pass regression (Was: Re: patch adding LRA usage for ppc)

2013-10-26 Thread Uros Bizjak
Hello!

 2013-10-25  Vladimir Makarov vmaka...@redhat.com

  ...
  * lra-spills.c (lra_final_code_change): Remove useless move insns.

This change regressed x86 AVX vzeroupper insertion pass and exposed
another instance of PR 58679 [1]. The testcase:

--cut here--
typedef long long __m128i __attribute__ ((__vector_size__ (16)));
typedef char __v16qi __attribute__ ((__vector_size__ (16)));

 __m128i _mm_cmpistrm (__m128i __X, __m128i __Y, const int __M)
{
  return (__m128i) __builtin_ia32_pcmpistrm128((__v16qi)__X, (__v16qi)__Y, 1);
}
--cut here--

-O2 -mavx:

tt.c: In function ‘_mm_cmpistrm’:
tt.c:8:1: internal compiler error: in create_pre_exit, at mode-switching.c:422
 }
 ^
0xe0ed41 create_pre_exit
/home/uros/gcc-svn/trunk/gcc/mode-switching.c:408
0xe0ed41 optimize_mode_switching
/home/uros/gcc-svn/trunk/gcc/mode-switching.c:496
0xe0ed41 rest_of_handle_mode_switching
/home/uros/gcc-svn/trunk/gcc/mode-switching.c:782
0xe0ed41 execute
/home/uros/gcc-svn/trunk/gcc/mode-switching.c:817
0xbcaf85 rest_of_handle_insert_vzeroupper
/home/uros/gcc-svn/trunk/gcc/config/i386/i386.c:2370

The problem is in the wrong assumption of mode switching pass, which
in its exit bb expects a simple register copy insn that copies return
value to a return register. This is not the case anymore, since LRA
now removes the null copy by itself.

On a related note, gcc.c-torture/execute/pr30185.c from [1] does not
fail vzeroupper insertion pass anymore, due to unnecessary return
value copy insn:

foo:
movq%rsi, %rax
cqto
idivq   %rcx
movq%rax, %rsi  --- here (*)
xorl%eax, %eax
movq%rsi, %rdx
ret

movq %rax, %rdx should be emitted at (*).

[1] http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58679

Uros.


Re: [Patch] Refactor regex executors

2013-10-26 Thread Paolo Carlini

On 10/26/2013 01:35 AM, Tim Shen wrote:

On Fri, Oct 25, 2013 at 10:27 AM, Paolo Carlini
paolo.carl...@oracle.com wrote:

Uhm, cute, didn't consider the naming issue, but I'm not sure we want to do
that... What about having the code in a split.h and including it from
split.cc and split_bfs.cc instead?

Sorry for late.

Patch is great. Thanks!

Paolo.


Minor mudflap fallout

2013-10-26 Thread Jeff Law


It appears that mudflap creeped into one additional file (targhooks) 
between the time I bootstrapped the final change and committed the 
change.   This also elimiantes PRED_MUDFLAP which I missed the first 
time around.


Given this is currently breaking boostrap, I'm checking it in 
proactively, but will allow my bootstrap and regression test to continue 
overnight.


diff --git a/gcc/predict.def b/gcc/predict.def
index f8dba66..2ce135c 100644
--- a/gcc/predict.def
+++ b/gcc/predict.def
@@ -117,9 +117,6 @@ DEF_PREDICTOR (PRED_NEGATIVE_RETURN, negative return, 
HITRATE (96), 0)
 /* Branch ending with return; is probably not taken */
 DEF_PREDICTOR (PRED_NULL_RETURN, null return, HITRATE (90), 0)
 
-/* Branches to a mudflap bounds check are extremely unlikely.  */
-DEF_PREDICTOR (PRED_MUDFLAP, mudflap check, PROB_VERY_LIKELY, 0)
-
 /* Branches to compare induction variable to a loop bound is
extremely likely.  */
 DEF_PREDICTOR (PRED_LOOP_IV_COMPARE_GUESS, guess loop iv compare,
diff --git a/gcc/targhooks.c b/gcc/targhooks.c
index bee404d..fd0d0d4 100644
--- a/gcc/targhooks.c
+++ b/gcc/targhooks.c
@@ -72,7 +72,6 @@ along with GCC; see the file COPYING3.  If not see
 #include tree-ssanames.h
 #include tree-ssa-alias.h
 #include insn-codes.h
-#include tree-mudflap.h
 
 
 bool
@@ -1576,10 +1575,6 @@ tree
 build_va_arg_indirect_ref (tree addr)
 {
   addr = build_simple_mem_ref_loc (EXPR_LOCATION (addr), addr);
-
-  if (flag_mudflap) /* Don't instrument va_arg INDIRECT_REF.  */
-mf_mark (addr);
-
   return addr;
 }
 


Re: Minor mudflap fallout

2013-10-26 Thread Paolo Carlini


... slightly out of topic, sorry Jeff, but your message made me think that we 
should probably do something about the mudflap fails that we have got since 
forever (at least on Linux): to your best knowledge is somebody actively 
working on those? Should be just xfails for now?!?

Thanks!
Paolo


Re: Minor mudflap fallout

2013-10-26 Thread Marek Polacek
On Sat, Oct 26, 2013 at 12:31:34PM +0200, Paolo Carlini wrote:
 ... slightly out of topic, sorry Jeff, but your message made me think that we 
 should probably do something about the mudflap fails that we have got since 
 forever (at least on Linux): to your best knowledge is somebody actively 
 working on those? Should be just xfails for now?!?

Which ones?  All mudflap tests should be gone now.

Marek


Re: Minor mudflap fallout

2013-10-26 Thread Paolo Carlini


Marek Polacek pola...@redhat.com ha scritto:
Which ones?  All mudflap tests should be gone now.

Just browse gcc-testresults ;)

Paolo



Re: Minor mudflap fallout

2013-10-26 Thread Paolo Carlini


... seriously, in libmudflap.c++, 41, etc

Paolo



Re: Minor mudflap fallout

2013-10-26 Thread Marek Polacek
On Sat, Oct 26, 2013 at 12:46:41PM +0200, Paolo Carlini wrote:
 ... seriously, in libmudflap.c++, 41, etc

But aren't all these removed in commit 204090?

Marek


Re: Minor mudflap fallout

2013-10-26 Thread Paolo Carlini


Hi

Marek Polacek pola...@redhat.com ha scritto:
On Sat, Oct 26, 2013 at 12:46:41PM +0200, Paolo Carlini wrote:
 ... seriously, in libmudflap.c++, 41, etc

But aren't all these removed in commit 204090?

Ah! I didn't notice something such aggressive was going on! Excellent!

Thanks,
Paolo



[C11-atomic] Miscellaneous fixes 5/n

2013-10-26 Thread Joseph S. Myers
I've applied this small patch to C11-atomic branch to fix ICEs that
could occur with C_MAYBE_CONST_EXPR through lack of folding.

c:
2013-10-26  Joseph Myers  jos...@codesourcery.com

* c-typeck.c (build_atomic_assign): Fold RHS if not already
folded.

testsuite:
2013-10-26  Joseph Myers  jos...@codesourcery.com

* gcc.dg/c11-atomic-1.c: Add more tests.

Index: gcc/testsuite/gcc.dg/c11-atomic-1.c
===
--- gcc/testsuite/gcc.dg/c11-atomic-1.c (revision 204084)
+++ gcc/testsuite/gcc.dg/c11-atomic-1.c (working copy)
@@ -255,3 +255,13 @@ fc4b (x)
 {
 }
 void fc4b (_Atomic int); /* { dg-warning follows non-prototype } */
+
+/* Test cases involving C_MAYBE_CONST_EXPR work.  */
+void
+func10 (_Atomic int *p)
+{
+  p[0 / 0] = 1; /* { dg-warning division by zero } */
+  p[0 / 0] += 1; /* { dg-warning division by zero } */
+  *p = 0 / 0; /* { dg-warning division by zero } */
+  *p += 0 / 0; /* { dg-warning division by zero } */
+}
Index: gcc/c/c-typeck.c
===
--- gcc/c/c-typeck.c(revision 204084)
+++ gcc/c/c-typeck.c(working copy)
@@ -11292,6 +11292,10 @@ build_atomic_assign (location_t loc, tree lhs, enu
  with a loop.  */
   compound_stmt = c_begin_compound_stmt (false);
 
+  /* Fold the RHS if it hasn't already been folded.  */
+  if (modifycode != NOP_EXPR)
+rhs = c_fully_fold (rhs, false, NULL);
+
   /* Remove the qualifiers for the rest of the expressions and create
  the VAL temp variable to hold the RHS.  */
   nonatomic_lhs_type = build_qualified_type (lhs_type, TYPE_UNQUALIFIED);

-- 
Joseph S. Myers
jos...@codesourcery.com


Re: Minor mudflap fallout

2013-10-26 Thread Hans-Peter Nilsson
On Sat, 26 Oct 2013, Jeff Law wrote:

 It appears that mudflap creeped into one additional file (targhooks) between
 the time I bootstrapped the final change and committed the change.   This also
 elimiantes PRED_MUDFLAP which I missed the first time around.

 Given this is currently breaking boostrap, I'm checking it in proactively, but
 will allow my bootstrap and regression test to continue overnight.

Yeah, cris-elf is broken too. I use PRED_MUDFLAP in
cris_emit_trap_for_misalignment, which should explain its use.
Is there a replacement?

PRED_MUDFLAP:
-/* Branches to a mudflap bounds check are extremely unlikely.

brgds, H-P


reverting a LRA change

2013-10-26 Thread Vladimir Makarov

It seems one my yesterday patch created problems with mode switching:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58679

I reverted it until further investigation (committed as rev. 204094).  
Sorry for inconvenience.


2013-10-26  Vladimir Makarov  vmaka...@redhat.com

Revert:
2013-10-25  Vladimir Makarov vmaka...@redhat.com
* lra-spills.c (lra_final_code_change): Remove useless move insns.



Re: Aliasing: look through pointer's def stmt

2013-10-26 Thread Marc Glisse

On Fri, 25 Oct 2013, Marc Glisse wrote:


On Fri, 25 Oct 2013, Richard Biener wrote:


you can followup with handling POINTER_PLUS_EXPR if you like.


Like this? (bootstrap+testsuite on x86_64-unknown-linux-gnu)

2013-10-26  Marc Glisse  marc.gli...@inria.fr

gcc/
* tree-ssa-alias.c (ao_ref_init_from_ptr_and_size): Look for a
POINTER_PLUS_EXPR in the defining statement.


This has some issues with the type of the offsets. First, they might 
overflow in some extreme cases (that could probably already happen without 
the patch). But mostly, negative offsets are not supported. There is a 
comment to that effect before ao_ref_init_from_ptr_and_size, and 
ranges_overlap_p takes the offsets as unsigned HOST_WIDE_INT. Currently it 
does indeed seem hard to produce a negative offset there, but handling 
POINTER_PLUS_EXPR (definitely a good thing) would obviously change that.


--
Marc Glisse


Fixing cris-* breakage (was: Minor mudflap fallout)

2013-10-26 Thread Hans-Peter Nilsson
On Sat, 26 Oct 2013, Hans-Peter Nilsson wrote:
 Yeah, cris-elf is broken too. I use PRED_MUDFLAP in
 cris_emit_trap_for_misalignment, which should explain its use.
 Is there a replacement?

Actually looking at predict.def, I see PRED_COLD_LABEL, which
wasn't there when I worked with this code but which mostly
matches the need.  Will commit the following after testing.

* config/cris/cris.c (cris_emit_trap_for_misalignment): Replace
removed PRED_MUDFLAP with PRED_COLD_LABEL.

Index: gcc/config/cris/cris.c
===
--- gcc/config/cris/cris.c  (revision 204094)
+++ gcc/config/cris/cris.c  (working copy)
@@ -1996,10 +1996,10 @@ cris_emit_trap_for_misalignment (rtx mem
   jmp = get_last_insn ();
   gcc_assert (JUMP_P (jmp));

-  /* While this isn't mudflap, it is a similar kind of assertion.
- If PRED_MUDFLAP stops working, use something else or introduce a
- more suitable assertion predication type.  */
-  predict_insn_def (jmp, PRED_MUDFLAP, TAKEN);
+  /* Actually, this is even less likely than a cold label; the program
+ will likely terminate.  Replace with something like almost
+ impossible if such a prediction is introduced.  */
+  predict_insn_def (jmp, PRED_COLD_LABEL, TAKEN);
   expand_builtin_trap ();
   emit_label (ok_label);
 }
brgds, H-P


Re: Minor mudflap fallout

2013-10-26 Thread Andrew Pinski
On Sat, Oct 26, 2013 at 6:45 AM, Hans-Peter Nilsson h...@bitrange.com wrote:
 On Sat, 26 Oct 2013, Jeff Law wrote:

 It appears that mudflap creeped into one additional file (targhooks) between
 the time I bootstrapped the final change and committed the change.   This 
 also
 elimiantes PRED_MUDFLAP which I missed the first time around.

 Given this is currently breaking boostrap, I'm checking it in proactively, 
 but
 will allow my bootstrap and regression test to continue overnight.

 Yeah, cris-elf is broken too. I use PRED_MUDFLAP in
 cris_emit_trap_for_misalignment, which should explain its use.
 Is there a replacement?

I think you could use PRED_NORETURN which should be a reasonable replacement.

Thanks,
Andrew Pinski



 PRED_MUDFLAP:
 -/* Branches to a mudflap bounds check are extremely unlikely.

 brgds, H-P


Re: [committed] Dump OpenMP version number listed for -fopenmp at doc/invoke.texi

2013-10-26 Thread Gerald Pfeifer
On Fri, 25 Oct 2013, Tobias Burnus wrote:
 I have committed the patch below as obvious (Rev. 204049).
 Seemingly, there are a lot of places which have to be updated 
 for a new OpenMP version ...

One way to address that is _not_ to refer to concrete versions
unless specifically required.

This is a bit similar to me reducing references to CVS (and then 
later SVN) on our web pages, or GNAT and Bugzilla, so that making
a change there doesn't required that many documentation changes
any more.

Gerald


[libiberty] Fix testsuite/test-demangle.c

2013-10-26 Thread Gerald Pfeifer
This is similar to my fix for testsuite/test-expandargv.c last week.

I'm still not sure why this does not trigger on GNU/Linux distributions,
or earlier version of FreeBSD.  On FreeBSD 10 one does need to #include 
unistd.h to get getpagesize which is used by the test.

With this, the test now compiles on my i386-unknown-freebsd10.0 tester;
without it, it doesn't.

Okay?

Gerald

2013-10-26  Gerald Pfeifer  ger...@pfeifer.com

* testsuite/test-demangle.c: Include unistd.h.

Index: libiberty/testsuite/test-demangle.c
===
--- libiberty/testsuite/test-demangle.c (revision 204095)
+++ libiberty/testsuite/test-demangle.c (working copy)
@@ -32,6 +32,9 @@
 #if HAVE_STDLIB_H
 # include stdlib.h
 #endif
+#ifdef HAVE_UNISTD_H
+#include unistd.h
+#endif
 
 struct line
 {


Re: Minor mudflap fallout

2013-10-26 Thread Jeff Law

On 10/26/13 07:45, Hans-Peter Nilsson wrote:

On Sat, 26 Oct 2013, Jeff Law wrote:


It appears that mudflap creeped into one additional file (targhooks) between
the time I bootstrapped the final change and committed the change.   This also
elimiantes PRED_MUDFLAP which I missed the first time around.

Given this is currently breaking boostrap, I'm checking it in proactively, but
will allow my bootstrap and regression test to continue overnight.


Yeah, cris-elf is broken too. I use PRED_MUDFLAP in
cris_emit_trap_for_misalignment, which should explain its use.
Is there a replacement?

I'd suggest PRED_COLD_LABEL.

jeff




Re: Minor mudflap fallout

2013-10-26 Thread Jeff Law

On 10/26/13 05:19, Paolo Carlini wrote:



Hi

Marek Polacek pola...@redhat.com ha scritto:

On Sat, Oct 26, 2013 at 12:46:41PM +0200, Paolo Carlini wrote:

... seriously, in libmudflap.c++, 41, etc


But aren't all these removed in commit 204090?


Ah! I didn't notice something such aggressive was going on! Excellent!
The message containing the final version of the patch bounded due to 
size, but I didn't notice until just a short while ago.  Sorry.


jeff


Re: [PATCH] Final removal of mudflap

2013-10-26 Thread Joseph S. Myers
As far as I can see, the commit left empty libmudflap directories around 
rather than removing them (SVN, unlike git, allows empty directories to be 
represented in the repository).

-- 
Joseph S. Myers
jos...@codesourcery.com


Re: [PATCH] Enhance ifcombine to recover non short circuit branches

2013-10-26 Thread Andrew Pinski
On Fri, Oct 18, 2013 at 2:21 AM, Zhenqiang Chen
zhenqiang.c...@linaro.org wrote:
 On 18 October 2013 00:58, Jeff Law l...@redhat.com wrote:
 On 10/17/13 05:03, Richard Biener wrote:

 Is it OK for trunk?


 I had a much simpler change which did basically the same from 4.7 (I
 can update it if people think this is a better approach).


 I like that more (note you can now use is_gimple_condexpr as predicate
 for force_gimple_operand).

 The obvious question is whether or not Andrew's simpler change picks up as
 many transformations as Zhenqiang's change.  If not are the things missed
 important.

 Zhenqiang, can you do some testing of your change vs Andrew P.'s change?

 Here is a rough compare:

 1) Andrew P.'s change can not handle ssa-ifcombine-ccmp-3.c (included
 in my patch). Root cause is that it does not skip LABEL. The guard
 to do this opt should be the same the bb_has_overhead_p in my patch.

This should be an easy change, I am working on this right now.


 2) Andrew P.'s change always generate TRUTH_AND_EXPR, which is not
 efficient for ||. e.g. For ssa-ifcombine-ccmp-6.c, it will generate

   _3 = a_2(D)  0;
   _5 = b_4(D)  0;
   _6 = _3 | _5;
   _9 = c_7(D) = 0;
   _10 = ~_6;
   _11 = _9  _10;
   if (_11 == 0)

 With my patch, it will generate

   _3 = a_2(D)  0;
   _5 = b_4(D)  0;
   _6 = _3 | _5;
   _9 = c_7(D)  0;
   _10 = _6 | _9;
   if (_10 != 0)

As mentioned otherwise, this seems like a missed optimization inside
forwprop.  When I originally wrote this code there used to be two
cases one for  and one for |, but this was removed sometime and I
just made the code evolve with that.


 3) The good thing of Andrew P.'s change is that Inverse the order of
 the basic block walk so it can do combine recursively.

 But I think we need some heuristic to control the number of ifs. Move
 too much compares from
 the inner_bb to outer_bb is not good.


I think this depends on the target.  For MIPS we don't want an upper
bound as integer comparisons go directly to GPRs.  I wrote this patch
with MIPS in mind as that was the target I was working on.


 4) Another good thing of Andrew P.'s change is that it reuses some
 existing functions. So it looks much simple.


Thanks,
Andrew Pinski



 With that we should be able to kill the fold-const.c transform?

 That would certainly be nice and an excellent follow-up for Zhenqiang.

 That's my final goal to kill the fold-const.c transform. I think we
 may combine the two changes to make a simple and good patch.

 Thanks!
 -Zhenqiang


Re: Minor mudflap fallout

2013-10-26 Thread Hans-Peter Nilsson
On Sat, 26 Oct 2013, Andrew Pinski wrote:
 I think you could use PRED_NORETURN which should be a reasonable replacement.

I've totally missed that one, thanks.

brgds, H-P


Re: [PATCH] Enhance ifcombine to recover non short circuit branches

2013-10-26 Thread Andrew Pinski
On Wed, Oct 16, 2013 at 2:12 AM, Zhenqiang Chen
zhenqiang.c...@linaro.org wrote:
 Hi,

 The patch enhances ifcombine pass to recover some non short circuit
 branches. Basically, it will do the following transformation:

 Case 1:
   if (cond1)
 if (cond2)
 ==
   if (cond1  cond2)

 Case 2:
   if (cond1)
 goto L1
   if (cond2)
 goto L1
 ==
   if (cond1 || cond2)
 goto L1

 Case 3:
   if (cond1)
 goto L1
   else
 goto L2
 L1:
   if (cond2)
 goto L2
 ==
   if (invert (cond1) || cond2)
 goto L2

 Case 4:
   if (cond1)
 goto L1
   if (cond2)
 goto L2
 L1:
 ==
   if (invert (cond1)  cond2)
 goto L2

 Bootstrap on X86-64 and ARM.

 Two new FAILs in regression tests:
 gcc.dg/uninit-pred-8_b.c
 gcc.dg/uninit-pred-9_b.c
 uninit pass should be enhanced to handle more complex conditions. Will
 submit a bug to track it and fix it later.

 Is it OK for trunk?

 Thanks!
 -Zhenqiang

 ChangeLog:
 2013-10-16  Zhenqiang Chen  zhenqiang.c...@linaro.org

 * fold-const.c (simple_operand_p_2): Make it global.
 * tree.h (simple_operand_p_2): Declare it.
 * tree-ssa-ifcombine.c: Include rtl.h and tm_p.h.
 (bb_has_overhead_p, generate_condition_node,
 ifcombine_ccmp): New functions.
 (ifcombine_fold_ifandif): New function, extracted from
 ifcombine_ifandif.
 (ifcombine_ifandif): Call ifcombine_ccmp.
 (tree_ssa_ifcombine_bb): Skip optimized bb.

 testsuite/ChangeLog
 2013-10-16  Zhenqiang Chen  zhenqiang.c...@linaro.org

 * gcc.dg/tree-ssa/ssa-ifcombine-ccmp-1.c: New test case.
 * gcc.dg/tree-ssa/ssa-ifcombine-ccmp-2.c: New test case.
 * gcc.dg/tree-ssa/ssa-ifcombine-ccmp-3.c: New test case.
 * gcc.dg/tree-ssa/ssa-ifcombine-ccmp-4.c: New test case.
 * gcc.dg/tree-ssa/ssa-ifcombine-ccmp-5.c: New test case.
 * gcc.dg/tree-ssa/ssa-ifcombine-ccmp-6.c: New test case.
 * gcc.dg/tree-ssa/ssa-dom-thread-3.c: Updated.


One quick review of this patch, you don't don't need to test
simple_operand_p_2 as in gimple, they will always be simple.  So it at
least reduces this patch.  Also your bb_has_overhead_p can be simply:
!gsi_one_before_end_p (gsi_start_nondebug_after_labels_bb (inner_cond_bb))

Where gsi_start_nondebug_after_labels_bb is defined as:
/* Return a new iterator pointing to the first non-debug non-label statement in
   basic block BB.  */

static inline gimple_stmt_iterator
gsi_start_nondebug_after_labels_bb (basic_block bb)
{
  gimple_stmt_iterator i = gsi_after_labels (bb);

  if (!gsi_end_p (i)  is_gimple_debug (gsi_stmt (i)))
gsi_next_nondebug (i);

  return i;
}

Thanks,
Andrew Pinski


Re: [libiberty] Fix testsuite/test-demangle.c

2013-10-26 Thread Ian Lance Taylor
On Sat, Oct 26, 2013 at 12:48 PM, Gerald Pfeifer ger...@pfeifer.com wrote:

 2013-10-26  Gerald Pfeifer  ger...@pfeifer.com

 * testsuite/test-demangle.c: Include unistd.h.

This is OK.

Thanks.

Ian


[SH, committed] Fix some formatting

2013-10-26 Thread Oleg Endo
Hello,

I've just committed the attached obvious patch as rev 204098.
Tested with make all-gcc.

Cheers,
Oleg

gcc/ChangeLog:
* config/sh/sh.md (movmemsi): Remove empty constraints and 
predicates.  Fix formatting.
(cmpstr_t, cmpstrsi): Fix formatting.

Index: gcc/config/sh/sh.md
===
--- gcc/config/sh/sh.md	(revision 204096)
+++ gcc/config/sh/sh.md	(working copy)
@@ -11836,19 +11836,20 @@
 ;; String/block move insn.
 
 (define_expand movmemsi
-  [(parallel [(set (mem:BLK (match_operand:BLK 0  ))
-		   (mem:BLK (match_operand:BLK 1  )))
-	  (use (match_operand:SI 2 nonmemory_operand ))
-	  (use (match_operand:SI 3 immediate_operand ))
+  [(parallel [(set (mem:BLK (match_operand:BLK 0))
+		   (mem:BLK (match_operand:BLK 1)))
+	  (use (match_operand:SI 2 nonmemory_operand))
+	  (use (match_operand:SI 3 immediate_operand))
 	  (clobber (reg:SI PR_REG))
 	  (clobber (reg:SI R4_REG))
 	  (clobber (reg:SI R5_REG))
 	  (clobber (reg:SI R0_REG))])]
   TARGET_SH1  ! TARGET_SH5
 {
-  if(expand_block_move (operands))
- DONE;
-  else FAIL;
+  if (expand_block_move (operands))
+DONE;
+  else
+FAIL;
 })
 
 (define_insn block_move_real
@@ -11916,17 +11917,19 @@
 (define_insn cmpstr_t
   [(set (reg:SI T_REG)
 	(eq:SI (and:SI
-		(and:SI
 		 (and:SI
-		  (zero_extract:SI (xor:SI (match_operand:SI 0 arith_reg_operand r)
-	   (match_operand:SI 1 arith_reg_operand r))
-   (const_int 8) (const_int 0))
-		  (zero_extract:SI (xor:SI (match_dup 0) (match_dup 1))
-   (const_int 8) (const_int 8)))
-		  (zero_extract:SI (xor:SI (match_dup 0) (match_dup 1))
-   (const_int 8) (const_int 16)))
-		(zero_extract:SI (xor:SI (match_dup 0) (match_dup 1))
- (const_int 8) (const_int 24))) (const_int 0)))]
+		   (and:SI
+		 (zero_extract:SI
+		   (xor:SI (match_operand:SI 0 arith_reg_operand r)
+			   (match_operand:SI 1 arith_reg_operand r))
+		   (const_int 8) (const_int 0))
+		 (zero_extract:SI (xor:SI (match_dup 0) (match_dup 1))
+  (const_int 8) (const_int 8)))
+		(zero_extract:SI (xor:SI (match_dup 0) (match_dup 1))
+ (const_int 8) (const_int 16)))
+		 (zero_extract:SI (xor:SI (match_dup 0) (match_dup 1))
+  (const_int 8) (const_int 24)))
+	   (const_int 0)))]
   TARGET_SH1
   cmp/str	%0,%1
   [(set_attr type mt_group)])
@@ -11938,9 +11941,10 @@
(use (match_operand 3 immediate_operand))]
   TARGET_SH1
 {
-   if (! optimize_insn_for_size_p ()  sh_expand_cmpstr (operands))
-  DONE;
-   else FAIL;
+  if (! optimize_insn_for_size_p ()  sh_expand_cmpstr (operands))
+DONE;
+  else
+FAIL;
 })
 
 


Re: [PATCH] Enhance ifcombine to recover non short circuit branches

2013-10-26 Thread Andrew Pinski
On Sat, Oct 26, 2013 at 2:30 PM, Andrew Pinski pins...@gmail.com wrote:
 On Fri, Oct 18, 2013 at 2:21 AM, Zhenqiang Chen
 zhenqiang.c...@linaro.org wrote:
 On 18 October 2013 00:58, Jeff Law l...@redhat.com wrote:
 On 10/17/13 05:03, Richard Biener wrote:

 Is it OK for trunk?


 I had a much simpler change which did basically the same from 4.7 (I
 can update it if people think this is a better approach).


 I like that more (note you can now use is_gimple_condexpr as predicate
 for force_gimple_operand).

 The obvious question is whether or not Andrew's simpler change picks up as
 many transformations as Zhenqiang's change.  If not are the things missed
 important.

 Zhenqiang, can you do some testing of your change vs Andrew P.'s change?

 Here is a rough compare:

 1) Andrew P.'s change can not handle ssa-ifcombine-ccmp-3.c (included
 in my patch). Root cause is that it does not skip LABEL. The guard
 to do this opt should be the same the bb_has_overhead_p in my patch.

 This should be an easy change, I am working on this right now.


 2) Andrew P.'s change always generate TRUTH_AND_EXPR, which is not
 efficient for ||. e.g. For ssa-ifcombine-ccmp-6.c, it will generate

   _3 = a_2(D)  0;
   _5 = b_4(D)  0;
   _6 = _3 | _5;
   _9 = c_7(D) = 0;
   _10 = ~_6;
   _11 = _9  _10;
   if (_11 == 0)

 With my patch, it will generate

   _3 = a_2(D)  0;
   _5 = b_4(D)  0;
   _6 = _3 | _5;
   _9 = c_7(D)  0;
   _10 = _6 | _9;
   if (_10 != 0)

 As mentioned otherwise, this seems like a missed optimization inside
 forwprop.  When I originally wrote this code there used to be two
 cases one for  and one for |, but this was removed sometime and I
 just made the code evolve with that.

Actually I can make a small patch (3 lines) to my current patch which
causes tree-ssa-ifcombine.c to produce the behavior of your patch.

 if (result_inv)
   {
 t = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (t), t);
 result_inv = false;
   }

I will submit a new patch after some testing of my current patch which
fixes items 1 and 2.

Thanks,
Andrew Pinski




 3) The good thing of Andrew P.'s change is that Inverse the order of
 the basic block walk so it can do combine recursively.

 But I think we need some heuristic to control the number of ifs. Move
 too much compares from
 the inner_bb to outer_bb is not good.


 I think this depends on the target.  For MIPS we don't want an upper
 bound as integer comparisons go directly to GPRs.  I wrote this patch
 with MIPS in mind as that was the target I was working on.


 4) Another good thing of Andrew P.'s change is that it reuses some
 existing functions. So it looks much simple.


 Thanks,
 Andrew Pinski



 With that we should be able to kill the fold-const.c transform?

 That would certainly be nice and an excellent follow-up for Zhenqiang.

 That's my final goal to kill the fold-const.c transform. I think we
 may combine the two changes to make a simple and good patch.

 Thanks!
 -Zhenqiang


[SH] Cleanup endianness macros

2013-10-26 Thread Oleg Endo
Hello,

The attached patch adds a new macro TARGET_BIG_ENDIAN.  I think it's a
bit easier to read than !TARGET_LITTLE_ENDIAN.  Moreover, some not so
obvious looking uses of TARGET_LITTLE_ENDIAN for selecting MSW and LSW
register offsets are clarified by using new macros SH_REG_MSW_OFFSET and
SH_REG_LSW_OFFSET.
No functional changes.  Tested with make all-gcc.
OK for trunk?

Cheers,
Oleg

gcc/ChangeLog:
* config/sh/sh.c (MSW, LSW): Move and rename macros to...
* config/sh/sh.h (SH_REG_MSW_OFFSET, SH_REG_LSW_OFFSET):
... here.
(TARGET_BIG_ENDIAN): New macro.
* config/sh/sh.md: Use it instead of !TARGET_LITTLE_ENDIAN.
Use SH_REG_MSW_OFFSET and SH_REG_LSW_OFFSET.
* config/sh/sh.c: Likewise.
* config/sh/sh.h: Likewise.
Index: gcc/config/sh/sh.md
===
--- gcc/config/sh/sh.md	(revision 204098)
+++ gcc/config/sh/sh.md	(working copy)
@@ -670,7 +670,7 @@
 	(and:SI (match_operand:SI 0 arith_reg_operand %r)
 		(match_operand:SI 1 arith_reg_operand r)) lowpart_be)
 	  (const_int 0)))]
-  TARGET_SH1  !TARGET_LITTLE_ENDIAN
+  TARGET_SH1  TARGET_BIG_ENDIAN
   tst	%0,%1
   [(set_attr type mt_group)])
 
@@ -761,7 +761,7 @@
 			(match_operand:SI 3 const_int_operand)) 3)
 	 (match_operand:SI 1 const_int_operand)
 	 (match_operand:SI 2 const_int_operand)))]
-  TARGET_SH1  ! TARGET_LITTLE_ENDIAN
+  TARGET_SH1  TARGET_BIG_ENDIAN
 ZERO_EXTRACT_ANDMASK (operands[1], operands[2])
   == (INTVAL (operands[3])  255)
 CONST_OK_FOR_K08 (INTVAL (operands[3])  255)
@@ -2115,7 +2115,7 @@
 	(zero_extend:SI (subreg:QI (not:SI (subreg:SI (match_operand:QI 1
 		   general_extend_operand
 		   ) 0)) 3)))]
-  TARGET_SHMEDIA  ! TARGET_LITTLE_ENDIAN
+  TARGET_SHMEDIA  TARGET_BIG_ENDIAN
   [(set (match_dup 0) (zero_extend:SI (match_dup 1)))
(set (match_dup 0) (xor:SI (match_dup 0) (const_int 255)))]
   )
@@ -3840,7 +3840,7 @@
   operands[0] = SUBREG_REG (operands[0]);
 }
   gcc_assert (REG_P (operands[0]));
-  if (! TARGET_LITTLE_ENDIAN)
+  if (TARGET_BIG_ENDIAN)
 offset += 8 - GET_MODE_SIZE (inmode);
   operands[5] = gen_rtx_SUBREG (inmode, operands[0], offset);
 })
@@ -7733,11 +7733,11 @@
   rtx mem2
 = change_address (mem, SFmode, gen_rtx_POST_INC (Pmode, operands[1]));
   insn = emit_insn (gen_movsf_ie (gen_rtx_REG (SFmode,
-	   regno + !! TARGET_LITTLE_ENDIAN),
+	   regno + SH_REG_MSW_OFFSET),
   mem2, operands[2]));
   add_reg_note (insn, REG_INC, operands[1]);
   insn = emit_insn (gen_movsf_ie (gen_rtx_REG (SFmode,
-	   regno + ! TARGET_LITTLE_ENDIAN),
+	   regno + SH_REG_LSW_OFFSET),
   change_address (mem, SFmode, NULL_RTX),
   operands[2]));
   DONE;
@@ -7755,8 +7755,8 @@
   int regno = true_regnum (operands[0]);
   rtx addr, insn;
   rtx mem2 = change_address (operands[1], SFmode, NULL_RTX);
-  rtx reg0 = gen_rtx_REG (SFmode, regno + (TARGET_LITTLE_ENDIAN ? 1 : 0));
-  rtx reg1 = gen_rtx_REG (SFmode, regno + (TARGET_LITTLE_ENDIAN ? 0 : 1));
+  rtx reg0 = gen_rtx_REG (SFmode, regno + SH_REG_MSW_OFFSET);
+  rtx reg1 = gen_rtx_REG (SFmode, regno + SH_REG_LSW_OFFSET);
 
   operands[1] = copy_rtx (mem2);
   addr = XEXP (mem2, 0);
@@ -7821,8 +7821,8 @@
 {
   int regno = true_regnum (operands[1]);
   rtx insn, addr;
-  rtx reg0 = gen_rtx_REG (SFmode, regno + (TARGET_LITTLE_ENDIAN ? 1 : 0));
-  rtx reg1 = gen_rtx_REG (SFmode, regno + (TARGET_LITTLE_ENDIAN ? 0 : 1));
+  rtx reg0 = gen_rtx_REG (SFmode, regno + SH_REG_MSW_OFFSET);
+  rtx reg1 = gen_rtx_REG (SFmode, regno + SH_REG_LSW_OFFSET);
 
   operands[0] = copy_rtx (operands[0]);
   PUT_MODE (operands[0], SFmode);
@@ -13160,7 +13160,7 @@
 			 (match_operand:SI 1 immediate_operand )
 			 (match_operand:SI 2 immediate_operand ))
 	(match_operand:SI 3 general_operand ))]
-  TARGET_SH1  ! TARGET_LITTLE_ENDIAN
+  TARGET_SH1  TARGET_BIG_ENDIAN
 {
   rtx addr_target, orig_address, shift_reg, qi_val;
   HOST_WIDE_INT bitsize, size, v = 0;
@@ -14522,7 +14522,7 @@
 	   (zero_extract:QI (not:QI (match_dup 2)) (const_int 2) (const_int 4))
 	   (zero_extract:QI (not:QI (match_dup 2))
 			(const_int 2) (const_int 6))])))]
-  TARGET_SHMEDIA  ! TARGET_LITTLE_ENDIAN
+  TARGET_SHMEDIA  TARGET_BIG_ENDIAN
   mperm.w	%1, %N2, %0
   [(set_attr type arith_media)])
 
Index: gcc/config/sh/sh.c
===
--- gcc/config/sh/sh.c	(revision 204096)
+++ gcc/config/sh/sh.c	(working copy)
@@ -63,9 +63,6 @@
 
 int code_for_indirect_jump_scratch = CODE_FOR_indirect_jump_scratch;
 
-#define MSW (TARGET_LITTLE_ENDIAN ? 1 : 0)
-#define LSW (TARGET_LITTLE_ENDIAN ? 0 : 1)
-
 /* These are some macros to abstract register modes.  */
 #define CONST_OK_FOR_I10(VALUE) (((HOST_WIDE_INT)(VALUE)) = -512 \
   ((HOST_WIDE_INT)(VALUE)) = 511)
@@ -1208,12 +1205,12 @@
   if (REG_P (x) || GET_CODE (x) == SUBREG)
 	{
 	  regno = true_regnum (x);
-	  regno