Re: [patch, libgfortran] PR48906 Wrong rounding results with -m32

2011-06-11 Thread Thomas Henlich
> I don't agree with this; with the patch we now output 10 significant
> digits, whereas 9 is sufficient for a binary->ascii->binary roundtrip.
> So please retain the "reduce d by one when E editing is used" thing
> for list format and G0. This is just a side effect of using 1PGw.d
> format for list format and G0 in order to avoid duplicating code, but
> we don't need to follow this particular craziness that is due to how
> the scale factor is specified in the standard.

I hadn't noticed this, but I agree with Janne.

It should be easy to implement:

After the switch between F and E editing, we just need to shift the
decimal point and decrement the exponent. No new rounding is required,
because we keep the number of significant digits.


Re: [patch, fortran] Some more TRIM optimizations

2011-06-11 Thread Thomas Koenig

Hi Jerry,




Ping ** 0.5714

Full patch can be found at

http://gcc.gnu.org/ml/fortran/2011-06/msg00053.html


OK and thanks for patch.


Sendingfortran/ChangeLog
Sendingfortran/frontend-passes.c
Sendingtestsuite/ChangeLog
Adding testsuite/gfortran.dg/trim_optimize_7.f90
Transmitting file data 
Committed revision 174944.

Thanks for the review!

Thomas


Re: [PATCH PR45098, 7/10] Nowrap limits iterations

2011-06-11 Thread Tom de Vries
Hi Zdenek,

On 05/31/2011 10:04 AM, Zdenek Dvorak wrote:
> Hi,
> 
>> As far as I can tell, what is current calculated in i_bound (and assigned to
>> nb_iterations_upper_bound), is the maximum amount of times any statement in 
>> the
>> loop is executed, where any includes exit tests. Differently put, the maximum
>> amount of times the loop header is executed.
> 
> hmm... this is rather confusing, I don't really recall why I gave
> nb_iterations_upper_bound a different semantics from any other instance
> of what # of iterations of a loop means.  
> 
>> This is confirmed by this comment in tree-vrp.c:
>>
>>   /* Try to use estimated number of iterations for the loop to constrain the
>>  final value in the evolution.
>>  We are interested in the number of executions of the latch, while
>>  nb_iterations_upper_bound includes the last execution of the exit test. 
>>  */
>>
>> I modified the patch to improved the comment.
> 
> I think a better fix would be to make the nb_iterations_upper_bound semantics
> consistent with that of nb_iterations.  Let me try to do it, hopefully this 
> should
> be mostly mechanical,
> 

This patch changes the semantics of nb_iterations_upper_bound and
nb_iterations_estimate, to mean: the amount of latch executions.

That change is countered at all use sites, except for
tree-ssa-loop-ivopts.c:may_eliminate_iv.

Passed x86_64 bootstrapping and reg-testing.

OK for trunk?

2011-06-10  Zdenek Dvorak  
Tom de Vries  

PR target/45098
* cfgloop.h (nb_iterations_upper_bound, nb_iterations_estimate):
Document changed semantics.
(max_stmt_executions, max_stmt_executions_int): Declare.
* tree-data-ref.c (estimated_loop_iterations)
(estimated_loop_iterations_int): Move functions...
* tree-ssa-loop-niter.c (estimated_loop_iterations)
(estimated_loop_iterations_int): here.
(record_estimate): Change nb_iterations_upper_bound and
nb_iterations_estimate semantics.
(max_stmt_executions, max_stmt_executions_int): New function.
* tree-data-ref.c (estimated_loop_iterations_tree): Rename to ...
(max_stmt_executions_tree): this.
(analyze_miv_subscript): Use max_stmt_executions_tree instead of
estimated_loop_iterations_tree.
tree-ssa-loop-ivopts.c (avg_loop_niter): Use
max_stmt_executions_int instead of estimated_loop_iterations_int.
* predict.c (predict_loops): Idem.
* tree-parloops.c (parallelize_loops): Idem.
* tree-data-ref.c (analyze_siv_subscript_cst_affine)
(compute_overlap_steps_for_affine_1_2, analyze_subscript_affine_affine)
(init_omega_for_ddr_1): Idem.
* tree-ssa-loop-prefetch.c (determine_loop_nest_reuse)
(loop_prefetch_arrays): Idem
* graphite-sese-to-poly.c (build_loop_iteration_domains): Use
max_stmt_executions instead of estimated_loop_iterations.
* tree-data-ref.c (estimated_loop_iterations_tree): Idem.
* tree-vrp.c (adjust_range_with_scev): Use estimated_loop_iterations
instead of nb_iterations_upper_bound.
Index: gcc/tree-vrp.c
===
--- gcc/tree-vrp.c	(revision 174810)
+++ gcc/tree-vrp.c	(working copy)
@@ -3403,44 +3403,42 @@ adjust_range_with_scev (value_range_t *v
 tmax = TYPE_MAX_VALUE (type);
 
   /* Try to use estimated number of iterations for the loop to constrain the
- final value in the evolution.
- We are interested in the number of executions of the latch, while
- nb_iterations_upper_bound includes the last execution of the exit test.  */
+ final value in the evolution.  */
   if (TREE_CODE (step) == INTEGER_CST
-  && loop->any_upper_bound
-  && !double_int_zero_p (loop->nb_iterations_upper_bound)
   && is_gimple_val (init)
   && (TREE_CODE (init) != SSA_NAME
 	  || get_value_range (init)->type == VR_RANGE))
 {
-  value_range_t maxvr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
-  double_int dtmp;
-  bool unsigned_p = TYPE_UNSIGNED (TREE_TYPE (step));
-  int overflow = 0;
+  double_int nit;
 
-  dtmp = double_int_mul_with_sign (tree_to_double_int (step),
-   double_int_sub (
-   loop->nb_iterations_upper_bound,
-   double_int_one),
-   unsigned_p, &overflow);
-  /* If the multiplication overflowed we can't do a meaningful
-	 adjustment.  Likewise if the result doesn't fit in the type
-	 of the induction variable.  For a signed type we have to
-	 check whether the result has the expected signedness which
-	 is that of the step as nb_iterations_upper_bound is unsigned.  */
-  if (!overflow
-	  && double_int_fits_to_tree_p (TREE_TYPE (init), dtmp)
-	  && (unsigned_p
-	  || ((dtmp.high ^ TREE_INT_CST_HIGH (step)) >= 0)))
+  if (estima

[Patch, libfortran] PR 49296 List read of file without EOR

2011-06-11 Thread Janne Blomqvist
Hi,

attached patch fixes PR 49296. A new test for the testsuite is also included.

Regtested on x86_64-unknown-linux-gnu, Ok for trunk?

2011-06-11  Janne Blomqvist  

PR libfortran/49296
* io/list_read.c (read_character): Accept EOF as a separator when
reading string.


-- 
Janne Blomqvist
diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c
index 38a92e1..baf2f54 100644
--- a/libgfortran/io/list_read.c
+++ b/libgfortran/io/list_read.c
@@ -1022,7 +1022,7 @@ read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
   for (;;)
 {
   if ((c = next_char (dtp)) == EOF)
-	goto eof;
+	goto done_eof;
   switch (c)
 	{
 	case '"':
@@ -1068,26 +1068,26 @@ read_character (st_parameter_dt *dtp, int length __attribute__ ((unused)))
  invalid.  */
  done:
   c = next_char (dtp);
- eof:
-  if (is_separator (c) || c == '!')
+ done_eof:
+  if (is_separator (c) || c == '!' || c == EOF)
 {
   unget_char (dtp, c);
   eat_separator (dtp);
   dtp->u.p.saved_type = BT_CHARACTER;
   free_line (dtp);
 }
-  else
+  else 
 {
   free_saved (dtp);
-  if (c == EOF)
-	{
-	  hit_eof (dtp);
-	  return;
-	}
   snprintf (message, MSGLEN, "Invalid string input in item %d",
 		  dtp->u.p.item_count);
   generate_error (&dtp->common, LIBERROR_READ_VALUE, message);
 }
+  return;
+
+ eof:
+  free_saved (dtp);
+  hit_eof (dtp);
 }
 
 
! { dg-do run }
! PR 49296 List formatted read of file without EOR marker (\n).
program read_list_eof_1
  implicit none
  integer, parameter :: strmx = 255
  character(len=strmx) :: s1, s2
  call genfil ()
  open (unit=20, file='read.dat', form='FORMATTED', action='READ', &
   status='OLD')
  read (20, fmt=*) s1, s2
  close (20, status='delete')
  if (trim(s1) /= "abcd" .or. trim(s2) /= "efgh") then
 call abort ()
  end if

contains
  subroutine genfil
open(10, file='read.dat', form='unformatted', action='write', &
 status='replace', access='stream')
write(10) 'abcd efgh'
close(10)
  end subroutine genfil
end program read_list_eof_1


[PATCH, i386]: Use default value in "isa" attribute.

2011-06-11 Thread Uros Bizjak
Hello!

"base" is the default value for "isa" attribute.  Also, reimplement
long lines with "cond" RTX.

2011-06-11  Uros Bizjak  

* config/i386/i386.md: Use default value in "isa" attribute.
* config/i386/sse.md: Ditto.
* config/i386/mmx.md: Ditto.

Tested on x86_64-pc-linux-gnu, committed to mainline SVN.

Uros.
Index: i386.md
===
--- i386.md (revision 174944)
+++ i386.md (working copy)
@@ -2151,7 +2151,7 @@
   [(set (attr "isa")
  (if_then_else (eq_attr "alternative" "9,10,11,12")
(const_string "noavx")
-   (const_string "base")))
+   (const_string "*")))
(set (attr "type")
  (cond [(eq_attr "alternative" "0,1")
  (const_string "multi")
@@ -12700,7 +12700,7 @@
   (if_then_else (match_operand:MODEF 3 "mult_operator" "")
  (const_string "fmul")
  (const_string "fop"
-   (set_attr "isa" "base,noavx,avx")
+   (set_attr "isa" "*,noavx,avx")
(set_attr "prefix" "orig,orig,vex")
(set_attr "mode" "")])
 
@@ -12760,7 +12760,7 @@
  (const_string "fdiv")
   ]
   (const_string "fop")))
-   (set_attr "isa" "base,base,noavx,avx")
+   (set_attr "isa" "*,*,noavx,avx")
(set_attr "prefix" "orig,orig,orig,vex")
(set_attr "mode" "")])
 
Index: mmx.md
===
--- mmx.md  (revision 174944)
+++ mmx.md  (working copy)
@@ -85,7 +85,19 @@
 %vmovq\t{%1, %0|%0, %1}
 %vmovd\t{%1, %0|%0, %1}
 %vmovd\t{%1, %0|%0, %1}"
-  [(set_attr "type" 
"imov,imov,mmx,mmxmov,mmxmov,mmxmov,ssecvt,ssecvt,sselog1,ssemov,ssemov,ssemov,ssemov")
+  [(set (attr "type")
+ (cond [(eq_attr "alternative" "0,1")
+ (const_string "imov")
+   (eq_attr "alternative" "2")
+ (const_string "mmx")
+   (eq_attr "alternative" "3,4,5")
+ (const_string "mmxmov")
+   (eq_attr "alternative" "6,7")
+ (const_string "ssecvt")
+   (eq_attr "alternative" "8")
+ (const_string "sselog1")
+  ]
+  (const_string "ssemov")))
(set_attr "unit" "*,*,*,*,*,*,mmx,mmx,*,*,*,*,*")
(set_attr "prefix_rep" "*,*,*,*,*,*,1,1,*,1,*,*,*")
(set_attr "prefix_data16" "*,*,*,*,*,*,*,*,*,*,1,1,1")
@@ -125,8 +137,20 @@
   [(set (attr "isa")
  (if_then_else (eq_attr "alternative" "9,10,11,12")
(const_string "noavx")
-   (const_string "base")))
-   (set_attr "type" 
"mmx,mmxmov,mmxmov,mmxmov,ssecvt,ssecvt,sselog1,ssemov,ssemov,sselog1,ssemov,ssemov,ssemov,*,*")
+   (const_string "*")))
+   (set (attr "type")
+ (cond [(eq_attr "alternative" "0")
+ (const_string "mmx")
+   (eq_attr "alternative" "1,2,3")
+ (const_string "mmxmov")
+   (eq_attr "alternative" "4,5")
+ (const_string "ssecvt")
+   (eq_attr "alternative" "6,9")
+ (const_string "sselog1")
+   (eq_attr "alternative" "13,14")
+ (const_string "multi")
+  ]
+  (const_string "ssemov")))
(set_attr "unit" "*,*,*,*,mmx,mmx,*,*,*,*,*,*,*,*,*")
(set (attr "prefix_rep")
  (if_then_else
@@ -179,7 +203,19 @@
 %vmovlps\t{%1, %0|%0, %1}
 %vmovd\t{%1, %0|%0, %1}
 %vmovd\t{%1, %0|%0, %1}"
-  [(set_attr "type" 
"imov,imov,mmx,mmxmov,mmxmov,mmxmov,ssecvt,ssecvt,ssemov,sselog1,ssemov,ssemov,ssemov,ssemov")
+  [(set (attr "type")
+ (cond [(eq_attr "alternative" "0,1")
+ (const_string "imov")
+   (eq_attr "alternative" "2")
+ (const_string "mmx")
+   (eq_attr "alternative" "3,4,5")
+ (const_string "mmxmov")
+   (eq_attr "alternative" "6,7")
+ (const_string "ssecvt")
+   (eq_attr "alternative" "9")
+ (const_string "sselog1")
+  ]
+  (const_string "ssemov")))
(set_attr "unit" "*,*,*,*,*,*,mmx,mmx,*,*,*,*,*,*")
(set_attr "prefix_rep" "*,*,*,*,*,*,1,1,*,*,*,*,*,*")
(set (attr "length_vex")
@@ -214,7 +250,19 @@
 %vmovlps\t{%1, %0|%0, %1}
 #
 #"
-  [(set_attr "type" 
"mmx,mmxmov,mmxmov,mmxmov,ssecvt,ssecvt,sselog1,ssemov,ssemov,ssemov,*,*")
+  [(set (attr "type")
+ (cond [(eq_attr "alternative" "0")
+ (const_string "mmx")
+   (eq_attr "alternative" "1,2,3")
+ (const_string "mmxmov")
+   (eq_attr "alternative" "4,5")
+ (const_string "ssecvt")
+   (eq_attr "alternative" "6")
+ (const_string "sselog1")
+   (eq_attr "alternative" "10,11")
+ (const_string "multi")
+  ]
+  (const_string "ssemov")))
(set_attr "unit" "*,*,*,*,mmx,mmx,*,*,*,*,*,*")
(set_attr "prefix_rep" "*,*,*,*,1,1,*,*,*,*,*,*")
(set (attr "prefix")
@@ -228,8 +276,8 @@
   [(set (match_operand:MMXMODE 0 "nonimmediate_operand" "")
 (match_operand:MMXMODE 1 "general_operand" "")

[Patch, libfortran, committed] Use lseek() to figure out if a file is seekable

2011-06-11 Thread Janne Blomqvist
Hi,

currently we try to figure out whether a fd is seekable by looking at
the mode returned by fstat(). Turns out this is not enough, as there
are some character special files that are seekable. Thus, change the
logic to try an lseek().

Committed as obvious.

Index: ChangeLog
===
--- ChangeLog   (revision 174945)
+++ ChangeLog   (working copy)
@@ -1,3 +1,8 @@
+2011-06-11  Janne Blomqvist  
+
+   * io/unix.c (fd_to_stream): Figure out if a fd is seekable by
+   trying lseek().
+
 2011-06-10  Daniel Carrera  

* caf/mpi.c (_gfortran_caf_sync_all,
Index: io/unix.c
===
--- io/unix.c   (revision 174945)
+++ io/unix.c   (working copy)
@@ -952,15 +952,15 @@ fd_to_stream (int fd)

   if (S_ISREG (statbuf.st_mode))
 s->file_length = statbuf.st_size;
-  else if (S_ISBLK (statbuf.st_mode))
+  else
 {
-  /* Hopefully more portable than ioctl(fd, BLKGETSIZE64, &size)?  */
-  gfc_offset cur = lseek (fd, 0, SEEK_CUR);
+  /* Some character special files are seekable but most are not,
+so figure it out by trying to seek.  On Linux, /dev/null is
+an example of such a special file.  */
   s->file_length = lseek (fd, 0, SEEK_END);
-  lseek (fd, cur, SEEK_SET);
+  if (s->file_length > 0)
+   lseek (fd, 0, SEEK_SET);
 }
-  else
-s->file_length = -1;

   if (!(S_ISREG (statbuf.st_mode) || S_ISBLK (statbuf.st_mode))
   || options.all_unbuffered


-- 
Janne Blomqvist


[Patch, libfortran, committed] Return error when trying to seek a non-seekable buffered file

2011-06-11 Thread Janne Blomqvist
Hi,

In libgfortran, buffered and unbuffered IO should work the same except
for the buffering. For the unbuffered IO, seek and tell operations
reduce to calls to lseek(). Thus, if the file is not seekable, they
return -1 and set errno. Or strictly speaking, POSIX says that lseek()
on a non-seekable file is implementation-dependent, but AFAIK most
implementations return error. The attached patch makes buffered IO
behave the same.

Regtested on x86_64-unknown-linux-gnu, committed as obvious.


Index: ChangeLog
===
--- ChangeLog   (revision 174946)
+++ ChangeLog   (working copy)
@@ -1,5 +1,10 @@
 2011-06-11  Janne Blomqvist  

+   * io/unix.c (buf_seek): Return error if file is not seekable.
+   (buf_tell): Call buf_seek.
+
+2011-06-11  Janne Blomqvist  
+
* io/unix.c (fd_to_stream): Figure out if a fd is seekable by
trying lseek().

Index: io/unix.c
===
--- io/unix.c   (revision 174946)
+++ io/unix.c   (working copy)
@@ -560,6 +560,11 @@ buf_write (unix_stream * s, const void *
 static gfc_offset
 buf_seek (unix_stream * s, gfc_offset offset, int whence)
 {
+  if (s->file_length == -1)
+{
+  errno = ESPIPE;
+  return -1;
+}
   switch (whence)
 {
 case SEEK_SET:
@@ -585,7 +590,7 @@ buf_seek (unix_stream * s, gfc_offset of
 static gfc_offset
 buf_tell (unix_stream * s)
 {
-  return s->logical_offset;
+  return buf_seek (s, 0, SEEK_CUR);
 }

 static int


-- 
Janne Blomqvist


[PATCH, i386]: Fix mode of forced register in vec_dupv4sf

2011-06-11 Thread Uros Bizjak
Hello!

2011-06-11  Uros Bizjak  

* config/i386/sse.md (vec_dupv4sf): Correct mode of forced register.
(*vec_dupv2df): Rename from vec_dupv2df.
(vec_dupv2df): New expander.

Tested on x86_64-pc-linux-gnu {,-m32}. Committed to mainline SVN, will
also be committed to 4.5 and 4.6 branch.

Uros.
Index: sse.md
===
--- sse.md  (revision 174946)
+++ sse.md  (working copy)
@@ -3816,7 +3816,7 @@
   "TARGET_SSE"
 {
   if (!TARGET_AVX)
-operands[1] = force_reg (V4SFmode, operands[1]);
+operands[1] = force_reg (SFmode, operands[1]);
 })
 
 (define_insn "*vec_dupv4sf_avx"
@@ -5117,6 +5117,16 @@
(set_attr "length_immediate" "*,*,*,1,*,*")
(set_attr "mode" "DF,V1DF,V1DF,V2DF,V1DF,V1DF")])
 
+(define_expand "vec_dupv4sf"
+  [(set (match_operand:V2DF 0 "register_operand" "")
+   (vec_duplicate:V2DF
+ (match_operand:DF 1 "nonimmediate_operand" "")))]
+  "TARGET_SSE2"
+{
+  if (!TARGET_SSE3)
+operands[1] = force_reg (DFmode, operands[1]);
+})
+
 (define_insn "*vec_dupv2df_sse3"
   [(set (match_operand:V2DF 0 "register_operand" "=x")
(vec_duplicate:V2DF
@@ -5127,7 +5137,7 @@
(set_attr "prefix" "maybe_vex")
(set_attr "mode" "DF")])
 
-(define_insn "vec_dupv2df"
+(define_insn "*vec_dupv2df"
   [(set (match_operand:V2DF 0 "register_operand" "=x")
(vec_duplicate:V2DF
  (match_operand:DF 1 "register_operand" "0")))]


[v3] test uses_allocator for promise and packaged_task

2011-06-11 Thread Jonathan Wakely
2011-06-11  Jonathan Wakely  

* testsuite/30_threads/packaged_task/uses_allocator.cc: New.
* testsuite/30_threads/promise/uses_allocator.cc: Likewise.

A couple of new tests to verify that uses_allocator is specialized for
promise and packaged_task.

Tested x86_84-linux and committed to trunk.
Index: testsuite/30_threads/packaged_task/uses_allocator.cc
===
--- testsuite/30_threads/packaged_task/uses_allocator.cc(revision 0)
+++ testsuite/30_threads/packaged_task/uses_allocator.cc(revision 0)
@@ -0,0 +1,32 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+// { dg-require-cstdint "" }
+// { dg-require-gthreads "" }
+// { dg-require-atomic-builtins "" }
+
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// .
+
+
+#include 
+#include 
+
+using std::uses_allocator;
+using std::allocator;
+using std::packaged_task;
+static_assert( uses_allocator, allocator>::value,
+   "packaged_task supports uses-allocator construction" );
Index: testsuite/30_threads/promise/uses_allocator.cc
===
--- testsuite/30_threads/promise/uses_allocator.cc  (revision 0)
+++ testsuite/30_threads/promise/uses_allocator.cc  (revision 0)
@@ -0,0 +1,32 @@
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }
+// { dg-require-cstdint "" }
+// { dg-require-gthreads "" }
+// { dg-require-atomic-builtins "" }
+
+// Copyright (C) 2011 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// .
+
+
+#include 
+#include 
+
+using std::uses_allocator;
+using std::allocator;
+using std::promise;
+static_assert( uses_allocator, allocator>::value,
+   "promise supports uses-allocator construction" );


Re: [patch, libgfortran] PR48906 Wrong rounding results with -m32

2011-06-11 Thread jerry DeLisle

On 06/11/2011 12:23 AM, Thomas Henlich wrote:

I don't agree with this; with the patch we now output 10 significant
digits, whereas 9 is sufficient for a binary->ascii->binary roundtrip.
So please retain the "reduce d by one when E editing is used" thing
for list format and G0. This is just a side effect of using 1PGw.d
format for list format and G0 in order to avoid duplicating code, but
we don't need to follow this particular craziness that is due to how
the scale factor is specified in the standard.


I hadn't noticed this, but I agree with Janne.

It should be easy to implement:

After the switch between F and E editing, we just need to shift the
decimal point and decrement the exponent. No new rounding is required,
because we keep the number of significant digits.



Our default formats for kind=4 are:

static void
set_fnode_default (st_parameter_dt *dtp, fnode *f, int length)
{
  f->format = FMT_G;
  switch (length)
{
case 4:
  f->u.real.w = 16;
  f->u.real.d = 9;
  f->u.real.e = 2;
  break;

This was established as solution to PR48488 where we had two choices for 
selecting the significant digits. Nine significant digits was established as a 
requirement to guarantee round trip in all cases. The char4_iunit_1.f03 test 
case was revised because after we corrected the formatting in PR48906, it 
started to fail and I observed the test case was looking for the wrong number of 
significant digits.


Based on this, I would suggest we leave it as I have it, which is correct.

Jerry


Cgraph alias reorg 16/14 (fix latent bug in ipa.c)

2011-06-11 Thread Jan Hubicka
Hi,
there is typo in cgraph_comdat_can_be_unshared_p that causes us to sometimes 
diverge in visibility
of the single comdat group that leads to undefined symbols in Mozlla.
Fixed thus.

Bootstrapped/regtested x86_64-linux, comitted.

Index: ChangeLog
===
--- ChangeLog   (revision 174952)
+++ ChangeLog   (working copy)
@@ -1,5 +1,9 @@
 2011-06-11  Jan Hubicka  
 
+   * ipa.c (cgraph_comdat_can_be_unshared_p): Fix pasto.
+
+2011-06-11  Jan Hubicka  
+
* lto-symtab.c (lto_cgraph_replace_node): Kill same body alias code.
(lto_symtab_resolve_can_prevail_p): Likewise.
(lto_symtab_merge_cgraph_nodes): Update merging of aliases.
Index: ipa.c
===
--- ipa.c   (revision 174952)
+++ ipa.c   (working copy)
@@ -571,7 +571,7 @@ cgraph_comdat_can_be_unshared_p (struct 
  address taken.  */
   for (next = node->same_comdat_group;
   next != node; next = next->same_comdat_group)
-   if (cgraph_address_taken_from_non_vtable_p (node)
+   if (cgraph_address_taken_from_non_vtable_p (next)
&& !DECL_VIRTUAL_P (next->decl))
  return false;
 }


Cgraph alias reorg 17/14 (fix ipa-prop computation of varying args)

2011-06-11 Thread Jan Hubicka
Hi,
while breaking up the patch Imissed two pots in ipa-prop, where we need to walk 
aliases.
This leads to segfault while compiling Mozilla.  Also because 
alled_with_var_arguments
is recomputed at IPA time, we don't need to stream it.

Bootstrapped/regtested x86_64-linux, comitted.

Honza

Index: ChangeLog
===
--- ChangeLog   (revision 174954)
+++ ChangeLog   (working copy)
@@ -1,5 +1,12 @@
 2011-06-11  Jan Hubicka  
 
+   * ipa-prop.c (ipa_make_edge_direct_to_target): Fix code setting varying 
args.
+   (ipa_update_after_lto_read): Likewise.
+   (ipa_write_node_info): Do not sream call_with_var_arguments.
+   (ipa_read_node_info): Likewise.
+
+2011-06-11  Jan Hubicka  
+
* ipa.c (cgraph_comdat_can_be_unshared_p): Fix pasto.
 
 2011-06-11  Jan Hubicka  
Index: ipa-prop.c
===
--- ipa-prop.c  (revision 174951)
+++ ipa-prop.c  (working copy)
@@ -1719,6 +1719,7 @@ ipa_make_edge_direct_to_target (struct c
  fprintf (dump_file, "\n");
}
 }
+  callee = cgraph_function_or_thunk_node (callee, NULL);
 
   if (ipa_get_cs_argument_count (IPA_EDGE_REF (ie))
   != ipa_get_param_count (IPA_NODE_REF (callee)))
@@ -2815,7 +2816,6 @@ ipa_write_node_info (struct output_block
   lto_output_uleb128_stream (ob->main_stream, node_ref);
 
   bp = bitpack_create (ob->main_stream);
-  bp_pack_value (&bp, info->called_with_var_arguments, 1);
   gcc_assert (info->uses_analysis_done
  || ipa_get_param_count (info) == 0);
   gcc_assert (!info->node_enqueued);
@@ -2858,7 +2858,6 @@ ipa_read_node_info (struct lto_input_blo
   ipa_initialize_node_params (node);
 
   bp = lto_input_bitpack (ib);
-  info->called_with_var_arguments = bp_unpack_value (&bp, 1);
   if (ipa_get_param_count (info) != 0)
 info->uses_analysis_done = true;
   info->node_enqueued = false;
@@ -3015,9 +3014,12 @@ ipa_update_after_lto_read (void)
 if (node->analyzed)
   for (cs = node->callees; cs; cs = cs->next_callee)
{
+ struct cgraph_node *callee;
+
+ callee = cgraph_function_or_thunk_node (cs->callee, NULL);
  if (ipa_get_cs_argument_count (IPA_EDGE_REF (cs))
- != ipa_get_param_count (IPA_NODE_REF (cs->callee)))
-   ipa_set_called_with_variable_arg (IPA_NODE_REF (cs->callee));
+ != ipa_get_param_count (IPA_NODE_REF (callee)))
+   ipa_set_called_with_variable_arg (IPA_NODE_REF (callee));
}
 }
 


[v3] adjust allocator_traits testcase

2011-06-11 Thread Jonathan Wakely
2011-06-11  Jonathan Wakely  

* testsuite/20_util/allocator_traits/requirements/typedefs.cc: Check
for allocator_type and value_type.

Tested x86_64-linux, committed to trunk.
Index: testsuite/20_util/allocator_traits/requirements/typedefs.cc
===
--- testsuite/20_util/allocator_traits/requirements/typedefs.cc (revision 
174931)
+++ testsuite/20_util/allocator_traits/requirements/typedefs.cc (working copy)
@@ -29,6 +29,8 @@ void test01()
 {
   // Check for required typedefs
   typedef std::allocator_traits  test_type;
+  typedef typename test_type::allocator_typeallocator_type;
+  typedef typename test_type::value_typevalue_type;
   typedef typename test_type::pointer   pointer;
   typedef typename test_type::const_pointer const_pointer;
   typedef typename test_type::void_pointer  void_pointer;


PATCH [0/n]: Prepare middle-end for x32 branch merge

2011-06-11 Thread H.J. Lu
Hi,

I am submitting a series of middle-end patches to prepare for x32 branch
merge. GCC has a very good support for Pmode != ptr_mode.  However x32
branch exposes some corner cases where GCC generates x86 specific
optimizations, like strlen expansion.  Those patches are needed for
x32 support.


H.J.


PATCH [1/n]: Prepare x32: PR middle-end/47364: internal compiler error: in emit_move_insn, at expr.c:3355

2011-06-11 Thread H.J. Lu
Hi,

expand_builtin_strlen has

src_reg = gen_reg_rtx (Pmode);
...
pat = expand_expr (src, src_reg, ptr_mode, EXPAND_NORMAL);
if (pat != src_reg)
  emit_move_insn (src_reg, pat);

But src_reg may be in ptr_mode, wich may not be the same as Pmode.
This patch checks it.  OK for trunk?

Thanks.


H.J.
---
2011-06-11  H.J. Lu  

PR middle-end/47364
* builtins.c (expand_builtin_strlen): Properly handle target
not in Pmode.

diff --git a/gcc/builtins.c b/gcc/builtins.c
index 7b24a0c..4e2cf31 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -2941,7 +2941,11 @@ expand_builtin_strlen (tree exp, rtx target,
   start_sequence ();
   pat = expand_expr (src, src_reg, ptr_mode, EXPAND_NORMAL);
   if (pat != src_reg)
-   emit_move_insn (src_reg, pat);
+   {
+ if (GET_MODE (pat) != Pmode)
+   pat = convert_to_mode (Pmode, pat, 1);
+ emit_move_insn (src_reg, pat);
+   }
   pat = get_insns ();
   end_sequence ();
 


Cgraph alias reorg 18/14 (fix LTO symtab streaming)

2011-06-11 Thread Jan Hubicka
Hi,
another hunk that got lost.  We need to stream aliases into the symbol table.
For some reason this cuase very little trouble...

Bootstrapped/regtested x86_64-linux.
Comitted.
Honza
Index: ChangeLog
===
--- ChangeLog   (revision 174955)
+++ ChangeLog   (working copy)
@@ -1,5 +1,10 @@
 2011-06-11  Jan Hubicka  
 
+   * lto-streamer-out.c (produce_symtab): Stream out the newly represented
+   aliases.
+
+2011-06-11  Jan Hubicka  
+
* ipa-prop.c (ipa_make_edge_direct_to_target): Fix code setting varying 
args.
(ipa_update_after_lto_read): Likewise.
(ipa_write_node_info): Do not sream call_with_var_arguments.
Index: lto-streamer-out.c
===
--- lto-streamer-out.c  (revision 174952)
+++ lto-streamer-out.c  (working copy)
@@ -2582,7 +2582,7 @@ produce_symtab (struct output_block *ob,
   if (DECL_COMDAT (node->decl)
  && cgraph_comdat_can_be_unshared_p (node))
continue;
-  if (node->alias || node->global.inlined_to)
+  if ((node->alias && !node->thunk.alias) || node->global.inlined_to)
continue;
   write_symbol (cache, &stream, node->decl, seen, false);
 }
@@ -2594,7 +2594,7 @@ produce_symtab (struct output_block *ob,
   if (DECL_COMDAT (node->decl)
  && cgraph_comdat_can_be_unshared_p (node))
continue;
-  if (node->alias || node->global.inlined_to)
+  if ((node->alias && !node->thunk.alias) || node->global.inlined_to)
continue;
   write_symbol (cache, &stream, node->decl, seen, false);
 }


[v3] improve allocator_traits test

2011-06-11 Thread Jonathan Wakely
2011-06-11  Jonathan Wakely  

* testsuite/20_util/allocator_traits/requirements/
explicit_instantiation.cc: Add another instantiation.

Tested x86_64-linux, committed to trunk.
Index: testsuite/20_util/allocator_traits/requirements/explicit_instantiation.cc
===
--- testsuite/20_util/allocator_traits/requirements/explicit_instantiation.cc   
(revision 174931)
+++ testsuite/20_util/allocator_traits/requirements/explicit_instantiation.cc   
(working copy)
@@ -22,8 +22,21 @@
 
 #include 
 
+typedef short test_type;
+
+template
+  struct minimal_allocator
+  {
+typedef T value_type;
+minimal_allocator();
+template 
+  minimal_allocator(const minimal_allocator&);
+T* allocate(std::size_t);
+void deallocate(T*, std::size_t);
+  };
+
 namespace std
 {
-  typedef short test_type;
   template struct allocator_traits>;
+  template struct allocator_traits>;
 }


RFC: __gnu_cxx::__alloc_traits extension

2011-06-11 Thread Jonathan Wakely
Here's the next piece of my ongoing allocator work, which I think is
ready to check in.

I've moved allocator_traits to a separate header, so it can be used
without including the definition of std::allocator, so this means
we'll have:

bits/uses_allocator.h: std::allocator_arg, std::uses_allocator
bits/alloc_traits.h: std::allocator_traits
bits/allocator.h: std::allocator

These are all independent and sometimes useful in isolation (e.g.
tuple only needs the first two, containers only need the last two) so
I think it's good to have separate headers not a single big one.

This patch also adds ext/alloc_traits.h which defines a new extension,
__gnu_cxx::__alloc_traits, which provides a subset of the
allocator_traits API in both C++98 and C++0x mode. The rest of the
library can use __alloc_traits::construct(a, p, x) and have that call
a.construct(p, x) for C++98 or allocator_traits::construct(a, p, x) in
C++0x.  The patch modifies stl_construct.h and stl_uninitialized.h to
use that new utility, demonstrating that it makes supporting the C++0x
allocator model easier.


Fellow maintainers, do you think this is worth declaring in its own
header as an extension which users can use, or should it just be an
internal implementation detail, defined in bits/alloc_traits.h and not
meant for users?



This passes the testsuite in both c++98 and c++0x modes, so I'd like
to commit it soon unless I hear objections to ext/alloc_traits.h


2011-06-11  Jonathan Wakely  

* include/Makefile.am: Add alloc_traits.h headers.
* include/Makefile.in: Regenerate.
* include/std/memory: Include uses_allocator.h explicitly.
* include/bits/allocator.h (allocator_traits): Move to ...
* include/bits/alloc_traits.h: New header.
* include/ext/alloc_traits.h (__alloc_traits): Extension to provide
a common allocator interface for C++98 and C++0x.
* include/bits/stl_construct.h: Use __alloc_traits.
* include/bits/stl_uninitialized.h: Likewise.
Index: include/Makefile.am
===
--- include/Makefile.am (revision 174931)
+++ include/Makefile.am (working copy)
@@ -79,6 +80,7 @@ bits_srcdir = ${glibcxx_srcdir}/include/
 bits_builddir = ./bits
 bits_headers = \
 ${bits_srcdir}/algorithmfwd.h \
+   ${bits_srcdir}/alloc_traits.h \
${bits_srcdir}/allocator.h \
${bits_srcdir}/atomic_base.h \
${bits_srcdir}/atomic_0.h \
@@ -493,6 +495,7 @@ ext_srcdir = ${glibcxx_srcdir}/include/e
 ext_builddir = ./ext
 ext_headers = \
${ext_srcdir}/algorithm \
+   ${ext_srcdir}/alloc_traits.h \
${ext_srcdir}/atomicity.h \
${ext_srcdir}/array_allocator.h \
${ext_srcdir}/bitmap_allocator.h \
Index: include/std/memory
===
--- include/std/memory  (revision 174931)
+++ include/std/memory  (working copy)
@@ -76,6 +76,7 @@
 #  include 
 #  include 
 #  include   // std::less
+#  include 
 #  include 
 #  include 
 #  include 
Index: include/bits/allocator.h
===
--- include/bits/allocator.h(revision 174931)
+++ include/bits/allocator.h(working copy)
@@ -47,12 +47,6 @@
 // Define the base class to std::allocator.
 #include 
 
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-#include 
-#include 
-#include 
-#endif
-
 namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
@@ -62,6 +56,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* @ingroup memory
*
* Classes encapsulating memory operations.
+   *
+   * @{
*/
 
   template
@@ -85,7 +81,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   /**
* @brief  The @a standard allocator, as per [20.4].
-   * @ingroup allocators
*
*  See http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt04ch11.html
*  for further details.
@@ -139,6 +134,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 operator!=(const allocator<_Tp>&, const allocator<_Tp>&)
 { return false; }
 
+  /**
+   * @}
+   */
+
   // Inhibit implicit instantiations for required instantiations,
   // which are defined via explicit instantiations elsewhere.
 #if _GLIBCXX_EXTERN_TEMPLATE
@@ -197,404 +196,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return false; }
 }
 
-  template
-class __alloctr_rebind_helper
-{
-  template
-   static constexpr bool
-   _S_chk(typename _Alloc2::template rebind<_Tp2>::other*)
-   { return true; }
-
-  template
-static constexpr bool
-   _S_chk(...)
-   { return false; }
-
-public:
-  static const bool __value = _S_chk<_Alloc, _Tp>(nullptr);
-};
-
-  template::__value>
-struct __alloctr_rebind;
-
-  template
-struct __alloctr_rebind<_Alloc, _Tp, true>
-{
-  typedef typename _Alloc::template rebind<_Tp>::other __type;
-};
-
-  template class _Alloc, typename _Tp,
-typen

PATCH [2/n]: Prepare x32: Convert pointer to TLS symbol if needed

2011-06-11 Thread H.J. Lu
Hi,

Backend may promote pointers to Pmode.  Before we force a TLS symbol
to a pseudo, we may need to convert it to proper mode.  OK for trunk?

Thanks.


H.J.

2011-06-11  H.J. Lu  

* calls.c (precompute_register_parameters): Convert pointer to
TLS symbol if needed.

diff --git a/gcc/calls.c b/gcc/calls.c
index feb98d2..de98267 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -706,7 +706,13 @@ precompute_register_parameters (int num_actuals, struct 
arg_data *args,
   pseudo now.  TLS symbols sometimes need a call to resolve.  */
if (CONSTANT_P (args[i].value)
&& !targetm.legitimate_constant_p (args[i].mode, args[i].value))
- args[i].value = force_reg (args[i].mode, args[i].value);
+ {
+   if (GET_MODE (args[i].value) != args[i].mode)
+ args[i].value = convert_to_mode (args[i].mode,
+  args[i].value,
+  args[i].unsignedp);
+   args[i].value = force_reg (args[i].mode, args[i].value);
+ }
 
/* If we are to promote the function arg to a wider mode,
   do it now.  */


PATCH [3/n]: Prepare x32: PR rtl-optimization/49088: Combine fails to properly handle zero-extension and signed int constant

2011-06-11 Thread H.J. Lu
See:

http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02150.html

for an analysis.  OK for trunk?

Thanks.


H.J.
---
2011-05-21  H.J. Lu  

PR rtl-optimization/49088
* combine.c (force_to_mode): If X is narrower than MODE and we
want all the bits in X's mode, just use the operand when it
is CONST_INT.

diff --git a/gcc/combine.c b/gcc/combine.c
index 8af86f2..710fe0e 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -8321,8 +8321,26 @@ force_to_mode (rtx x, enum machine_mode mode, unsigned 
HOST_WIDE_INT mask,
   /* For most binary operations, just propagate into the operation and
 change the mode if we have an operation of that mode.  */
 
-  op0 = force_to_mode (XEXP (x, 0), mode, mask, next_select);
-  op1 = force_to_mode (XEXP (x, 1), mode, mask, next_select);
+  /* If X is narrower than MODE and we want all the bits in X's
+mode, just use the operand when it is CONST_INT.  */
+  if (SCALAR_INT_MODE_P (mode)
+ && GET_MODE_SIZE (GET_MODE (x)) < GET_MODE_SIZE (mode)
+ && (GET_MODE_MASK (GET_MODE (x)) & ~mask) == 0)
+   {
+ if (CONST_INT_P (XEXP (x, 0)))
+   op0 = XEXP (x, 0);
+ else
+   op0 = force_to_mode (XEXP (x, 0), mode, mask, next_select);
+ if (CONST_INT_P (XEXP (x, 1)))
+   op1 = XEXP (x, 1);
+ else
+   op1 = force_to_mode (XEXP (x, 1), mode, mask, next_select);
+   }
+  else
+   {
+ op0 = force_to_mode (XEXP (x, 0), mode, mask, next_select);
+ op1 = force_to_mode (XEXP (x, 1), mode, mask, next_select);
+   }
 
   /* If we ended up truncating both operands, truncate the result of the
 operation instead.  */


Re: [patch, libgfortran] PR48906 Wrong rounding results with -m32

2011-06-11 Thread Thomas Henlich
On Sat, Jun 11, 2011 at 14:41, jerry DeLisle  wrote:
> This was established as solution to PR48488 where we had two choices for
> selecting the significant digits. Nine significant digits was established as
> a requirement to guarantee round trip in all cases. The char4_iunit_1.f03
> test case was revised because after we corrected the formatting in PR48906,
> it started to fail and I observed the test case was looking for the wrong
> number of significant digits.
>
> Based on this, I would suggest we leave it as I have it, which is correct.

I'm afraid it's not.

1.23450002E-06 has nine significant digits. That's how it should be.

We don't want 1PG16.9E2 editing for list-directed and G0,
but G16.9E2 for the F editing range and 1PE16.8E2 editing for the E range.

This is to make sure the result always has nine significant digits,
whether in the F or E range.


PATCH [4/n]: Prepare x32: Permute the conversion and addition if one operand is a constant

2011-06-11 Thread H.J. Lu
Hi,

convert_memory_address_addr_space has a special PLUS/MULT case for
POINTERS_EXTEND_UNSIGNED < 0.  It turns out that it is also needed
for all Pmode != ptr_mode cases.  OK for trunk?

Thanks.


H.J.
---
2011-06-11  H.J. Lu  

PR middle-end/47727
* explow.c (convert_memory_address_addr_space): Permute the
conversion and addition if one operand is a constant.

diff --git a/gcc/explow.c b/gcc/explow.c
index 7387dad..b343bf8 100644
--- a/gcc/explow.c
+++ b/gcc/explow.c
@@ -383,18 +383,13 @@ convert_memory_address_addr_space (enum machine_mode 
to_mode ATTRIBUTE_UNUSED,
 
 case PLUS:
 case MULT:
-  /* For addition we can safely permute the conversion and addition
-operation if one operand is a constant and converting the constant
-does not change it or if one operand is a constant and we are
-using a ptr_extend instruction  (POINTERS_EXTEND_UNSIGNED < 0).
-We can always safely permute them if we are making the address
-narrower.  */
+  /* For addition we safely permute the conversion and addition
+operation if one operand is a constant since we can't generate
+new instructions.  We can always safely permute them if we are
+making the address narrower.  */
   if (GET_MODE_SIZE (to_mode) < GET_MODE_SIZE (from_mode)
  || (GET_CODE (x) == PLUS
- && CONST_INT_P (XEXP (x, 1))
- && (XEXP (x, 1) == convert_memory_address_addr_space
-  (to_mode, XEXP (x, 1), as)
- || POINTERS_EXTEND_UNSIGNED < 0)))
+ && CONST_INT_P (XEXP (x, 1
return gen_rtx_fmt_ee (GET_CODE (x), to_mode,
   convert_memory_address_addr_space
 (to_mode, XEXP (x, 0), as),


Re: _ExtPtr_allocator

2011-06-11 Thread Jonathan Wakely
On 10 June 2011 22:06, Jonathan Wakely wrote:
>
> * overload construct and destroy so both the old- and new-style
> signatures are present.
>
>      template
>        void
>        construct(pointer __p, _Args&&... __args)
>        { construct(__p.get(), std::forward<_Args>(__args)...); }
>
>      void destroy(pointer __p)
>      { destroy(__p.get()); }

Here's a patch implementing this option along with some tests to use
the ExtPtr_allocator in C++0x mode Those tests fail without the patch
so I'm committing this so that ExtPtr_allocator isn't completely
broken in C++0x mode.

2011-06-11  Jonathan Wakely  

* include/ext/extptr_allocator.h (construct, destroy): Fix for C++0x
mode by overloading to take allocator's pointer type.
* testsuite/23_containers/vector/ext_pointer/types/2.cc: New.
* testsuite/23_containers/vector/ext_pointer/explicit_instantiation/
2.cc: New.

Tested x86_64-linux, committed to trunk.
Index: include/ext/extptr_allocator.h
===
--- include/ext/extptr_allocator.h  (revision 174931)
+++ include/ext/extptr_allocator.h  (working copy)
@@ -107,10 +107,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 construct(_Up* __p, _Args&&... __args)
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
 
+  template
+void
+construct(pointer __p, _Args&&... __args)
+   { construct(__p.get(), std::forward<_Args>(__args)...); }
+
   template
 void 
 destroy(_Up* __p)
 { __p->~_Up(); }
+
+  void destroy(pointer __p)
+  { destroy(__p.get()); }
+
 #else
 
   void construct(pointer __p, const _Tp& __val)
Index: testsuite/23_containers/vector/ext_pointer/types/2.cc
===
--- testsuite/23_containers/vector/ext_pointer/types/2.cc   (revision 0)
+++ testsuite/23_containers/vector/ext_pointer/types/2.cc   (revision 0)
@@ -0,0 +1,63 @@
+// Test for Container using non-standard pointer types.
+
+// Copyright (C) 2011
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// .
+
+
+// { dg-options "-std=gnu++0x" }
+
+// This is a copy of vector/types/1.cc with altered allocator.
+// The operator+()s in this test initially failed the test -
+// they stress the accurate recognition, by the compiler,
+// of _Pointer_adapter's own pointer arithmetic functions,
+// which have to match perfectly on the int type to get
+// chosen by the compiler when it sees: _Pointer_adapter + int, etc.
+
+#include 
+#include 
+
+namespace N
+{
+  struct X { };
+
+  template
+X operator+(T, std::size_t)
+{ return X(); }
+
+  template
+X operator-(T, T)
+{ return X(); }
+}
+
+int main()
+{
+  std::vector > v(5);
+  const std::vector > w(1);
+
+  v[0];
+  w[0];
+  v.size();
+  v.capacity();
+  v.resize(1);
+  v.insert(v.begin(), N::X());
+  v.insert(v.begin(), 1, N::X());
+  v.insert(v.begin(), w.begin(), w.end());
+  v = w;
+
+  return 0;
+}
Index: testsuite/23_containers/vector/ext_pointer/explicit_instantiation/2.cc
===
--- testsuite/23_containers/vector/ext_pointer/explicit_instantiation/2.cc  
(revision 0)
+++ testsuite/23_containers/vector/ext_pointer/explicit_instantiation/2.cc  
(revision 0)
@@ -0,0 +1,28 @@
+// Test for Container using non-standard pointer types.
+
+// Copyright (C) 2011
+// Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// .
+
+
+#include 
+#include 
+
+// { dg-do compile }
+// { dg-options "-std=gnu++0x" }

PATCH [5/n]: Prepare x32: PR middle-end/48016: Inconsistency in non-local goto save area

2011-06-11 Thread H.J. Lu
Hi,

We are very inconsistent when saving and restoring non-local goto save
area.  See:

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

for detailed analysis.  OK for trunk?

Thanks.


H.J.
---
2011-06-07  H.J. Lu  

PR middle-end/48016
* explow.c (emit_stack_save): Adjust mode of stack save area.

* function.c (expand_function_start): Properly store frame
pointer for non-local goto.

diff --git a/gcc/explow.c b/gcc/explow.c
index 7387dad..b343bf8 100644
--- a/gcc/explow.c
+++ b/gcc/explow.c
@@ -1035,6 +1030,14 @@ emit_stack_save (enum save_level save_level, rtx *psave)
   do_pending_stack_adjust ();
   if (sa != 0)
 sa = validize_mem (sa);
+  /* FIXME: update_nonlocal_goto_save_area may pass SA in the wrong mode.  */
+  if (GET_MODE (sa) != mode)
+{
+  gcc_assert (ptr_mode != Pmode
+ && GET_MODE (sa) == ptr_mode
+ && mode == Pmode);
+  sa = adjust_address (sa, mode, 0); 
+}
   emit_insn (fcn (sa, stack_pointer_rtx));
 }
 
diff --git a/gcc/function.c b/gcc/function.c
index 30cc9ff..47fd5b7 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -4779,7 +4779,7 @@ expand_function_start (tree subr)
   cfun->nonlocal_goto_save_area,
   integer_zero_node, NULL_TREE, NULL_TREE);
   r_save = expand_expr (t_save, NULL_RTX, VOIDmode, EXPAND_WRITE);
-  r_save = convert_memory_address (Pmode, r_save);
+  r_save = adjust_address (r_save, Pmode, 0);
 
   emit_move_insn (r_save, targetm.builtin_setjmp_frame_value ());
   update_nonlocal_goto_save_area ();


Re: Cgraph alias reorg 15/14 (New infrastructure for same body aliases)

2011-06-11 Thread H.J. Lu
On Sat, Jun 11, 2011 at 5:55 AM, Jan Hubicka  wrote:
> Hi,
> this patch complettes the same body alias rework by removing the old same body
> alias code and adding new representation.  Same body aliases are now separate
> function nodes that have IPA_REF_ALIAS reference to the node they are alias 
> of.
>
> I am still getting one failure:
> FAIL: g++.dg/torture/pr43879-1_1.C
>
> It tests IPA PTA in presence of same body aliases.  I honestly have no idea
> what is wrong there.  I decided to go ahead with the patch anyway, given the
> current state of affair of aliases and IPA-PTA. Hope Richard will help me
> fixing this on Monday.
>
> The major pain with this change is that C++ FE gets same body aliases wrong.
> It creates them with random visibilities that are not final ones, it also
> creates them late in game via DECL_ASSEMBLER_NAME langhook, it forgets to set
> them same_comdat_group links and it do not set DECLARED_INLINE and
> DISREGARD_INLINE_LIMITS flags.
>
> I fix that up at cgraphunit side for now, but it would be cool to resolve 
> those
> problems.
>
> I will followup with two extra fixes needed to fully build Mozilla with LTO
> again.  Once things settle down, I will switch real aliases to the new
> infrastructure, too.
>
> Bootstrapped/regtested x86_64-linux, will commit it today.
>
>
>        * lto-symtab.c (lto_cgraph_replace_node): Kill same body alias code.
>        (lto_symtab_resolve_can_prevail_p): Likewise.
>        (lto_symtab_merge_cgraph_nodes): Update merging of aliases.
>        * cgraph.c (same_body_aliases_done): New global var.
>        (cgraph_same_body_alias_1): Rename to ...
>        (cgraph_create_function_alias): ... this one; reorg to new
>        representation.
>        (cgraph_same_body_alias): Use cgraph_create_function_alias;
>        record references when asked to.
>        (cgraph_add_thunk): Fix formating.
>        (cgraph_get_node): Kill same body alias code.
>        (cgraph_node_for_asm): Likewise.
>        (cgraph_remove_same_body_alias): Remove.
>        (cgraph_remove_node): Kill same body alias code.
>        (cgraph_mark_address_taken_node): Mark also the aliased function
>        as having address taken.
>        (dump_cgraph_node): Dump same body aliases.
>        (cgraph_for_node_thunks_and_aliases): Update for new alias
>        representation.
>        (cgraph_for_node_and_aliases): Likewise.
>        * cgraph.h (same_body): Kll pointer.
>        (same_body_alias): Update comment.
>        (same_body_aliases_done): Declare.
>        (cgraph_remove_same_body_alias): Remove declaration.
>        (cgraph_create_function_alias): Declare.
>        (cgraph_process_same_body_aliases): Declare.
>        (cgraph_function_with_gimple_body_p): Check for alias.
>        (cgraph_can_remove_if_no_direct_calls_p): Look for aliases.
>        (cgraph_alias_aliased_node): New function.
>        (cgraph_function_node): Update for new aliases.
>        (cgraph_function_or_thunk_node): Likewise.
>        * ipa-inline-transform.c (can_remove_node_now_p): Look for aliases.
>        (inline_call): Remove dead aliases.
>        * cgraphunit.c (cgraph_decide_is_function_needed): Disable assembler 
> name
>        hack for same body aliases.
>        (clone_of_p): Look through aliases.
>        (verify_cgraph_node): Verify aliases.
>        (cgraph_analyze_function): Analyze aliases; fixup C++ bugs.
>        (cgraph_process_same_body_aliases): New function.
>        (process_function_and_variable_attributes): Disable weakref warning on
>        alias.
>        (cgraph_analyze_functions): Handle aliases.
>        (cgraph_mark_functions_to_output): Handle aliases same way as thunks.
>        (assemble_thunks): Rename to ...
>        (assemble_thunks_and_aliases): ... this one; handle aliases, too.
>        (cgraph_expand_function): Remove alias output code.
>        (cgraph_output_in_order): Skip aliases.
>        (cgraph_preserve_function_body_p): Aliases don't need preserving.
>        * ipa-ref.c (ipa_ref_use_name): Add alias reference.
>        (ipa_record_reference): Do not assert on alias references.
>        (ipa_ref_has_aliases_p): New function.
>        * ipa-ref.h (enum ipa_ref_use): Add IPA_REF_ALIAS.
>        (ipa_ref_has_aliases_p): Declare.
>        * lto-cgraph.c (lto_output_node): Handle aliases.
>        (input_node): Likewise.
>        * lto-streamer-out.c (lto_output): Skip aliases.
>        (produce_symtab): Kill same_body_alias code.
>        * ipa-utils.c (ipa_reverse_postorder): Add FIXME.
>        (ipa_reverse_postorder): Use cgraph_only_called_directly_or_aliased_p.
>        * ipa-inline.c (update_caller_keys): Walk aliases.
>        (inline_small_functions): Fix thinko in previous patch.
>        * ipa.c (cgraph_externally_visible_p): Do not walk aliases.
>        (function_and_variable_visibility): Do not walk same body aliases.
>        * tree-ssa-structalias.c (associate_varinfo_to_alias): New function.
>        (ipa_pta_execute): Use it.
>
>        

Re: [PATCH, i386]: Fix mode of forced register in vec_dupv4sf

2011-06-11 Thread H.J. Lu
On Sat, Jun 11, 2011 at 4:16 AM, Uros Bizjak  wrote:
> Hello!
>
> 2011-06-11  Uros Bizjak  
>
>        * config/i386/sse.md (vec_dupv4sf): Correct mode of forced register.
>        (*vec_dupv2df): Rename from vec_dupv2df.
>        (vec_dupv2df): New expander.
>
> Tested on x86_64-pc-linux-gnu {,-m32}. Committed to mainline SVN, will
> also be committed to 4.5 and 4.6 branch.
>

This may have caused:

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


-- 
H.J.


Re: [patch, testsuite] Fix g++.dg/opt/devirt2.C scanning, PR 48727

2011-06-11 Thread Mike Stump
On Jun 10, 2011, at 9:28 AM, Steve Ellcey wrote:
> I will check in this testsuite fix as obvious if there are no objections.

Thanks for the comments.  When doing a port, having a comment on other port's 
issues with a testcase, is useful, as you get to say, gosh, I'm in that class 
too, and just blindly follow the same path for the same reason.



Re: RFA (fold): PATCH for c++/49290 (folding *(T*)(ar+10))

2011-06-11 Thread Mike Stump
On Jun 10, 2011, at 7:20 AM, Richard Guenther wrote:
> On Fri, 10 Jun 2011, Jason Merrill wrote:
> 
>> On 06/10/2011 10:03 AM, Richard Guenther wrote:
> *((volatile int *)&a[0] + 1)
 
 It would be correct to fold it to
 
 VIEW_CONVERT_EXPR
>>> 
>>> No, it wouldn't be correct.  It isn't correct to fold it to an array-ref
>>> that isn't volatile.
>> 
>> Hmm?  The C expression produces a volatile int lvalue referring to the second
>> element of a, as does the VIEW_CONVERT_EXPR.  They seem equivalent to me.
> 
> no, a VIEW_CONVERT_EXPR is generally not an lvalue (fold for example
> would turn the above to (volatile int) a[1]).

Curious.  We have built up a built-in infrastructure that allows for lvalue 
register references.  I noticed that for vector types, vectors with different 
type names but the same in every other respect come out different, and a 
VIEW_CONVERT_EXPR is placed on it to get the types to match.  Presently I'm 
treating VIEW_CONVERT_EXPR as an lvalue.  For me not to, I'd need either for 
the same type to be used, or, for another conversion node to be used that can 
preserve the lvalueness of registers.

Now, if people want to know why, lvalue for registers, it is to support in/out 
and output only parameters to built-ins.

Thoughts?


Re: [google] Enhance Annotalysis to support cloned functions/methods (issue4591066)

2011-06-11 Thread dnovillo


OK with some minor nits.


Diego.


http://codereview.appspot.com/4591066/diff/3001/gcc/tree-threadsafe-analyze.c
File gcc/tree-threadsafe-analyze.c (right):

http://codereview.appspot.com/4591066/diff/3001/gcc/tree-threadsafe-analyze.c#newcode1159
gcc/tree-threadsafe-analyze.c:1159: gcc_assert (false);

+ else
+  gcc_assert (false);
+


Change to gcc_unreachable ();

http://codereview.appspot.com/4591066/diff/3001/gcc/tree-threadsafe-analyze.c#newcode2151
gcc/tree-threadsafe-analyze.c:2151: && gimple_call_num_args(call) > 0)
2147  starting from GCC-4.5.). The clones could be created as early
as when
 2148  constructing SSA. Also note that the parameters of a cloned
method could
 2149  be optimized away.  */
 2150   if (TREE_CODE (TREE_TYPE (DECL_ORIGIN (fdecl))) == METHOD_TYPE
 2151   && gimple_call_num_args(call) > 0)

Wouldn't it be easier to make fdecl == DECL_ORIGIN (fdecl) earlier in
the function?

It's OK either way, though.

http://codereview.appspot.com/4591066/


Re: [patch, libgfortran] PR48906 Wrong rounding results with -m32

2011-06-11 Thread jvdelisle

On Sat, Jun 11, 2011 at 8:56 AM, Thomas Henlich wrote:

On Sat, Jun 11, 2011 at 14:41, jerry DeLisle  
wrote:
This was established as solution to PR48488 where we had two choices 
for
selecting the significant digits. Nine significant digits was 
established as
a requirement to guarantee round trip in all cases. The 
char4_iunit_1.f03
test case was revised because after we corrected the formatting in 
PR48906,
it started to fail and I observed the test case was looking for the 
wrong

number of significant digits.

Based on this, I would suggest we leave it as I have it, which is 
correct.


I'm afraid it's not.

1.23450002E-06 has nine significant digits. That's how it should be.

We don't want 1PG16.9E2 editing for list-directed and G0,
but G16.9E2 for the F editing range and 1PE16.8E2 editing for the E 
range.


This is to make sure the result always has nine significant digits,
whether in the F or E range.



My bad, I counted across wrong.  Working on it.  Coffee deficiency in 
the early morning.


;)

Jerry

Jerry


Re: [PATCH PR45098, 7/10] Nowrap limits iterations

2011-06-11 Thread Zdenek Dvorak
Hi,

> > I think a better fix would be to make the nb_iterations_upper_bound 
> > semantics
> > consistent with that of nb_iterations.  Let me try to do it, hopefully this 
> > should
> > be mostly mechanical,
> > 
> 
> This patch changes the semantics of nb_iterations_upper_bound and
> nb_iterations_estimate, to mean: the amount of latch executions.
> 
> That change is countered at all use sites, except for
> tree-ssa-loop-ivopts.c:may_eliminate_iv.
> 
> Passed x86_64 bootstrapping and reg-testing.
> 
> OK for trunk?

yes,

Zdenek


Is VIEW_CONVERT_EXPR an lvalue? (was Re: RFA (fold): PATCH for c++/49290 (folding *(T*)(ar+10)))

2011-06-11 Thread Jason Merrill

On 06/10/2011 10:20 AM, Richard Guenther wrote:

no, a VIEW_CONVERT_EXPR is generally not an lvalue (fold for example
would turn the above to (volatile int) a[1]).


The gimplifier seems to consider it an lvalue: gimplify_expr uses 
gimplify_compound_lval for it, and gimplify_addr_expr handles taking its 
address.  And get_inner_reference handles it.  So I think fold should be 
changed, and we should clarify that VIEW_CONVERT_EXPR is an lvalue.


If not, we need a new tree code for treating an lvalue as an lvalue of a 
different type without having to take its address; that's what I thought 
VIEW_CONVERT_EXPR was for.


Jason


Re: Cgraph alias reorg 15/14 (New infrastructure for same body aliases)

2011-06-11 Thread H.J. Lu
On Sat, Jun 11, 2011 at 9:15 AM, H.J. Lu  wrote:
> On Sat, Jun 11, 2011 at 5:55 AM, Jan Hubicka  wrote:
>> Hi,
>> this patch complettes the same body alias rework by removing the old same 
>> body
>> alias code and adding new representation.  Same body aliases are now separate
>> function nodes that have IPA_REF_ALIAS reference to the node they are alias 
>> of.
>>
>> I am still getting one failure:
>> FAIL: g++.dg/torture/pr43879-1_1.C
>>
>> It tests IPA PTA in presence of same body aliases.  I honestly have no idea
>> what is wrong there.  I decided to go ahead with the patch anyway, given the
>> current state of affair of aliases and IPA-PTA. Hope Richard will help me
>> fixing this on Monday.
>>
>> The major pain with this change is that C++ FE gets same body aliases wrong.
>> It creates them with random visibilities that are not final ones, it also
>> creates them late in game via DECL_ASSEMBLER_NAME langhook, it forgets to set
>> them same_comdat_group links and it do not set DECLARED_INLINE and
>> DISREGARD_INLINE_LIMITS flags.
>>
>> I fix that up at cgraphunit side for now, but it would be cool to resolve 
>> those
>> problems.
>>
>> I will followup with two extra fixes needed to fully build Mozilla with LTO
>> again.  Once things settle down, I will switch real aliases to the new
>> infrastructure, too.
>>
>> Bootstrapped/regtested x86_64-linux, will commit it today.
>>
>>
>>        * lto-symtab.c (lto_cgraph_replace_node): Kill same body alias code.
>>        (lto_symtab_resolve_can_prevail_p): Likewise.
>>        (lto_symtab_merge_cgraph_nodes): Update merging of aliases.
>>        * cgraph.c (same_body_aliases_done): New global var.
>>        (cgraph_same_body_alias_1): Rename to ...
>>        (cgraph_create_function_alias): ... this one; reorg to new
>>        representation.
>>        (cgraph_same_body_alias): Use cgraph_create_function_alias;
>>        record references when asked to.
>>        (cgraph_add_thunk): Fix formating.
>>        (cgraph_get_node): Kill same body alias code.
>>        (cgraph_node_for_asm): Likewise.
>>        (cgraph_remove_same_body_alias): Remove.
>>        (cgraph_remove_node): Kill same body alias code.
>>        (cgraph_mark_address_taken_node): Mark also the aliased function
>>        as having address taken.
>>        (dump_cgraph_node): Dump same body aliases.
>>        (cgraph_for_node_thunks_and_aliases): Update for new alias
>>        representation.
>>        (cgraph_for_node_and_aliases): Likewise.
>>        * cgraph.h (same_body): Kll pointer.
>>        (same_body_alias): Update comment.
>>        (same_body_aliases_done): Declare.
>>        (cgraph_remove_same_body_alias): Remove declaration.
>>        (cgraph_create_function_alias): Declare.
>>        (cgraph_process_same_body_aliases): Declare.
>>        (cgraph_function_with_gimple_body_p): Check for alias.
>>        (cgraph_can_remove_if_no_direct_calls_p): Look for aliases.
>>        (cgraph_alias_aliased_node): New function.
>>        (cgraph_function_node): Update for new aliases.
>>        (cgraph_function_or_thunk_node): Likewise.
>>        * ipa-inline-transform.c (can_remove_node_now_p): Look for aliases.
>>        (inline_call): Remove dead aliases.
>>        * cgraphunit.c (cgraph_decide_is_function_needed): Disable assembler 
>> name
>>        hack for same body aliases.
>>        (clone_of_p): Look through aliases.
>>        (verify_cgraph_node): Verify aliases.
>>        (cgraph_analyze_function): Analyze aliases; fixup C++ bugs.
>>        (cgraph_process_same_body_aliases): New function.
>>        (process_function_and_variable_attributes): Disable weakref warning on
>>        alias.
>>        (cgraph_analyze_functions): Handle aliases.
>>        (cgraph_mark_functions_to_output): Handle aliases same way as thunks.
>>        (assemble_thunks): Rename to ...
>>        (assemble_thunks_and_aliases): ... this one; handle aliases, too.
>>        (cgraph_expand_function): Remove alias output code.
>>        (cgraph_output_in_order): Skip aliases.
>>        (cgraph_preserve_function_body_p): Aliases don't need preserving.
>>        * ipa-ref.c (ipa_ref_use_name): Add alias reference.
>>        (ipa_record_reference): Do not assert on alias references.
>>        (ipa_ref_has_aliases_p): New function.
>>        * ipa-ref.h (enum ipa_ref_use): Add IPA_REF_ALIAS.
>>        (ipa_ref_has_aliases_p): Declare.
>>        * lto-cgraph.c (lto_output_node): Handle aliases.
>>        (input_node): Likewise.
>>        * lto-streamer-out.c (lto_output): Skip aliases.
>>        (produce_symtab): Kill same_body_alias code.
>>        * ipa-utils.c (ipa_reverse_postorder): Add FIXME.
>>        (ipa_reverse_postorder): Use cgraph_only_called_directly_or_aliased_p.
>>        * ipa-inline.c (update_caller_keys): Walk aliases.
>>        (inline_small_functions): Fix thinko in previous patch.
>>        * ipa.c (cgraph_externally_visible_p): Do not walk aliases.
>>        (function_and_variable_visibility): Do not