Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Michael Veksler
This overflow attitude has some resemblance to the attitude that 
resulted in the Y2K issues. I don't try to troll, I have a detailed 
explanation below.
Some time ago (a year?) I was told on this mailing-list that code 
breakage due to undefinedness of signed overflow is not too common (I at 
least claimed with no evidence that it was more than one bug per 1,000 
lines). My claim was counterclaimed by something like most of the time 
people work with small enough values, so overflows don't happen too many 
times in practice. At first, this sounds reasonable. Then, I realized 
that it sounds awfully similar to two digits are enough to represent a 
year.
You may think that the analogy is far fetched? In that case, I'll pick 
some gcc source file, at random and look for signed operations in it:

categorize_ctor_elements_1(..) in gcc/expr.c:
_elts += mult * nz;
elt_count += mult * ic;
Both assume that neither the multiplication, nor the addition overflow. 
Can GCC be really sure that this case will be caught outside this 
function, before it is called? Will it be always so in the future? You 
can't even add an assert to make sure that no overflow had occurred. You 
can't write:

temp=mult*nz;
a_gcc_assert(mult !=0  temp/mult==nz);
a_gcc_assert(_elts+temp = _elts);
_elts += temp;
You'd have to add a very weird looking assert like:
some_gcc_assert(
nz !=0 || (unsigned HOST_WIDE_INT)mult*nz/nz == (unsigned 
HOST_WIDE_INT)mult 

(HOST_WIDE_INT)((unsigned HOST_WIDE_INT)mult*nz) = 0
);
This is very ugly. You see, it was quite easy to find code that works 
today but may be easily break due to unrelated code shuffling that 
happen in other source files, without any warning!


rant on C standard
I don't understand why the standard committee did not add a new keyword 
(say nowrap) instead of going from implementation defined overflows to 
undefined. If one wants fast induction variables, it would have been 
possible to write:

int f(int k)
{
nowrap int i;
int ret=k;
for (i=0; i = k ; ++i)
++ret;
return ret;
}
and get the code transformed to the simple return k*2+1; which will be 
implementation defined for k = MAX_INT/2 and undefined only for k==MAX_INT.


I know, adding a keyword may break existing code, but so does adding 
rules for undefined behavior. Having a predictable breakage at compile 
time is better than having code break at random at runtime.

/rant

Gabriel Dos Reis wrote:

The problem is that what constitutes a valid program tends to differ
from what constitutes a useful program found in the wild.  The
question for GCC is how to accomodate for the useful uses without
getting far away from both conformance and non-conformance.

I don't believe this particular issue of optimization based on
undefined behaviour can be resolved by just telling people hey
look, the C standard says it is undefined, therefore we can optimize.
  
Exactly. For example take a look at the strict-aliasing issue. First 
optimizations were introduced such that if you did not conform to strict 
aliasing rules your code would silently break. In later gcc versions, 
warnings have been introduced in order to tell the user hey, this code 
might break strict aliasing, are you sure you know what you are doing?. 
The current state of the strict-aliasing warnings is still imperfect, 
but much better and improving.
On the other hand, the state of signed overflow is quite grim. Even 
though the signed overflow issue has been here for over a decade, there 
is almost no warning on high risk code. Unfortunately, it is much more 
difficult to have good warning on potential overflow bugs than for 
strict-aliasing (with negligible false positive, and reasonable false 
negative). This is true, at least for predictable warnings (that don't 
depend on irrelevant architecture/code-gen/optimization flags).

And if you're not happy, just tell the compiler not to optimize.
For not all undefined behaviour are equal, and undefined behaviour is
also a latitude given to implementors to better serve their base
users.
  
Undefined behavior is bad. I think that any language spec should keep 
the amount of undefined behavior at a bare minimum. The whole issue of 
C's (or C++'s) undefined behavior is very unintuitive for most code writers:


   * Students that learn C/C++ have too much at their hands as it is.
 They won't be able to internalize these issues on top of other new
 concepts they have to learn: recursion, free store, algorithms, etc.
   * Many lecturers (I have a gut feeling that most) that teach C/C++
 don't understand these issues well enough to teach them in a basic
 C/C++ course.
   * Books barely cover (if at all) these issues. Certainly, these
 issues are not stressed every time the terms signed or type
 casting are mentioned.
   * At verification conferences (and in other cases) I had the
 opportunity to talk to people that work on formal verification of
 C/C++ from the industry and academia. Surprisingly they 

3 new GCC mirrors

2006-12-21 Thread Marco Rinaudo - Internet.bs Corp.
Dear Collegues,
I am pleased to announce 3 new GCC mirrors located in London (UK), Hong Kong
and Toronto (CANADA), daily resync.

1) Hong Kong: http://gcc-hk.internet.bs thanks to http://www.internet.bs
(info at internet dot bs)
2) London (UK): http://gcc-uk.internet.bs thanks to http://www.internet.bs
(info at internet dot bs)
3) Toronto (Canada): http://gcc-ca.internet.bs thanks to
http://www.internet.bs (info at internet dot bs)

Please feel free to add the 3 mirrors to the official list of mirrors
located here: http://gcc.gnu.org/mirrors.html

Best regards,
Marco Rinaudo - CEO
Internet.bs Corp. - Internet domain registrations
http://www.INTERNET.bs



Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Paolo Bonzini


Some time ago (a year?) I was told on this mailing-list that code 
breakage due to undefinedness of signed overflow is not too common (I at 
least claimed with no evidence that it was more than one bug per 1,000 
lines). My claim was counterclaimed by something like most of the time 
people work with small enough values, so overflows don't happen too many 
times in practice.


This claim is a non sequitur.

What I would say is, people *don't understand why a compiler needs to 
assume undefined overflow semantics*, because people work with small 
values and don't care about the boundary conditions.


For example, most programmers that know assembly language will 
appreciate if the compiler can use the processor's support for loop with 
a known number of iterations (mtctr on PPC, for example).  However, I'm 
pretty sure that, if you present these two pieces of code to some good 
programmers,


  unsigned int i;
  for (i = 0; i = n; i++)
...

  unsigned int i;
  for (i = 0; i  n; i++)
...

where the compiler uses mtctr only in the second case, most of them will 
think that the compiler has bug.  Almost nobody will realize that the 
first can loop infinitely, and the second cannot (which is the reason 
why the compiler cannot optimize them in the same way).


Well, these programmers *are* assuming undefined overflow semantics even 
on unsigned types.  Maybe they would like overflow semantics should be 
defined in some cases and undefined in others?  Fine by me, that would 
be -fwrapv -funsafe-loop-optimizations in GCC; but a language standard 
cannot go to such detail!


On the autoconf mailing list, Paul Eggert mentioned as a good compromise 
that GCC could treat signed overflow as undefined only for loops and not 
in general.  Except that the original gnulib bug report was in a loop, 
so this compromise would leave that case undefined.


You may think that the analogy is far fetched? In that case, I'll pick 
some gcc source file, at random and look for signed operations in it:

categorize_ctor_elements_1(..) in gcc/expr.c:
_elts += mult * nz;
elt_count += mult * ic;
Both assume that neither the multiplication, nor the addition overflow. 


I see this as a *counterexample*: it shows that programmers don't care 
about having wrapping overflow, in fact they don't care about overflow 
at all.  This code is incorrect not only if overflow is undefined, but 
also if overflow wraps (-fwrapv); it is correct if overflow aborts 
(-ftrapv).


Paolo


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Paolo Bonzini



foo-bar = make_a_bar();
foo-bar-none = value;

being rendered as:

call make_a_bar
foo-bar-none = value
foo-bar = result of make_a_bar()


You are not describing a C compiler.


Um, I'm describing what gcc did?


I think he meant

x = make_a_bar ();
x-none = value;
foo-bar = x;

I don't know if this is a valid optimization, but I wouldn't be 
surprised if it is.


Palo


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Michael Veksler

Paolo Bonzini wrote:



foo-bar = make_a_bar();
foo-bar-none = value;

being rendered as:

call make_a_bar
foo-bar-none = value
foo-bar = result of make_a_bar()


You are not describing a C compiler.


Um, I'm describing what gcc did?


I think he meant

x = make_a_bar ();
x-none = value;
foo-bar = x;

I don't know if this is a valid optimization, but I wouldn't be 
surprised if it is.


Maybe he forgot the delicate details? The issue may happen if this 
example was incomplete (my completion may need some tweaking to make 
it more realistic):


   #define make_a_bar(ppInstance)  
   *(unsigned**)(ppInstance)=make_a_uint(sizeof(struct bar))

   make_a_bar(foo-bar);
   foo-bar-none = value;


In this case strict-aliasing starts its act. The store to foo-bar is 
done through a different type (pointer to unsigned), which tells gcc 
that foo-bar-none accesses one  object (type bar), while the 
construction of foo-bar accesses a different object type (unsigned 
int). In this case this code is undefined and the compiler can reorder 
these two lines.


I am not sure if the following would break as well:

   #define make_a_bar()   (struct bar*)make_a_uint(sizeof(struct bar))
   foo-bar=make_a_bar();
   foo-bar-none = value;

Since gcc should know that foo-bar of type struct bar has been 
updated before value gets written to none which is a field on object 
of type struct bar.



 Michael


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Paolo Bonzini


Maybe he forgot the delicate details? The issue may happen if this 
example was incomplete (my completion may need some tweaking to make 
it more realistic):


   #define make_a_bar(ppInstance) 
*(unsigned**)(ppInstance)=make_a_uint(sizeof(struct bar))

   make_a_bar(foo-bar);
   foo-bar-none = value;


Then, the author of make_a_bar() is getting what he deserved.


I am not sure if the following would break as well:

   #define make_a_bar()   (struct bar*)make_a_uint(sizeof(struct bar))
   foo-bar=make_a_bar();
   foo-bar-none = value;

Since gcc should know that foo-bar of type struct bar has been 
updated before value gets written to none which is a field on object 
of type struct bar.


Of course it wouldn't break.

But the reason I say that this is what you deserved, is that the cast is 
completely unnecessary.  You should write this:


#define make_a_bar (ppInstance) \
 ((ppInstance)=(void *)make_a_uint(sizeof(struct bar)))

that is, you put the cast on the other side and don't play with the 
types of the lvalues.  This is what happens all the time with malloc.


Paolo


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Michael Veksler

Paolo Bonzini wrote:


Some time ago (a year?) I was told on this mailing-list that code 
breakage due to undefinedness of signed overflow is not too common (I 
at least claimed with no evidence that it was more than one bug per 
1,000 lines). My claim was counterclaimed by something like most of 
the time people work with small enough values, so overflows don't 
happen too many times in practice.


This claim is a non sequitur.

What I would say is, people *don't understand why a compiler needs to 
assume undefined overflow semantics*, because people work with small 
values and don't care about the boundary conditions.


But that is generally true for stuff like gets/sprintf/strcpy/unsafe 
operation de-jour . People don't care for overflow cases of sprintf 
because they work with small data. Yet when, suddenly, the size of the 
data grows and funny stuff start to happen *due* to their  sprintf et. al.
For example, most programmers that know assembly language will 
appreciate if the compiler can use the processor's support for loop 
with a known number of iterations (mtctr on PPC, for example).  
However, I'm pretty sure that, if you present these two pieces of code 
to some good programmers,


  unsigned int i;
  for (i = 0; i = n; i++)
...

  unsigned int i;
  for (i = 0; i  n; i++)
...

where the compiler uses mtctr only in the second case, most of them 
will think that the compiler has bug.  Almost nobody will realize that 
the first can loop infinitely, and the second cannot (which is the 
reason why the compiler cannot optimize them in the same way).


Unfortunately, some compilers (not gcc) would optimize both cases the 
same way.
Well, these programmers *are* assuming undefined overflow semantics 
even on unsigned types.  Maybe they would like overflow semantics 
should be defined in some cases and undefined in others?  Fine by me, 
that would be -fwrapv -funsafe-loop-optimizations in GCC; but a 
language standard cannot go to such detail!


It could add the type modifier nowrap, such that loop indexes can be 
marked this way explicitly, signed or unsigned.
On the autoconf mailing list, Paul Eggert mentioned as a good 
compromise that GCC could treat signed overflow as undefined only for 
loops and not in general.  Except that the original gnulib bug report 
was in a loop, so this compromise would leave that case undefined.



I'd vote for Paul's suggestion. It would have the least-surprise effect.
You may think that the analogy is far fetched? In that case, I'll 
pick some gcc source file, at random and look for signed operations 
in it:

categorize_ctor_elements_1(..) in gcc/expr.c:
_elts += mult * nz;
elt_count += mult * ic;
Both assume that neither the multiplication, nor the addition overflow. 


I see this as a *counterexample*: it shows that programmers don't care 
about having wrapping overflow, in fact they don't care about overflow 
at all.  This code is incorrect not only if overflow is undefined, but 
also if overflow wraps (-fwrapv); it is correct if overflow aborts 
(-ftrapv).
No, it is an example for a bug which is difficult to protect against 
with an assertion. Even more seriously, instead of a simple mere bug 
with bad behavior we get escalated to undefined behavior. Undefined is 
the worst kind since in theory it is allowed to clean-up your disk, and 
explode your computer and start WW-III. Can this happen in this case? it 
depends what the caller does and if gcc can see the caller and the 
callee at the same time (e.g. if gcc knows that a caller causes  
mult=MAX_INT/2, it might assume that nz =2 for that caller, and perform 
some nasty transformations down the line).


I am not saying that GCC should abandon all optimizations that assume 
that no execution path gets to undefined cases. I am saying that these 
things should not be taken lightly. Saying programmers don't care about 
having [something leading to undefined behavior] is simply ignoring 
the graveness of the bad effects. By taking seriously I include the VRP 
that due to its lacking data structure (at least it used to be so) would 
be much less effective if gcc would to assume wrapping int.


Instead of having to choose between the bad alternatives of  VRP that 
gives weird results for undefined cases or does barely anything, its 
data structure should be improved, and each variable should have a set 
of ranges instead of a single range (like what I have seen in some 
Constraints/CP papers).




The second point in this example is:

Checking for buffer overflows (undefined code) before they occur is 
trivial in most cases. Checking for a wrapping signed int before it 
actually wraps is relatively complex and unintuitive (e.g. it is 
unintuitive why should a/b ever overflow, hint: MIN_INT/-1 -- MIN_INT). 
I would prefer plain bugs, in which -g and -O3 act just the same, over 
undefined behavior when I have no choice but to debug a -O3 code !!!
I can't forget the day (several years ago) 

Re: Reload Pass

2006-12-21 Thread Ian Lance Taylor
Rajkishore Barik [EMAIL PROTECTED] writes:

 Does anyone know of any document describing (in details) the reload phase 
 of GCC?

There isn't one.  The closest such document is
http://gcc.gnu.org/wiki/reload
which is accurate despite, or perhaps because of, starting out by
equating reload with Satan.

 I am planning to write a linear scan reload for GCC (one that does not 
 take reg_renumber
 but takes instruction specific register allocation and move information). 
 Can anyone point me
 to some existing code/literature for this in GCC? 

There is none.

If you expect this pass to actually replace reload, then I advise you
to reconsider.  That would be a hopeless task.  Well, maybe you could
do it if you restrict yourself to a single architecture.

If you want to run this pass in between the register allocator and
reload, that would probably be doable.  Of course, reload will then
muck up your decisions, and the resulting code will sometimes be worse
than what you get today.  But it might be an interesting experiment.

Ian


SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Robert Kennedy

In my ongoing plumbing work on Dan Berlin's Operator Strength
Reduction implementation, I've encountered what seems to me like a
bug. On IRC yesterday everyone seemed to agree that it was a bug.
Zdenek, OTOH, says it is not a bug.

I would like it to be a bug (so it will get fixed everywhere), so I'm
interested in getting consensus here. Hopefully Zdenek will speak up
and explain why he thinks it needs to be allowed.

The situation is that some SSA_NAMEs are disused (removed from the
code) without being released onto the free list by release_ssa_name().
I have found only one place where this happens, but Zdenek claims
there are other places. The result is that it is apparently impossible
to tell by iterating over the vector of SSA_NAMEs whether any
particular SSA_NAME is currently in use by the code. What I would like
is for the SSA_NAME_IN_FREE_LIST bit to indicate reliably whether the
SSA_NAME is unused. If there is no way to deduce what I want by
looking at an SSA_NAME, it will be necessary to walk over the code
whenever we simply want to iterate over SSA_NAMEs that are in use.

Please discuss.

   -- Robert Kennedy


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Diego Novillo

Robert Kennedy wrote on 12/21/06 11:37:

The situation is that some SSA_NAMEs are disused (removed from the 
code) without being released onto the free list by 
release_ssa_name().


Yes, it happens if a name is put into the set of names to be updated by 
update_ssa.


After update_ssa, it should be true that every SSA name with no 
SSA_NAME_DEF_STMT is in the free list.


However, if we have SSA names with no defining statement that are still 
in considered active, I would hardly consider it a serious bug.  It's a 
waste of memory, which you are more than welcome to fix, but it should 
not cause correctness issues.



Please discuss.


Test case?


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Daniel Berlin

On 12/21/06, Diego Novillo [EMAIL PROTECTED] wrote:

Robert Kennedy wrote on 12/21/06 11:37:

 The situation is that some SSA_NAMEs are disused (removed from the
 code) without being released onto the free list by
 release_ssa_name().

Yes, it happens if a name is put into the set of names to be updated by
update_ssa.

After update_ssa, it should be true that every SSA name with no
SSA_NAME_DEF_STMT is in the free list.


In this case this isn't true, because we have code that orphans ssa
names without releasing them.
I'm sure Robert will explain further details in a few moments :)


However, if we have SSA names with no defining statement that are still
in considered active, I would hardly consider it a serious bug.  It's a
waste of memory, which you are more than welcome to fix, but it should
not cause correctness issues.


It will cause not code correctness issues, but make life very very
annoying.  If you walk the ssa names one by one, and you have some
pointing to statements that don't exist anymore, because the names
were not released and defining statements nulled out by
release_ssa_name,  you are going to run into segfaults trying to walk
them.

This is exactly what happens in the case we have.

BTW, the reason we walk the list of ssa names is to DFS them.

IE the code is someting like:

for (i = 0; i  num_ssa_names; i++)
{
 tree name = ssa_name (i);
 if (name  !SSA_NAME_IN_FREELIST (name)
  DFS (name)
}

IIRC, DFS will crash trying to touch the def statement because it's
been GC'd if the ssa name is orphaned.

Anyway, it seems you still agree this is a bug in any case, even if
you don't think it's a serious bug.


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Jeffrey Law
On Thu, 2006-12-21 at 12:21 -0500, Daniel Berlin wrote:
 On 12/21/06, Diego Novillo [EMAIL PROTECTED] wrote:
  Robert Kennedy wrote on 12/21/06 11:37:
 
   The situation is that some SSA_NAMEs are disused (removed from the
   code) without being released onto the free list by
   release_ssa_name().
  
  Yes, it happens if a name is put into the set of names to be updated by
  update_ssa.
 
  After update_ssa, it should be true that every SSA name with no
  SSA_NAME_DEF_STMT is in the free list.
 
 In this case this isn't true, because we have code that orphans ssa
 names without releasing them.
 I'm sure Robert will explain further details in a few moments :)
True.  But remember, the stated purpose of the SSA_NAME recycling
code was _not_ to track every SSA_NAME that went dead and recycle
it, but instead to get the majority of them (and to ultimately save
memory by recycling them).  Orphan SSA_NAME were always expected.

If we wanted to add a new policy that all dead SSA_NAMEs must be
released to the recycling code, then that's fine, I'm not going
to object.

Alternately we can revisit the entire recycling question as well --
things have changed significantly since that code was written and
I've speculated that the utility of the recycling code has
diminished, possibly to the point of being a useless waste of time
and code.

The last obvious alternative I see is to stop chaining free nodes using
the TREE_CHAIN field.  That at least avoids the sharing between
TREE_CHAIN and SSA_NAME_DEF_STMT which often causes problems.  The
downside is given an SSA_NAME it still won't be obvious if it is an
orphan or still in use.

Jef



Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Jeffrey Law
On Thu, 2006-12-21 at 11:55 -0500, Diego Novillo wrote:
 Robert Kennedy wrote on 12/21/06 11:37:
 
  The situation is that some SSA_NAMEs are disused (removed from the 
  code) without being released onto the free list by 
  release_ssa_name().
  
 Yes, it happens if a name is put into the set of names to be updated by 
 update_ssa.
 
 After update_ssa, it should be true that every SSA name with no 
 SSA_NAME_DEF_STMT is in the free list.
 
 However, if we have SSA names with no defining statement that are still 
 in considered active, I would hardly consider it a serious bug.  It's a 
 waste of memory, which you are more than welcome to fix, but it should 
 not cause correctness issues.
 
  Please discuss.
  
 Test case?
I think the discussion should begin with reevaluating whether or not
the memory savings from recycling SSA_NAMEs is still worth the headache.

Turning on GATHER_STATISITICS ought to give you some information about
the effectiveness of recycling.   Then build some code (GCC source,
particularly with ENABLE_CHECKING defined) with/without recycling and
compare memory usage for SSA_NAMES (IIRC that memory use is broken
out separately) before/after as well as total memory usage. 

Jeff



Re: question from imobilien

2006-12-21 Thread Janis Johnson
On Wed, Dec 20, 2006 at 03:06:34PM +0100, Jan Eissfeld wrote:
 Hi,
 
 PR19978 reports that some overflow warnings are emitted multiple times. Like 
 for example,
 
 test.c:6: warning: integer overflow in expression
 test.c:6: warning: integer overflow in expression
 test.c:6: warning: integer overflow in expression
 
 The current testsuite will match any number of those to a single {
 dg-warning }. I don't know whether this is a known limitation, a bug
 on the testsuite or it just needs some magic.
 
 How could I test that exactly one warning was emitted?

See http://gcc.gnu.org/ml/gcc/2006-12/msg0.html for an ugly solution,
and the rest of the thread for problems with this approach.  The check
for getting the warning must be in a separate test from the check for
multiple warnings.

Janis


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Ian Lance Taylor
Jeffrey Law [EMAIL PROTECTED] writes:

 On Thu, 2006-12-21 at 11:55 -0500, Diego Novillo wrote:
  Robert Kennedy wrote on 12/21/06 11:37:
  
   The situation is that some SSA_NAMEs are disused (removed from the 
   code) without being released onto the free list by 
   release_ssa_name().
   
  Yes, it happens if a name is put into the set of names to be updated by 
  update_ssa.
  
  After update_ssa, it should be true that every SSA name with no 
  SSA_NAME_DEF_STMT is in the free list.
  
  However, if we have SSA names with no defining statement that are still 
  in considered active, I would hardly consider it a serious bug.  It's a 
  waste of memory, which you are more than welcome to fix, but it should 
  not cause correctness issues.
  
   Please discuss.
   
  Test case?
 I think the discussion should begin with reevaluating whether or not
 the memory savings from recycling SSA_NAMEs is still worth the headache.

I may be missing something, but I don't think that is the interesting
issue here.

I think the issue is whether we want to have a way to see all
currently valid SSA_NAMEs.  Right now we can have SSA_NAMEs in the
list which are no longer used, and we have no way to tell whether they
are used or not.  Thus the only way to see all valid SSA_NAMEs is to
walk the code.

If that is acceptable, then there is no issue here.  If that is not
acceptable, then we need to fix the code to correctly mark SSA_NAMEs
which are no longer used.  Whether we recycle the memory in the unused
SSA_NAMEs is a separate (and less interesting) discussion.

Ian


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Daniel Berlin


I may be missing something, but I don't think that is the interesting
issue here.


I agree.



I think the issue is whether we want to have a way to see all
currently valid SSA_NAMEs.  Right now we can have SSA_NAMEs in the
list which are no longer used, and we have no way to tell whether they
are used or not.  Thus the only way to see all valid SSA_NAMEs is to
walk the code.

If that is acceptable, then there is no issue here.  If that is not
acceptable, then we need to fix the code to correctly mark SSA_NAMEs
which are no longer used.  Whether we recycle the memory in the unused
SSA_NAMEs is a separate (and less interesting) discussion.


IMHO, it's not acceptable, because it leaves no way to do DFS walks
that don't involve kludges and hacks.

Ian



[GCCWIKI] password reset borken?

2006-12-21 Thread Dave Korn


Afternoon all,

  I was trying to recover my password for the gcc wiki, and it doesn't work:
when I enter my email and click the button, I see an error message at the top
of the page saying:

{u'[EMAIL PROTECTED]': (550, 'relaying denied')}

  I believe this is reporting an error at the sourceware/gcc machine because I
have no problem receiving any other mail from external sources, so I don't
think it's our server generating the error.  Is whoever administers the wiki
around?  Could you take a quick look at it for me?  TIA!


cheers,
  DaveK
-- 
Can't think of a witty .sigline today



Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Robert Kennedy
 I think the discussion should begin with reevaluating whether or not
 the memory savings from recycling SSA_NAMEs is still worth the headache.

That's a separate project that I'd rather not bundle with strength
reduction, because the two are unrelated conceptually.

My opinion is that instead, the following question should be the
starting point: Some code in GCC has a demonstrable need to iterate
over the SSA_NAMEs in current use by the program being compiled. Do we
want to provide a reasonable way to do that iteration? Currently we
don't provide it. That seems wrong to me.

I don't much care about the details of *how* the facility is provided,
although if implementing it doesn't divert me too much I'm happy to do
it. Plenty of people who know more than I do will have opinions about
how it should be done, and that's fine. I don't want to decide how it
should be done, necessarily.

I would simply like to begin with agreement that it should be
done. Or, if the consensus is that it should not be done in spite of
the need, some reasonable advice about what to do instead (I don't see
a good alternative).

-- Robert


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Robert Kennedy
I wrote:
 I don't much care about the details of *how* the facility is provided...

I should rephrase this. I do care about the interface to it. I don't
care so much about the implementation. I would like the interface to
be straightforward.

I don't want to do a separate project to reevaluate the need for
SSA_NAME recycling and build consensus about that as a prerequisite.

-- Robert


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Jeffrey Law
On Thu, 2006-12-21 at 10:08 -0800, Ian Lance Taylor wrote:

First, let's go ahead and define an orphan.  An orphan is an SSA_NAME
which has SSA_NAME_DEF_STMT pointing to a statement which does not
appear in the IL.

 I may be missing something, but I don't think that is the interesting
 issue here.
I think we would both agree that the underlying issue is our inability
to efficiently determine if a given SSA_NAME:

  a. Appears in the IL
  b. Is in the free list
  c. Is an orphan

The overloading of TREE_CHAIN/SSA_NAME_DEF_STMT inside the recycling
code makes this problem somewhat uglier.   If we didn't have that
sharing (either because we took the hit of another field or we didn't
have a recycler), then the act of releasing an SSA_NAME would probably
look like:

TREE_CHAIN (node) = NULL;

Checking for an SSA_NAME being in-use would be

  TREE_CHAIN (node) != NULL

And TREE_CHAIN (node) would *always* point to a statement in the IL
rather than sometimes pointing to a statement (which may or may not
be in the IL) and sometimes pointing to another SSA_NAME or NULL
(as is the case currently for SSA_NAMEs in the free list).

Note we'd still have the problem of orphans for which I see only two
solutions.

First, we bite the bullet and find every point where we're not releasing
orphan and we make failure to release a dead SSA_NAME an error (which we
can check during the IL scan as part of verify_ssa).  The advantage is
we know at any point the set SSA_NAMEs which appear in the IL and we
have very clearly defined rules for dealing with SSA_NAMEs.  They are
either free or they appear in the IL -- no orphans.

The alternative is to mark/sweep them between passes.  The obvious
downside is that within a pass we can get orphans, which I think
is insufficient for the current needs.

 I think the issue is whether we want to have a way to see all
 currently valid SSA_NAMEs.  Right now we can have SSA_NAMEs in the
 list which are no longer used, and we have no way to tell whether they
 are used or not.  Thus the only way to see all valid SSA_NAMEs is to
 walk the code.
Depends on your definition of valid :-)  Until now we've allowed 
valid to include orphan SSA_NAMEs.  That's far from ideal.  But
it's worked marginally until now.

Note that an orphan SSA_NAME should still have a TREE_CHAIN which
points to a valid statement node.  God help you if you try to
interpret anything inside that statement node though.

Note that with clearly defined rules you can still do node recycling.
But the implementation would be simpler.  
Jeff



Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Robert Kennedy
 In this case this isn't true, because we have code that orphans ssa
 names without releasing them.
 I'm sure Robert will explain further details in a few moments :)

Actually you explained all the relevant details. The question is
whether it should be allowed or not. So far almost everyone seems to
think not.

 It will cause not code correctness issues, but make life very very
 annoying.  If you walk the ssa names one by one, and you have some
 pointing to statements that don't exist anymore, because the names
 were not released and defining statements nulled out by
 release_ssa_name,  you are going to run into segfaults trying to walk
 them.

It isn't specifically important that the defining statements be nulled
out, of course. What matters is that there should be *some way* to
tell whether the item is in current use. Incidentally, checking for a
NULL defining statement currently doesn't work anyway because the same
field as SSA_NAME_DEF_STMT is reused for the free list
chaining. There's a flag to tell me whether a node is in the free
list, but of course that flag isn't set for the limbo nodes that you
and I agree are a problem -- because they aren't in the free list (and
they aren't in the program either).

-- Robert


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Robert Kennedy
 Right now we can have SSA_NAMEs in the
 list which are no longer used, and we have no way to tell whether they
 are used or not.  Thus the only way to see all valid SSA_NAMEs is to
 walk the code.

To wit: are there iteration macros somewhere that will help me walk
the code while abstracting away all the ugly details like stmt/bb
boundaries, etc.?

-- Robert


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Diego Novillo

Daniel Berlin wrote on 12/21/06 12:21:


for (i = 0; i  num_ssa_names; i++)
{
  tree name = ssa_name (i);
  if (name  !SSA_NAME_IN_FREELIST (name)
   DFS (name)


I see that you are not checking for IS_EMPTY_STMT.  Does DFS need to 
access things like bb_for_stmt?


In any case, that is not important.  I agree that every SSA name in the 
SSA table needs to have a DEF_STMT that is either (a) an empty 
statement, or, (b) a valid statement still present in the IL.


Note that this is orthogonal to the problem of whether we free up unused 
names from this list.  Every time a statement S disappears, we should 
make sure that the names defined by S get their SSA_NAME_DEF_STMT set to 
 NOP.


Frankly, I'm a bit surprised that we are running into this. I'd like to 
see a test case, if you have one.


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Diego Novillo

Robert Kennedy wrote on 12/21/06 13:58:

Right now we can have SSA_NAMEs in the
list which are no longer used, and we have no way to tell whether they
are used or not.  Thus the only way to see all valid SSA_NAMEs is to
walk the code.


To wit: are there iteration macros somewhere that will help me walk
the code while abstracting away all the ugly details like stmt/bb
boundaries, etc.?

No.  The code is segmented into basic blocks.  To walk the code, you 
must walk each basic block.


Something I forgot to add in my previous message.  Notice that it is not 
altogether rare to find cases where we have more SSA names than 
statements.  Are you walking the SSA names because you assume it's 
always shorter than walking the statements?


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Diego Novillo

Jeffrey Law wrote on 12/21/06 12:48:

True.  But remember, the stated purpose of the SSA_NAME recycling
code was _not_ to track every SSA_NAME that went dead and recycle
it, but instead to get the majority of them (and to ultimately save
memory by recycling them).  Orphan SSA_NAME were always expected.

But this is orthogonal to the recycling issue.  They are traversing the 
SSA name table and finding SSA names that have invalid DEF_STMT entries. 
I believe that we should support this kind of usage of the SSA table.




Alternately we can revisit the entire recycling question as well --
things have changed significantly since that code was written and
I've speculated that the utility of the recycling code has
diminished, possibly to the point of being a useless waste of time
and code.

That'd be interesting to try, yes.  Though we *do* want to invalidate 
SSA_NAME_DEF_STMT for the SSA names whose defining statement gets deleted.


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Zdenek Dvorak
Hello,

The situation is that some SSA_NAMEs are disused (removed from the
code) without being released onto the free list by
release_ssa_name().
   
   Yes, it happens if a name is put into the set of names to be updated by
   update_ssa.
  
   After update_ssa, it should be true that every SSA name with no
   SSA_NAME_DEF_STMT is in the free list.
  
  In this case this isn't true, because we have code that orphans ssa
  names without releasing them.
  I'm sure Robert will explain further details in a few moments :)
 True.  But remember, the stated purpose of the SSA_NAME recycling
 code was _not_ to track every SSA_NAME that went dead and recycle
 it, but instead to get the majority of them (and to ultimately save
 memory by recycling them).  Orphan SSA_NAME were always expected.
 
 If we wanted to add a new policy that all dead SSA_NAMEs must be
 released to the recycling code, then that's fine, I'm not going
 to object.

I think this might be a good idea.  I think that this requires
a lot of changes (basically going through all uses of bsi_remove
and remove_phi_node and checking them), but it would be cleaner
than the current situation.

It should be however easy to add verification to verify_ssa, so
this project should be fairly straightforward (I hope).

Zdenek


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Diego Novillo

Ian Lance Taylor wrote on 12/21/06 13:08:


If that is acceptable, then there is no issue here.  If that is not
acceptable, then we need to fix the code to correctly mark SSA_NAMEs
which are no longer used.  Whether we recycle the memory in the unused
SSA_NAMEs is a separate (and less interesting) discussion.


Agreed.

We have various passes that walk through the SSA table, so I want to 
keep supporting that.


We do have cases where an SSA name may get its defining statement zapped 
and yet we need to keep it around.  The renamer uses names_to_release in 
those cases, and makes sure not to visit the defining statement.


If every statement removal were to set SSA_NAME_DEF_STMT to NOP for 
every name generated by the removed statement, then the renamer would 
probably not need to do that.  However, the renamer *needs* the SSA name 
itself not to be recycled (for name-name mappings).


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Paul Eggert
Paolo Bonzini [EMAIL PROTECTED] writes:

 On the autoconf mailing list, Paul Eggert mentioned as a good
 compromise that GCC could treat signed overflow as undefined only for
 loops and not in general.

What I meant to propose (and perhaps did not propose clearly
enough) is that if the C application is checking for integer
overflow, GCC should not optimize that code away; but it is
OK for GCC to do other loop optimizations.  That is, some
overflow checking is done in loops, and GCC should not
optimize that away, but the other loop optimizations are OK.

That probably sounds vague, so here's the code that beta
gcc -O2 actually broke (which started this whole thread):

  int j;
  for (j = 1; 0  j; j *= 2)
if (! bigtime_test (j))
  return 1;

Here it is obvious to a programmer that the comparison is
intended to do overflow checking, even though the test
controls the loop.  Can gcc -O2 be made smart enough to
notice this, and not optimize away the test?

Another question for the GCC experts: would it fix the bug
if we replaced j *= 2 with j = 1 in this sample code?

I ask the latter question partly because nobody has yet
proposed a portable fix for this bug.  The patch proposed in
http://lists.gnu.org/archive/html/bug-gnulib/2006-12/msg00084.html
worked for Ralf, but it does not work in general.  It
attacks the problem by changing int j to unsigned j.
But because bigtime_test wants an int, this causes the test
program to compute the equivalent of (int) ((unsigned int)
INT_MAX + 1), and C99 says that if you cannot assume
wrapping semantics this expression has undefined behavior in
the common case where INT_MAX  UINT_MAX.

Obviously this latter can be worked around too, but what a
mess, huh?


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Daniel Berlin

On 12/21/06, Diego Novillo [EMAIL PROTECTED] wrote:

Daniel Berlin wrote on 12/21/06 12:21:

 for (i = 0; i  num_ssa_names; i++)
 {
   tree name = ssa_name (i);
   if (name  !SSA_NAME_IN_FREELIST (name)
DFS (name)
 
I see that you are not checking for IS_EMPTY_STMT.  Does DFS need to
access things like bb_for_stmt?


I avoided including that part, but yes, we check for it.



In any case, that is not important.  I agree that every SSA name in the
SSA table needs to have a DEF_STMT that is either (a) an empty
statement, or, (b) a valid statement still present in the IL.


Then we've got a bug here :)



Note that this is orthogonal to the problem of whether we free up unused
names from this list.  Every time a statement S disappears, we should
make sure that the names defined by S get their SSA_NAME_DEF_STMT set to
  NOP.

Frankly, I'm a bit surprised that we are running into this. I'd like to
see a test case, if you have one.

Robert, can you attach the testcase you've been working with?
I'm not surprised, but only because I hit it before.   It's pretty rare.

IIRC, what happens it this:

1. We replace all uses of a phi node with something else
2. We then call remove_phi_node with false as the last parameter (only
3 places in the compiler), which ends up destroying the phi node but
not releasing the LHS name (since this is what the last parameter says
whether to do).


void
remove_phi_node (tree phi, tree prev, bool release_lhs_p)
{
...
 release_phi_node (phi);
 if (release_lhs_p)
   release_ssa_name (PHI_RESULT (phi));
}

3. PHI_RESULT (phi) is now in the ssa name list, but SSA_NAME_DEF_STMT
points to a released phi node.

4. We try to walk this at some point later, and crash.

You can see this happens in tree_merge_blocks:

 /* Remove all single-valued PHI nodes from block B of the form
V_i = PHI V_j by propagating V_j to all the uses of V_i.  */
 bsi = bsi_last (a);
 for (phi = phi_nodes (b); phi; phi = phi_nodes (b))
   {
 tree def = PHI_RESULT (phi), use = PHI_ARG_DEF (phi, 0);
...
else
 replace_uses_by (def, use);

 remove_phi_node (phi, NULL, false);
   }

Whenever we hit the else block we end up with a phi node result that
points to a released phi node.  It won't appear in the IR (sine the
phi node has been removed and all the result uses replaced), but will
appear in the ssa_names list.

There are only two other places that call remove_phi_node with false
as the last parameter.
One is moving a phi node, the other appears to be a bug just like the above.


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Robert Kennedy
 Robert, can you attach the testcase you've been working with?

One testcase is libstdc++-v3/libsupc++/vec.cc from mainline.

But it compiles without trouble unless you add verification or a walk
over the SSA_NAMEs at the right time.

 1. We replace all uses of a phi node with something else
 2. We then call remove_phi_node with false as the last parameter (only
 3 places in the compiler), which ends up destroying the phi node but
 not releasing the LHS name (since this is what the last parameter says
 whether to do).

That's right. Zdenek recommended that I change one of those places
(the one in tree_merge_blocks that you quoted) to true, but doing
that causes some other code of his to break. I haven't analyzed why he
needs those things to stay around, but I suspect it's because -- for a
while, anyway -- he needs the DEF_STMT for something that's been
removed.

-- Robert


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Ian Lance Taylor
Jeffrey Law [EMAIL PROTECTED] writes:

 On Thu, 2006-12-21 at 10:08 -0800, Ian Lance Taylor wrote:
 
 First, let's go ahead and define an orphan.  An orphan is an SSA_NAME
 which has SSA_NAME_DEF_STMT pointing to a statement which does not
 appear in the IL.

That's fine, that simply changes to the question to how you can tell,
given an SSA_NAME, whether it is an orphan or not.


 Note we'd still have the problem of orphans for which I see only two
 solutions.
 
 First, we bite the bullet and find every point where we're not releasing
 orphan and we make failure to release a dead SSA_NAME an error (which we
 can check during the IL scan as part of verify_ssa).  The advantage is
 we know at any point the set SSA_NAMEs which appear in the IL and we
 have very clearly defined rules for dealing with SSA_NAMEs.  They are
 either free or they appear in the IL -- no orphans.
 
 The alternative is to mark/sweep them between passes.  The obvious
 downside is that within a pass we can get orphans, which I think
 is insufficient for the current needs.

I can't see any reason that we would not want to adopt your first
solution.


  I think the issue is whether we want to have a way to see all
  currently valid SSA_NAMEs.  Right now we can have SSA_NAMEs in the
  list which are no longer used, and we have no way to tell whether they
  are used or not.  Thus the only way to see all valid SSA_NAMEs is to
  walk the code.
 Depends on your definition of valid :-)  Until now we've allowed 
 valid to include orphan SSA_NAMEs.  That's far from ideal.  But
 it's worked marginally until now.
 
 Note that an orphan SSA_NAME should still have a TREE_CHAIN which
 points to a valid statement node.  God help you if you try to
 interpret anything inside that statement node though.

Right, and since you currently can't tell whether an SSA_NAME is an
orphan or not, that makes the distinction currently useless.

Ian


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Daniel Berlin

On 12/21/06, Robert Kennedy [EMAIL PROTECTED] wrote:

 Robert, can you attach the testcase you've been working with?

One testcase is libstdc++-v3/libsupc++/vec.cc from mainline.

But it compiles without trouble unless you add verification or a walk
over the SSA_NAMEs at the right time.

 1. We replace all uses of a phi node with something else
 2. We then call remove_phi_node with false as the last parameter (only
 3 places in the compiler), which ends up destroying the phi node but
 not releasing the LHS name (since this is what the last parameter says
 whether to do).

That's right. Zdenek recommended that I change one of those places
(the one in tree_merge_blocks that you quoted) to true, but doing
that causes some other code of his to break. I haven't analyzed why he
needs those things to stay around, but I suspect it's because -- for a
while, anyway -- he needs the DEF_STMT for something that's been
removed.


You can't change the last parameter to true in the if's true branch,
but you can in the else branch.
He's reusing the phi result's ssa_name on the true branch for a
statement copy, which will set the def_stmt to something valid.

I.E. this should work:

 if (!may_replace_uses)
{
  gcc_assert (is_gimple_reg (def));

  /* Note that just emitting the copies is fine -- there is no problem
 with ordering of phi nodes.  This is because A is the single
 predecessor of B, therefore results of the phi nodes cannot
 appear as arguments of the phi nodes.  */
  copy = build2_gimple (GIMPLE_MODIFY_STMT, def, use);
  bsi_insert_after (bsi, copy, BSI_NEW_STMT);
  SSA_NAME_DEF_STMT (def) = copy;
   remove_phi_node (phi, NULL, false);
 }
 else
 {
replace_uses_by (def, use);
   remove_phi_node (phi, NULL, true);
 }

remove the call that was always occurring that went here

-- Robert



Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Robert Kennedy
 Something I forgot to add in my previous message.  Notice that it is not 
 altogether rare to find cases where we have more SSA names than 
 statements.  Are you walking the SSA names because you assume it's 
 always shorter than walking the statements?

No. I'm walking the SSA names because logically that's what the
algorithm is interested in. At that level, the algorithm doesn't care
about statements.

-- Robert


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Diego Novillo

Robert Kennedy wrote on 12/21/06 15:01:
Something I forgot to add in my previous message.  Notice that it is not 
altogether rare to find cases where we have more SSA names than 
statements.  Are you walking the SSA names because you assume it's 
always shorter than walking the statements?


No. I'm walking the SSA names because logically that's what the
algorithm is interested in. At that level, the algorithm doesn't care
about statements.

OK.  Good enough.  To fix this bug, I also suggest what Jeff and Ian 
have been discussing:


1- A verifier in verify_ssa

2- Fix bugs found in #1 by making sure that every time we remove a 
statement, the SSA_NAME_DEF_STMT of all the affected names is changed to 
point to an empty statement.


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Joseph S. Myers
On Thu, 21 Dec 2006, Paul Eggert wrote:

 But because bigtime_test wants an int, this causes the test
 program to compute the equivalent of (int) ((unsigned int)
 INT_MAX + 1), and C99 says that if you cannot assume
 wrapping semantics this expression has undefined behavior in
 the common case where INT_MAX  UINT_MAX.

Conversion of out-of-range integers to signed types is 
implementation-defined not undefined, and GCC duly documents the modulo 
semantics for that conversion.  I don't know if you have to deal with 
compilers applying different semantics there, but shared overflow checking 
functions in gnulib could deal with the differences between compilers.

(Conversion of out-of-range floating-point numbers to integer types *is* 
undefined, but Annex F changes this to returning an unspecified value so 
bounding the possible behavior, and I believe GCC follows Annex F for 
this: it's useful not to have to guarantee any particular result, since 
different machines have conversion instructions that may do different 
things for out-of-range values, and to be able to return different results 
for compile-time and run-time conversions, but floating-point conversions 
don't have the same scope as integer arithmetic for useful optimization 
based on undefined behavior.)

-- 
Joseph S. Myers
[EMAIL PROTECTED]


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Richard B. Kreckel

Marcin Dalecki wrote:

But the same applies to floating point numbers. There, the situation 
is even better, because nowadays I can rely on a float or double 
being the representation defined in IEEE 754 because there is such 
overwhelming hardware support.



You better don't. Really! Please just realize for example the impact 
of the (in)famous 80 bit internal (over)precision of a

very common IEEE 754 implementation...



Well, I know. Which is why I used the term storage representation down 
the rest of the paragraph that you decided not to quote. :)


However it's a quite common mistake to forget how bad floats 
model real numbers.



And it's quite a common mistake to forget how bad finite ints 
model integer numbers.



No it isn't. Most people don't think in terms of infinite arithmetics 
when programming.
And I hold up that the difference between finite and infinite is 
actually quite a fundamental

concept.



Let us agree to disagree.

However quite a lot of people expect the floating arithmetics rouding 
to give them

well behaved results.



I don't know what you mean by well behaved in this context, but I am 
beginning to suspect something: what you were trying to express with 
that algebra argument was a mere gut feeling of yours that there is a 
fundamental need to distinguish between discreet and continous domains. 
Let me just say that algebra has not much to do with that distinction 
and is off-topic. Anyway, you are entitled to feel that way or the 
other, but I cannot agree.


Leaving such gut feelings aside, I maintain: GCC has been careful not to 
violate a standard (IEEE 754) that was not binding, but assumed by many 
of its users, unless told otherwise (using -ffast-math). Now it is 
violating another standard (LIA-1) that is not binding, but assumed by 
many of its users, unless explicitly told to follow that standard (with 
-fwrapv). That is A Bad Idea.


Cheers
-richy.

--
Richard B. Kreckel
http://www.ginac.de/~kreckel/



Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread David Nicol

On 12/20/06, Marcin Dalecki [EMAIL PROTECTED] wrote:

You better don't. Really! Please just realize for example the impact
of the (in)famous 80 bit internal (over)precision of a
very common IEEE 754 implementation...

volatile float b = 1.;

if (1. / 3. == b / 3.) {
printf(HALLO!\n)
} else {
printf(SURPRISE SURPRISE!\n);
}


It has always seemed to me that floating point comparison could
be standardized to regularize the exponent and ignore the least significant
few bits and doing so would save a lot of headaches.  Would it really save
the headaches or would it just make the cases where absolute comparisons
of fp results break less often, making the error more intermittent and
thereby worse?  Could a compiler switch be added that would alter
fp equality?

I have argued for precision to be included in numeric types in other forae
and have been stunned that all except people with a background in Chemistry
find the suggestion bizarre and unnecessary; I realize that GCC is not really
a good place to try to shift norms; but on the other hand if a patch was to
be prepared that would add a command-line switch (perhaps -sloppy-fpe and
-no-sloppy-fpe) that would govern wrapping ((fptype) == (fptype)) with something
that threw away the least sig. GCC_SLOPPY_FPE_SLOP_SIZE bits in
the mantissa, would it get accepted or considered silly?


Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Robert Kennedy
 You can't change the last parameter to true in the if's true branch.

Ouch. Duh. Thanks!

The worst of it is, Zdenek sent me a patch, and not only did I
misunderstand it, I then transcribed it wrong based on my
misunderstanding. Oh well. Thanks for guessing my mistake.

-- Robert


Re: question from imobilien

2006-12-21 Thread Manuel López-Ibáñez

On 21/12/06, Janis Johnson [EMAIL PROTECTED] wrote:

On Wed, Dec 20, 2006 at 03:06:34PM +0100, Jan Eissfeld wrote:
 Hi,

 PR19978 reports that some overflow warnings are emitted multiple times. Like 
for example,

 test.c:6: warning: integer overflow in expression
 test.c:6: warning: integer overflow in expression
 test.c:6: warning: integer overflow in expression

 The current testsuite will match any number of those to a single {
 dg-warning }. I don't know whether this is a known limitation, a bug
 on the testsuite or it just needs some magic.

 How could I test that exactly one warning was emitted?

See http://gcc.gnu.org/ml/gcc/2006-12/msg0.html for an ugly solution,
and the rest of the thread for problems with this approach.  The check
for getting the warning must be in a separate test from the check for
multiple warnings.

Janis



Or even better, see
http://gcc.gnu.org/ml/gcc-patches/2006-12/msg00588.html which fixes
that PR and adds testcases to prevent regressing on this.

It is still awaiting for review, though. ;-)


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Marcin Dalecki


On 2006-12-21, at 22:19, David Nicol wrote:



It has always seemed to me that floating point comparison could
be standardized to regularize the exponent and ignore the least  
significant

few bits and doing so would save a lot of headaches.


Well actually it wouldn't save the world. However adding an
op-code implementing: x eqeps y = |x - y|  epsilion, would be  
indeed helpful.
Maybe some m-f has already patented it, and that's the reason we  
don't see it

already done. But that's of course only me speculating.


Would it really save
the headaches or would it just make the cases where absolute  
comparisons

of fp results break less often, making the error more intermittent and
thereby worse?  Could a compiler switch be added that would alter
fp equality?


However in numerical computation there isn't really a silver bullet  
to be found.
If you are serious about it you simply do the hard work - which is  
the numerical
analysis of your algorithms with respect to computational stability.  
That's the
real effort and perhaps the reason, why the peculiarities of the FP  
implementations

are not perceived as problematic.

I have argued for precision to be included in numeric types in  
other forae
and have been stunned that all except people with a background in  
Chemistry
find the suggestion bizarre and unnecessary; I realize that GCC is  
not really
a good place to try to shift norms; but on the other hand if a  
patch was to
be prepared that would add a command-line switch (perhaps -sloppy- 
fpe and
-no-sloppy-fpe) that would govern wrapping ((fptype) == (fptype))  
with something

that threw away the least sig. GCC_SLOPPY_FPE_SLOP_SIZE bits in
the mantissa, would it get accepted or considered silly?


No that's not sufficient. And a few bit's of precision are really not  
the
center-point of numerical stability of the overall calculation.  
Please look up
as an example a numerical phenomenon which is usually called  
cancelation to see

immediately why.

Marcin Dalecki




Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Paul Eggert
Joseph S. Myers [EMAIL PROTECTED] writes:

 Conversion of out-of-range integers to signed types is 
 implementation-defined not undefined,

Thanks for the correction; I keep forgetting that.  However,
a conforming implementation is allowed to raise a signal for
those conversions, which could break the code in question,
i.e., it could cause the test to report the wrong result.
So the distinction between undefined and
implementation-defined behavior doesn't much matter here.
(Presumably the code could work around the problem by
trapping the signal, but that is another can of porting
worms.)

I daresay many conversions of out-of-range values to signed
integers are in a similar boat.


Re: Char shifts promoted to int. Why?

2006-12-21 Thread Ayal Zaks

Something along these lines may be useful to do in the vectorizer when we
get code like this:
   ((char)x) = ((char)( ((int)((char)x))  ((int)c) ) )
and don't feel like doing all the unpacking of chars to ints and then
packing the ints to chars after the shift. An alternative could be to
transform the above pattern to:
  char_x1 = 0
  char_x2 = char_x  c
  char_x = ((int)c  size_of_char) ? char_x2 : char_x1
and vectorize that (since we already know how to vectorize selects).

Alternatively, do
  char_c2 = (c  size_of_char ? c : 0)
  char_x2 = char_x  char_c2
which is like saturating the shift amount.

You could also try
  char_c2 = min(c, size_of_char)   /* And mask off a bit perhaps.  */
  char_x2 = char_x  char_c2
if you don't have general selects but do have min.

Ayal.



Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Robert Dewar

 On 2006-12-21, at 22:19, David Nicol wrote:


It has always seemed to me that floating point comparison could
be standardized to regularize the exponent and ignore the least  
significant

few bits and doing so would save a lot of headaches.


This would be a real nuisance. This myth that you should
never compare fpt numbers for absolute equality is nonsense.
There are lots of algorithms where it is legitimate to
compare for absolute equality (various kinds of iterations
that converge reliably to a single bit pattern for example).

It *is* a problem to have the 80-bit stuff intefering (in fact
Kahan pronounced this a bug in a Fortran compiler. Ada gets
around this by providing the 'Machine attribute that forces
a fpt number to a canonical machine representation in its type,
but it's a bit cumbersome. Note that the use of SSE on the x86
eliminates this problem.

 Marcin Dalecki:


Well actually it wouldn't save the world. However adding an
op-code implementing: x eqeps y = |x - y|  epsilion, would be  
indeed helpful.
Maybe some m-f has already patented it, and that's the reason we  
don't see it

already done. But that's of course only me speculating.


There would be nothing wrong in having such an operation, but
it is not equality!

 David Nicol wrote:


I have argued for precision to be included in numeric types in  
other forae
and have been stunned that all except people with a background in  
Chemistry
find the suggestion bizarre and unnecessary; 


if you are stunned by this, you need to study more about
computer arithmetic (btw I have a PhD in chemistry :-))

I realize that GCC is  
not really

a good place to try to shift norms;


especially if the attempt is misguided. Floating-point semantics
in languages have been studied by a lot of experts, they are not
accidental!


Marcin Dalecki:

No that's not sufficient. And a few bit's of precision are really not  
the
center-point of numerical stability of the overall calculation.  
Please look up
as an example a numerical phenomenon which is usually called  
cancelation to see

immediately why.


indeed!



Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Marcin Dalecki


On 2006-12-21, at 23:17, Robert Dewar wrote:



 Marcin Dalecki:

Well actually it wouldn't save the world. However adding an
op-code implementing: x eqeps y = |x - y|  epsilion, would be   
indeed helpful.
Maybe some m-f has already patented it, and that's the reason we   
don't see it

already done. But that's of course only me speculating.


There would be nothing wrong in having such an operation, but
it is not equality!


Of course I didn't think about a substitute for ==. Not! However I think
that checks for |x-y|  epsilion, could be really given a significant  
speed edge

if done in a single go in hardware.



Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Robert Dewar

Marcin Dalecki wrote:

On 2006-12-21, at 23:17, Robert Dewar wrote:


Marcin Dalecki:
Well actually it wouldn't save the world. However adding an
op-code implementing: x eqeps y = |x - y|  epsilion, would be   
indeed helpful.
Maybe some m-f has already patented it, and that's the reason we   
don't see it

already done. But that's of course only me speculating.

There would be nothing wrong in having such an operation, but
it is not equality!


Of course I didn't think about a substitute for ==. Not! However I think
that checks for |x-y|  epsilion, could be really given a significant  
speed edge

if done in a single go in hardware.


I don't see this as viable, the choice of epsilon is too application
dependent.



gcc-4.0-20061221 is now available

2006-12-21 Thread gccadmin
Snapshot gcc-4.0-20061221 is now available on
  ftp://gcc.gnu.org/pub/gcc/snapshots/4.0-20061221/
and on various mirrors, see http://gcc.gnu.org/mirrors.html for details.

This snapshot has been generated from the GCC 4.0 SVN branch
with the following options: svn://gcc.gnu.org/svn/gcc/branches/gcc-4_0-branch 
revision 120122

You'll find:

gcc-4.0-20061221.tar.bz2  Complete GCC (includes all of below)

gcc-core-4.0-20061221.tar.bz2 C front end and core compiler

gcc-ada-4.0-20061221.tar.bz2  Ada front end and runtime

gcc-fortran-4.0-20061221.tar.bz2  Fortran front end and runtime

gcc-g++-4.0-20061221.tar.bz2  C++ front end and runtime

gcc-java-4.0-20061221.tar.bz2 Java front end and runtime

gcc-objc-4.0-20061221.tar.bz2 Objective-C front end and runtime

gcc-testsuite-4.0-20061221.tar.bz2The GCC testsuite

Diffs from 4.0-20061214 are available in the diffs/ subdirectory.

When a particular snapshot is ready for public consumption the LATEST-4.0
link is updated and a message is sent to the gcc list.  Please do not use
a snapshot before it has been announced that way.


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Robert Dewar

Marcin Dalecki wrote:


Of course I didn't think about a substitute for ==. Not! However I think
that checks for |x-y|  epsilion, could be really given a significant  
speed edge

if done in a single go in hardware.


One thing to ponder here is that thinks like this are what lead
to CISC instruction messes. It just seems obvious to people that
it will help efficiency to have highly specialized instructions,
but in practice they gum up the architecture with junk, and a
careful analysis shows that the actual gain is small at best.
How many applications spend a significant amount of time doing
such an epsilon test -- best guess: none.



Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Marcin Dalecki


On 2006-12-21, at 23:42, Robert Dewar wrote:


Marcin Dalecki wrote:

Of course I didn't think about a substitute for ==. Not! However I  
think
that checks for |x-y|  epsilion, could be really given a  
significant  speed edge

if done in a single go in hardware.


One thing to ponder here is that thinks like this are what lead
to CISC instruction messes. It just seems obvious to people that
it will help efficiency to have highly specialized instructions,
but in practice they gum up the architecture with junk, and a
careful analysis shows that the actual gain is small at best.
How many applications spend a significant amount of time doing
such an epsilon test -- best guess: none.


Well actually you are interpreting too much wight in to my speculations.
I was just curious whatever similar analysis has been already  
seriously done?

And after all, well the most commonly used instruction set architectures
for numerical calculations, are not exactly what one would call lean  
and mean...

People simply use what's already there and what is cheap.
Or could you imagine something uglier then the stacked/MMX/XMM/SSE4  
mess?
After all even the supposedly competent instructions set designers  
admitted their previous

fallacy by the introduction of SSE2.

Marcin Dalecki




Re: question from imobilien

2006-12-21 Thread Janis Johnson
On Thu, Dec 21, 2006 at 09:43:26PM +, Manuel López-Ibáñez wrote:
 On 21/12/06, Janis Johnson [EMAIL PROTECTED] wrote:
 On Wed, Dec 20, 2006 at 03:06:34PM +0100, Jan Eissfeld wrote:
  Hi,
 
  PR19978 reports that some overflow warnings are emitted multiple times. 
 Like for example,
 
  test.c:6: warning: integer overflow in expression
  test.c:6: warning: integer overflow in expression
  test.c:6: warning: integer overflow in expression
 
  The current testsuite will match any number of those to a single {
  dg-warning }. I don't know whether this is a known limitation, a bug
  on the testsuite or it just needs some magic.
 
  How could I test that exactly one warning was emitted?
 
 See http://gcc.gnu.org/ml/gcc/2006-12/msg0.html for an ugly solution,
 and the rest of the thread for problems with this approach.  The check
 for getting the warning must be in a separate test from the check for
 multiple warnings.
 
 Janis
 
 
 Or even better, see
 http://gcc.gnu.org/ml/gcc-patches/2006-12/msg00588.html which fixes
 that PR and adds testcases to prevent regressing on this.
 
 It is still awaiting for review, though. ;-)

I hadn't noticed that it's for the same PR!

Janis


Re: running bprob.exp tests in a cross-testing environment

2006-12-21 Thread Janis Johnson
On Thu, Dec 21, 2006 at 10:00:47AM +1100, Ben Elliston wrote:
 On Thu, 2006-12-21 at 09:56 +1100, Ben Elliston wrote:
 
  After some digging, I managed to work out why: the gcov runtime code
  wants to create the .gcda file in the same directory that the object
  file was created on the build system.  Unless the same directory
  structure exists on the target, the gcov runtime code just skips writing
  out the data file on exit.
 
 To be more precise, the gcov runtime first tries to create the required
 path, but this is unlikely to succeed if it requires creating a new
 directory under / (which only root can typically do).  If it cannot
 create the full path before creating the data file, the gcov runtime
 code will just silently fail.

Ben, you understand what's going on here much better than I do, so if
you come up with a patch that works it's pre-approved.  Otherwise I
can take a look in a couple of weeks.

Janis


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Ian Lance Taylor
Paul Eggert [EMAIL PROTECTED] writes:

 That probably sounds vague, so here's the code that beta
 gcc -O2 actually broke (which started this whole thread):
 
   int j;
   for (j = 1; 0  j; j *= 2)
   if (! bigtime_test (j))
 return 1;

It's interesting to note that in gcc 4.1 this turns into, essentially,

  for (j = 1, i = 0; i != 31; j *= 2, ++i)
   ...

That is, gcc 4.1 assumes wrapping semantics and works out that the
loop will iterate (up to) 31 times (I'm testing on a 32-bit system,
obviously).  This is also what mainline gcc does if you use -fwrapv.

 Here it is obvious to a programmer that the comparison is
 intended to do overflow checking, even though the test
 controls the loop.  Can gcc -O2 be made smart enough to
 notice this, and not optimize away the test?

Although this is in a loop, the test is actually being removed by VRP.
VRP cunningly sees that j has the range [1, +INF] in all cases.
Therefore, 0  j is always true, and the test can be removed.  Using
the -fno-tree-vrp option causes the code to work as the programmer
expected.

Basically, VRP sees that j  0, because the loop condition already
held.  Then it multiplies it by two.  Without -fwrapv, it concludes
that j  0 is still true.  Then it tests the loop condition again, and
discovers that it is definitely true.  This is more or less the sort
of thing which VRP is supposed to do.

We could disable VRP's assumptions about signed overflow.  I don't
know what else we could do to fix this case.  I don't even know how we
could issue a useful warning.  Perhaps there is a way.

 Another question for the GCC experts: would it fix the bug
 if we replaced j *= 2 with j = 1 in this sample code?

Well, mainline VRP isn't clever enough to understand that case.  But
it doesn't make the code any more defined.  A left shift of a signed
value to a value which can not be represented in the signed type is
also undefined (C99 6.5.7).


 I ask the latter question partly because nobody has yet
 proposed a portable fix for this bug.  The patch proposed in
 http://lists.gnu.org/archive/html/bug-gnulib/2006-12/msg00084.html
 worked for Ralf, but it does not work in general.  It
 attacks the problem by changing int j to unsigned j.
 But because bigtime_test wants an int, this causes the test
 program to compute the equivalent of (int) ((unsigned int)
 INT_MAX + 1), and C99 says that if you cannot assume
 wrapping semantics this expression has undefined behavior in
 the common case where INT_MAX  UINT_MAX.

No, as Joseph says, conversion from a unsigned value to a signed value
is implementation defined (C99 6.3.1.3).

Ian


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Joseph S. Myers
On Thu, 21 Dec 2006, Ian Lance Taylor wrote:

  Another question for the GCC experts: would it fix the bug
  if we replaced j *= 2 with j = 1 in this sample code?
 
 Well, mainline VRP isn't clever enough to understand that case.  But
 it doesn't make the code any more defined.  A left shift of a signed
 value to a value which can not be represented in the signed type is
 also undefined (C99 6.5.7).

As noted, it's only undefined in C99 not C90 and we document that this 
undefinedness isn't used at present; and non-front-end code can't use 
flag_isoc99 since it isn't available in non-C-family front ends.

-- 
Joseph S. Myers
[EMAIL PROTECTED]


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Paul Eggert
Ian Lance Taylor [EMAIL PROTECTED] writes:

 We could disable VRP's assumptions about signed overflow.  I don't
 know what else we could do to fix this case.  I don't even know how we
 could issue a useful warning.  Perhaps there is a way.

It is a knotty problem.  Thanks for thinking about it.

I'm Handwaving with a capital H here, but one possibility is
for plain -O2 to keep VRP, but disable its assumption about
signed overflow when attempting to optimize away a
comparison that comes directly from the user's code (as
opposed to a comparison coming from subscript checking and
the like).

Here's another wild idea.  Perhaps GCC could add an option
-fundefinedv to request for aggressive optimizations
assuming that the program will never have an signed integer
overflow.  I.e., if you want the optimization that is
causing trouble here, you would specify -O2 -fundefinedv;
but the default would be to disable this particular
troublesome optimization.


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Denis Vlasenko
On Tuesday 19 December 2006 23:39, Denis Vlasenko wrote:
 There are a lot of 100.00% safe optimizations which gcc
 can do. Value range propagation for bitwise operations, for one

Or this, absolutely typical C code. i386 arch can compare
16 bits at a time here (luckily, no alighment worries on this arch):

# cat tt.c
int f(char *p)
{
if (p[0] == 1  p[1] == 2) return 1;
return 0;
}

# gcc -O2 -S -fomit-frame-pointer tt.c

# cat tt.s
.file   tt.c
.text
.p2align 2,,3
.globl f
.type   f, @function
f:
movl4(%esp), %eax
cmpb$1, (%eax)
je  .L2
xorl%eax, %eax
ret
.p2align 2,,3
.L2:
cmpb$2, 1(%eax)
sete%al
movzbl  %al, %eax
ret
.size   f, .-f
.ident  GCC: (GNU) 4.2.0 20061128 (prerelease)
.section.note.GNU-stack,,@progbits


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Paul Brook
On Friday 22 December 2006 00:58, Denis Vlasenko wrote:
 On Tuesday 19 December 2006 23:39, Denis Vlasenko wrote:
  There are a lot of 100.00% safe optimizations which gcc
  can do. Value range propagation for bitwise operations, for one

 Or this, absolutely typical C code. i386 arch can compare
 16 bits at a time here (luckily, no alighment worries on this arch):

 int f(char *p)
 {
     if (p[0] == 1  p[1] == 2) return 1;
     return 0;
 }

Definitely not 100% safe. p may point to memory that is sensitive to the 
access width and/or number of accesses. (ie. memory mapped IO).

Paul


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Robert Dewar

Paul Brook wrote:

On Friday 22 December 2006 00:58, Denis Vlasenko wrote:

On Tuesday 19 December 2006 23:39, Denis Vlasenko wrote:

There are a lot of 100.00% safe optimizations which gcc
can do. Value range propagation for bitwise operations, for one

Or this, absolutely typical C code. i386 arch can compare
16 bits at a time here (luckily, no alighment worries on this arch):

int f(char *p)
{
if (p[0] == 1  p[1] == 2) return 1;
return 0;
}


Definitely not 100% safe. p may point to memory that is sensitive to the 
access width and/or number of accesses. (ie. memory mapped IO).


A program that depends on this is plain wrong. There is no guarantee
that memory references are as they appear in the program. For a
non-volatile variable, any such optimization is valid. For instance
if the flow can be used to prove that p[0] is already 1, then there
is no need to repeat the read.


Paul




Re: Reload Pass

2006-12-21 Thread Rajkishore Barik
Hi,

Thanks very much. I still have doubts on your suggestion:

AFAIK, the back-end pass consists of (in order) : reg move - insn sched 
- reg class - local alloc - global alloc - reload - post-reload.
There are edges from reg move to reg class and reload back to global 
alloc.

In case I want to implement a linear scan which may split live ranges 
(pseudos) into live intervals(smaller pseudos) and allocate different 
registers
for each of them. This process would break the whole loop. 

So, what did you mean by --- run this pass in between the register 
allocator and
reload, that would probably be doable.?

regards,
Raj


Ian Lance Taylor [EMAIL PROTECTED] wrote on 12/21/2006 09:02:04 PM:

 Rajkishore Barik [EMAIL PROTECTED] writes:
 
  Does anyone know of any document describing (in details) the reload 
phase 
  of GCC?
 
 There isn't one.  The closest such document is
 http://gcc.gnu.org/wiki/reload
 which is accurate despite, or perhaps because of, starting out by
 equating reload with Satan.
 
  I am planning to write a linear scan reload for GCC (one that does not 

  take reg_renumber
  but takes instruction specific register allocation and move 
information). 
  Can anyone point me
  to some existing code/literature for this in GCC? 
 
 There is none.
 
 If you expect this pass to actually replace reload, then I advise you
 to reconsider.  That would be a hopeless task.  Well, maybe you could
 do it if you restrict yourself to a single architecture.
 
 If you want to run this pass in between the register allocator and
 reload, that would probably be doable.  Of course, reload will then
 muck up your decisions, and the resulting code will sometimes be worse
 than what you get today.  But it might be an interesting experiment.
 
 Ian



Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Gabriel Dos Reis
Paul Eggert [EMAIL PROTECTED] writes:

| Ian Lance Taylor [EMAIL PROTECTED] writes:
| 
|  We could disable VRP's assumptions about signed overflow.  I don't
|  know what else we could do to fix this case.  I don't even know how we
|  could issue a useful warning.  Perhaps there is a way.
| 
| It is a knotty problem.  Thanks for thinking about it.
| 
| I'm Handwaving with a capital H here, but one possibility is
| for plain -O2 to keep VRP, but disable its assumption about
| signed overflow when attempting to optimize away a
| comparison that comes directly from the user's code (as
| opposed to a comparison coming from subscript checking and
| the like).

If that is workable, it would be a good compromise.

-- Gaby


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Paul Brook
On Friday 22 December 2006 02:06, Robert Dewar wrote:
 Paul Brook wrote:
  On Friday 22 December 2006 00:58, Denis Vlasenko wrote:
  On Tuesday 19 December 2006 23:39, Denis Vlasenko wrote:
  There are a lot of 100.00% safe optimizations which gcc
  can do. Value range propagation for bitwise operations, for one
 
  Or this, absolutely typical C code. i386 arch can compare
  16 bits at a time here (luckily, no alighment worries on this arch):
 
  int f(char *p)
  {
  if (p[0] == 1  p[1] == 2) return 1;
  return 0;
  }
 
  Definitely not 100% safe. p may point to memory that is sensitive to the
  access width and/or number of accesses. (ie. memory mapped IO).

 A program that depends on this is plain wrong. There is no guarantee
 that memory references are as they appear in the program.  For a 
 non-volatile variable, any such optimization is valid. For instance
 if the flow can be used to prove that p[0] is already 1, then there
 is no need to repeat the read.

Who says the optimisation is valid? The language standard?

The example was given as something that's 100% safe to optimize. I'm 
disagreeing with that assertion. The use I describe isn't that unlikely if 
the code was written by someone with poor knowledge of C.

My point is that it's not that hard to invent plausible code that breaks 
when pretty much any transformation is applied. We have to decide how close 
to the standard we want to fly.

Optimization should never change the behavior of any program accepted by the 
compiler is not a useful constraint for an optimizing compiler. If program 
behavior includes the ability to debug the program, then I'd go as far as 
saying this should be the definition of -O0.

Optimization should never change the behavior of a valid program is useful 
definition because it forces you to define what constitutes a valid program.


There's actually a much better reason why the transformation is not safe. 
Consider a data structure where a byte of 1 indicates the end of the object. 
Under normal circumstances short-circuiting of the  operator prevents 
anything bad happening. If you merge the two accesses you've just read past 
the end of the object and all kinds of bad things may happen (eg. a 
segfault).

Paul

P.S. I think I'm repeating myself now, so this is the last time I intend to 
comment on this thread.


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Robert Dewar

Paul Brook wrote:


Who says the optimisation is valid? The language standard?

The example was given as something that's 100% safe to optimize. I'm 
disagreeing with that assertion. The use I describe isn't that unlikely if 
the code was written by someone with poor knowledge of C.


My point is that it's not that hard to invent plausible code that breaks 
when pretty much any transformation is applied. We have to decide how close 
to the standard we want to fly.


I did not find that plausible at all, for someone to depend on memory
mapped references without using volatile is indeed such junk code that
we don't need to care about it.

Optimization should never change the behavior of a valid program is useful 
definition because it forces you to define what constitutes a valid program.


No, no, let's not start calling these programs that violate the standard
valid. That's going much too far. Also, sometimes code is inherently
non-deterministic, so you have to be careful talking about change of
behavior.

Optimization should never result in violating the required semantics of
a valid (standard) C program

is of course criterion 1

Criterion 2 is something like Optimization should not cause non-valid
non-standard programs to fail as a result of using a common idiom, which
though non-standard is generally expected to work, unless the 
optimization can be demonstrated to be valuable enough to be worth

generating the effective incompatibility with expected practice

is a half baked statement of criterion 2 (and it is not so easy to
bake this one!)

There's actually a much better reason why the transformation is not safe. 
Consider a data structure where a byte of 1 indicates the end of the object. 
Under normal circumstances short-circuiting of the  operator prevents 
anything bad happening. If you merge the two accesses you've just read past 
the end of the object and all kinds of bad things may happen (eg. a 
segfault).


You may well know that it is safe to go one past the last object 
(generally this will be the case, because of the strange semantics

of being allowed to address past the last byte). You do indeed have
to be careful of this

P.S. I think I'm repeating myself now, so this is the last time I intend to 
comment on this thread.


OK!



Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Jeffrey Law
On Thu, 2006-12-21 at 14:05 -0500, Diego Novillo wrote:
 In any case, that is not important.  I agree that every SSA name in the 
 SSA table needs to have a DEF_STMT that is either (a) an empty 
 statement, or, (b) a valid statement still present in the IL.
Just to be 100% clear.  This is not true at the current time; see the
discussion about the sharing of a single field for TREE_CHAIN and
SSA_NAME_DEF_STMT.  If you want to make that statement true, then
you need to fix both the orphan problem and the sharing of a field
for SSA_NAME_DEF_STMT and TREE_CHAIN.
.
 
 Frankly, I'm a bit surprised that we are running into this. I'd like to 
 see a test case, if you have one.
I'm not surprised at all.  We've never systematically tried to identify
leaks of SSA_NAMEs.

Jeff



Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Jeffrey Law
On Thu, 2006-12-21 at 20:18 +0100, Zdenek Dvorak wrote:

 I think this might be a good idea.  I think that this requires
 a lot of changes (basically going through all uses of bsi_remove
 and remove_phi_node and checking them), but it would be cleaner
 than the current situation.
Agreed.  Tedious work, but it shouldn't be terribly difficult (famous
last words).


 It should be however easy to add verification to verify_ssa, so
 this project should be fairly straightforward (I hope).
The verify step is relatively simple.

  FOR_EACH_BB
FOR_EACH_STMT
  mark any SSA_NAMEs in stmt

  FOR_EACH_SSA_NAME
if (!marked  !in_freelist)
  checking failure




jeff




Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Jeffrey Law
On Thu, 2006-12-21 at 10:58 -0800, Robert Kennedy wrote:
  Right now we can have SSA_NAMEs in the
  list which are no longer used, and we have no way to tell whether they
  are used or not.  Thus the only way to see all valid SSA_NAMEs is to
  walk the code.
 
 To wit: are there iteration macros somewhere that will help me walk
 the code while abstracting away all the ugly details like stmt/bb
 boundaries, etc.?
Not really.  Note that based on the ongoing discussion any such code
would have a short life since it sounds like the general direction is
to fix this long standing issue.
jeff



Re: SSA_NAMES: should there be an unused, un-free limbo?

2006-12-21 Thread Jeffrey Law
On Thu, 2006-12-21 at 10:54 -0800, Robert Kennedy wrote:
  In this case this isn't true, because we have code that orphans ssa
  names without releasing them.
  I'm sure Robert will explain further details in a few moments :)
 
 Actually you explained all the relevant details. The question is
 whether it should be allowed or not. So far almost everyone seems to
 think not.
More correctly, it has been allowed in the past, but the consensus that
seems to be forming is to disallow it in the future.

jeff




Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Roberto Bagnara

Paul Eggert wrote:
 Also, such an approach assumes that unsigned long long int
 has at least as many bits as long long int.  But this is an
 unportable assumption; C99 does not require this.  We have
 run into hosts where the widest signed integer type has much
 greater range than the widest unsigned type.  I hope these
 hosts go away in the long run, but they're in production use
 today.  (The platform I'm thinking of is Tandem NSK/OSS.)

Is this correct?  Doesn't C99's 6.2.5#6 mandate that unsigned
long long int has exactly the same number of bits as long long int?
Perhaps you mean that in Tandem NSK/OSS unsigned long long ints
do not use several bits of the representation?
Am I missing something else?
All the best,

Roberto


ISO/IEC 9899:1999 6.2.5

[...]

4 There are five standard signed integer types, designated as signed
  char, short int, int, long int, and long long int. [...]

[...]

6 For each of the signed integer types, there is a corresponding (but
  different) unsigned integer type (designated with the keyword
  unsigned) that uses the same amount of storage (including sign
  information) and has the same alignment requirements. [...]

[...]


--
Prof. Roberto Bagnara
Computer Science Group
Department of Mathematics, University of Parma, Italy
http://www.cs.unipr.it/~bagnara/
mailto:[EMAIL PROTECTED]


Re: GCC optimizes integer overflow: bug or feature?

2006-12-21 Thread Paul Eggert
Roberto Bagnara [EMAIL PROTECTED] writes:

 (The platform I'm thinking of is Tandem NSK/OSS.)

 Is this correct?  Doesn't C99's 6.2.5#6 mandate that...

This is straying from the subject of GCC and into the
problems of writing portable C code, but since you asked

The Tandem NSK/OSS environment does not claim full
conformance to C99.  The NSK/OSS community is conservative
(fault-tolerance does that do you :-) and has introduced
only some C99 features, more as time progresses.  The
NSK/OSS developers did not introduce 64-bit unsigned int
until last year.  I'm no expert in the area, but I'd guess
that most NSK/OSS production shops are still running older
releases, which have 64-bit signed int but only 32-bit
unsigned int.


[Bug bootstrap/30272] New: Build failure under SGI Irix (GFortran)

2006-12-21 Thread P dot Schaffnit at access dot rwth-aachen dot de
Hi! 

With fairly recent sources (120074), building GCC fails under SGI Irix.

I cannot rule out that it's due to the fact that the system is outdated, and
some tools should be updated (but which?).

Here's a link to where I've reported that to the GFortran list, and the
subsequent comments: http://gcc.gnu.org/ml/fortran/2006-12/msg00380.html

Thanks!

Philippe

PS: the error message I get:

cp /USER/philippe/Irix/Gcc_Sources/libgfortran/config/fpu-sysv.h fpu-target.h
make  all-am
make[3]: Entering directory
`/USER/philippe/Irix/Compilation/Temp/mips-sgi-irix6.5/libgfortran'
bash ./libtool --mode=compile /USER/philippe/Irix/Compilation/Temp/./gcc/xgcc
-B/USER/philippe/Irix/Compilation/Temp/./gcc/
-B/USER/philippe/Irix/Gcc/mips-sgi-irix6.5/bin/
-B/USER/philippe/Irix/Gcc/mips-sgi-irix6.5/lib/ -isystem
/USER/philippe/Irix/Gcc/mips-sgi-irix6.5/include -isystem
/USER/philippe/Irix/Gcc/mips-sgi-irix6.5/sys-include -DHAVE_CONFIG_H -I.
-I/USER/philippe/Irix/Gcc_Sources/libgfortran -I. 
-iquote/USER/philippe/Irix/Gcc_Sources/libgfortran/io
-I/USER/philippe/Irix/Gcc_Sources/libgfortran/../gcc
-I/USER/philippe/Irix/Gcc_Sources/libgfortran/../gcc/config -I../.././gcc
-D_GNU_SOURCE  -std=gnu99 -Wall -Wstrict-prototypes -Wmissing-prototypes
-Wold-style-definition -Wextra -Wwrite-strings -O2 -g -O2  -c -o fmain.lo
/USER/philippe/Irix/Gcc_Sources/libgfortran/fmain.c
/USER/philippe/Irix/Compilation/Temp/./gcc/xgcc
-B/USER/philippe/Irix/Compilation/Temp/./gcc/
-B/USER/philippe/Irix/Gcc/mips-sgi-irix6.5/bin/
-B/USER/philippe/Irix/Gcc/mips-sgi-irix6.5/lib/ -isystem
/USER/philippe/Irix/Gcc/mips-sgi-irix6.5/include -isystem
/USER/philippe/Irix/Gcc/mips-sgi-irix6.5/sys-include -DHAVE_CONFIG_H -I.
-I/USER/philippe/Irix/Gcc_Sources/libgfortran -I.
-iquote/USER/philippe/Irix/Gcc_Sources/libgfortran/io
-I/USER/philippe/Irix/Gcc_Sources/libgfortran/../gcc
-I/USER/philippe/Irix/Gcc_Sources/libgfortran/../gcc/config -I../.././gcc
-D_GNU_SOURCE -std=gnu99 -Wall -Wstrict-prototypes -Wmissing-prototypes
-Wold-style-definition -Wextra -Wwrite-strings -O2 -g -O2 -c
/USER/philippe/Irix/Gcc_Sources/libgfortran/fmain.c -o fmain.o
In file included from
/USER/philippe/Irix/Gcc_Sources/libgfortran/libgfortran.h:43,
 from /USER/philippe/Irix/Gcc_Sources/libgfortran/fmain.c:2:
/usr/include/complex.h:178: error: conflicting types for 'cabsl'
/USER/philippe/Irix/Compilation/Temp/./gcc/include/math.h:537: error: previous
declaration of 'cabsl' was here
make[3]: *** [fmain.lo] Error 1
make[3]: Leaving directory
`/USER/philippe/Irix/Compilation/Temp/mips-sgi-irix6.5/libgfortran'
make[2]: *** [all] Error 2
make[2]: Leaving directory
`/USER/philippe/Irix/Compilation/Temp/mips-sgi-irix6.5/libgfortran'
make[1]: *** [all-target-libgfortran] Error 2
make[1]: Leaving directory `/USER/philippe/Irix/Compilation/Temp'
make: *** [bootstrap] Error 2


-- 
   Summary: Build failure under SGI Irix (GFortran)
   Product: gcc
   Version: 4.3.0
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: bootstrap
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: P dot Schaffnit at access dot rwth-aachen dot de


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



[Bug fortran/30273] New: gfc_todo: Not Implemented: Unable to determine rank of expression

2006-12-21 Thread anlauf at gmx dot de
Hi,

here's another one:

gfcbug49.f90: In function 'construct':
gfcbug49.f90:20: fatal error: gfc_todo: Not Implemented: Unable to determine
rank of expression
compilation terminated.

The reduced example code is attached.

Cheers,
-ha


-- 
   Summary: gfc_todo: Not Implemented: Unable to determine rank of
expression
   Product: gcc
   Version: 4.3.0
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: anlauf at gmx dot de
  GCC host triplet: i686-pc-linux-gnu


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



[Bug fortran/30273] gfc_todo: Not Implemented: Unable to determine rank of expression

2006-12-21 Thread anlauf at gmx dot de


--- Comment #1 from anlauf at gmx dot de  2006-12-21 08:41 ---
Created an attachment (id=12829)
 -- (http://gcc.gnu.org/bugzilla/attachment.cgi?id=12829action=view)
Demo code for gfc_todo


-- 


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



[Bug fortran/30081] Interface bug overloading random_seed, random_number

2006-12-21 Thread anlauf at gmx dot de


--- Comment #8 from anlauf at gmx dot de  2006-12-21 08:49 ---
(In reply to comment #7)

Paul,

a personal thanks for taking care of this one.
With this patch in place, I was now able proceed
compiling a major software piece just to hit
the next gfc_todo (PR 30273)...

Anyway, a merry x-mas and a happy to year to all
actively involved in fixing gfortran.


-- 


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



[Bug target/28966] -maltivec -m32 causes the stack to be saved and restored even though there is no need for it

2006-12-21 Thread nathan at gcc dot gnu dot org


-- 

nathan at gcc dot gnu dot org changed:

   What|Removed |Added

 AssignedTo|unassigned at gcc dot gnu   |nathan at gcc dot gnu dot
   |dot org |org
 Status|UNCONFIRMED |ASSIGNED
 Ever Confirmed|0   |1
   Last reconfirmed|-00-00 00:00:00 |2006-12-21 09:03:35
   date||


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



[Bug target/28966] -maltivec -m32 causes the stack to be saved and restored even though there is no need for it

2006-12-21 Thread nathan at gcc dot gnu dot org


--- Comment #3 from nathan at gcc dot gnu dot org  2006-12-21 09:04 ---
Fixed on mainline
2006-12-21  Nathan Sidwell  [EMAIL PROTECTED]

PR target/28966
PR target/29248
* reload1.c (reload): Realign stack after it changes size.


-- 

nathan at gcc dot gnu dot org changed:

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution||FIXED


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



[Bug target/29867] [4.3 Regression] building libgfortran fails because of multiple definitions gcc-4.3-20061111

2006-12-21 Thread eesrjhc at bath dot ac dot uk


--- Comment #13 from eesrjhc at bath dot ac dot uk  2006-12-21 09:10 ---
Created an attachment (id=12830)
 -- (http://gcc.gnu.org/bugzilla/attachment.cgi?id=12830action=view)
Includes as requested by Daniel

Various include files as requested by Daniel in comment number 12.


-- 


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



[Bug bootstrap/30272] Build failure under SGI Irix (GFortran)

2006-12-21 Thread dfranke at gcc dot gnu dot org


--- Comment #1 from dfranke at gcc dot gnu dot org  2006-12-21 09:32 ---
There is a related hack for `cabs` in fixincludes/inclhack.def. Adding `cabsl`
may be sufficient to fix this.


-- 

dfranke at gcc dot gnu dot org changed:

   What|Removed |Added

   Keywords||build


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



[Bug bootstrap/30272] Build failure under SGI Irix (GFortran)

2006-12-21 Thread P dot Schaffnit at access dot rwth-aachen dot de


--- Comment #2 from P dot Schaffnit at access dot rwth-aachen dot de  
2006-12-21 09:38 ---

Erm... I have very little knowledge of C, and next to no understanding of the
GCC sources, so I'm afraid I do not fully understand what could be done, but if
you care to spell it out (easy and slow, 8-)...), I can try it!

Thanks!

Philippe


-- 


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



[Bug bootstrap/30272] Build failure under SGI Irix (GFortran)

2006-12-21 Thread dfranke at gcc dot gnu dot org


--- Comment #3 from dfranke at gcc dot gnu dot org  2006-12-21 11:53 ---
Comment #2 was meant as a hint for someone who knows how to fix it ;)
Btw, could you please attach the offending math.h to this PR?

Regards
Daniel


-- 

dfranke at gcc dot gnu dot org changed:

   What|Removed |Added

 CC||dfranke at gcc dot gnu dot
   ||org


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



[Bug fortran/30273] gfc_todo: Not Implemented: Unable to determine rank of expression

2006-12-21 Thread burnus at gcc dot gnu dot org


-- 

burnus at gcc dot gnu dot org changed:

   What|Removed |Added

 CC||burnus at gcc dot gnu dot
   ||org
 Status|UNCONFIRMED |NEW
 Ever Confirmed|0   |1
   Keywords||ice-on-valid-code
   Last reconfirmed|-00-00 00:00:00 |2006-12-21 12:41:14
   date||


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



[Bug target/30230] Incorrect ia64 EH info when an EH region ends in the middle of a bundle

2006-12-21 Thread jakub at gcc dot gnu dot org


--- Comment #1 from jakub at gcc dot gnu dot org  2006-12-21 12:59 ---
Subject: Bug 30230

Author: jakub
Date: Thu Dec 21 12:59:06 2006
New Revision: 120103

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120103
Log:
PR target/30230
* config/ia64/ia64.c (ia64_add_bundle_selector_before): New function.
(bundling): Use it.

* g++.dg/eh/ia64-2.C: New test.

Added:
trunk/gcc/testsuite/g++.dg/eh/ia64-2.C
Modified:
trunk/gcc/ChangeLog
trunk/gcc/config/ia64/ia64.c
trunk/gcc/testsuite/ChangeLog


-- 


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



[Bug target/30230] Incorrect ia64 EH info when an EH region ends in the middle of a bundle

2006-12-21 Thread jakub at gcc dot gnu dot org


--- Comment #2 from jakub at gcc dot gnu dot org  2006-12-21 13:04 ---
Subject: Bug 30230

Author: jakub
Date: Thu Dec 21 13:04:08 2006
New Revision: 120104

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120104
Log:
PR target/30230
* config/ia64/ia64.c (ia64_add_bundle_selector_before): New function.
(bundling): Use it.

* g++.dg/eh/ia64-2.C: New test.

Added:
branches/gcc-4_2-branch/gcc/testsuite/g++.dg/eh/ia64-2.C
Modified:
branches/gcc-4_2-branch/gcc/ChangeLog
branches/gcc-4_2-branch/gcc/config/ia64/ia64.c
branches/gcc-4_2-branch/gcc/testsuite/ChangeLog


-- 


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



[Bug target/30230] Incorrect ia64 EH info when an EH region ends in the middle of a bundle

2006-12-21 Thread jakub at gcc dot gnu dot org


--- Comment #3 from jakub at gcc dot gnu dot org  2006-12-21 13:06 ---
Subject: Bug 30230

Author: jakub
Date: Thu Dec 21 13:06:37 2006
New Revision: 120105

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120105
Log:
PR target/30230
* config/ia64/ia64.c (ia64_add_bundle_selector_before): New function.
(bundling): Use it.

* g++.dg/eh/ia64-2.C: New test.

Added:
branches/gcc-4_1-branch/gcc/testsuite/g++.dg/eh/ia64-2.C
Modified:
branches/gcc-4_1-branch/gcc/ChangeLog
branches/gcc-4_1-branch/gcc/config/ia64/ia64.c
branches/gcc-4_1-branch/gcc/testsuite/ChangeLog


-- 


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



[Bug middle-end/30263] ICE with openmp parallel accessed var in asm m constraint

2006-12-21 Thread jakub at gcc dot gnu dot org


--- Comment #2 from jakub at gcc dot gnu dot org  2006-12-21 13:13 ---
Subject: Bug 30263

Author: jakub
Date: Thu Dec 21 13:13:15 2006
New Revision: 120106

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120106
Log:
PR middle-end/30262
PR middle-end/30263
* tree-nested.c (walk_asm_expr): New function.
(walk_stmts): Use it for ASM_EXPR.

* gcc.c-torture/execute/20061220-1.c: New test.
* gcc.dg/gomp/asm-1.c: New test.

Added:
trunk/gcc/testsuite/gcc.c-torture/execute/20061220-1.c
trunk/gcc/testsuite/gcc.dg/gomp/asm-1.c
Modified:
trunk/gcc/ChangeLog
trunk/gcc/testsuite/ChangeLog
trunk/gcc/tree-nested.c


-- 


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



[Bug middle-end/30262] [4.0/4.1/4.2/4.3 Regression] ICE with nested fn accessed var in asm m constraint

2006-12-21 Thread jakub at gcc dot gnu dot org


--- Comment #4 from jakub at gcc dot gnu dot org  2006-12-21 13:13 ---
Subject: Bug 30262

Author: jakub
Date: Thu Dec 21 13:13:15 2006
New Revision: 120106

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120106
Log:
PR middle-end/30262
PR middle-end/30263
* tree-nested.c (walk_asm_expr): New function.
(walk_stmts): Use it for ASM_EXPR.

* gcc.c-torture/execute/20061220-1.c: New test.
* gcc.dg/gomp/asm-1.c: New test.

Added:
trunk/gcc/testsuite/gcc.c-torture/execute/20061220-1.c
trunk/gcc/testsuite/gcc.dg/gomp/asm-1.c
Modified:
trunk/gcc/ChangeLog
trunk/gcc/testsuite/ChangeLog
trunk/gcc/tree-nested.c


-- 


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



[Bug middle-end/30262] [4.0/4.1/4.2/4.3 Regression] ICE with nested fn accessed var in asm m constraint

2006-12-21 Thread jakub at gcc dot gnu dot org


--- Comment #5 from jakub at gcc dot gnu dot org  2006-12-21 13:19 ---
Subject: Bug 30262

Author: jakub
Date: Thu Dec 21 13:18:52 2006
New Revision: 120107

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120107
Log:
PR middle-end/30262
PR middle-end/30263
* tree-nested.c (walk_asm_expr): New function.
(walk_stmts): Use it for ASM_EXPR.

* gcc.c-torture/execute/20061220-1.c: New test.
* gcc.dg/gomp/asm-1.c: New test.

Added:
branches/gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/20061220-1.c
branches/gcc-4_2-branch/gcc/testsuite/gcc.dg/gomp/asm-1.c
Modified:
branches/gcc-4_2-branch/gcc/ChangeLog
branches/gcc-4_2-branch/gcc/testsuite/ChangeLog
branches/gcc-4_2-branch/gcc/tree-nested.c


-- 


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



[Bug middle-end/30263] ICE with openmp parallel accessed var in asm m constraint

2006-12-21 Thread jakub at gcc dot gnu dot org


--- Comment #3 from jakub at gcc dot gnu dot org  2006-12-21 13:19 ---
Subject: Bug 30263

Author: jakub
Date: Thu Dec 21 13:18:52 2006
New Revision: 120107

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120107
Log:
PR middle-end/30262
PR middle-end/30263
* tree-nested.c (walk_asm_expr): New function.
(walk_stmts): Use it for ASM_EXPR.

* gcc.c-torture/execute/20061220-1.c: New test.
* gcc.dg/gomp/asm-1.c: New test.

Added:
branches/gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/20061220-1.c
branches/gcc-4_2-branch/gcc/testsuite/gcc.dg/gomp/asm-1.c
Modified:
branches/gcc-4_2-branch/gcc/ChangeLog
branches/gcc-4_2-branch/gcc/testsuite/ChangeLog
branches/gcc-4_2-branch/gcc/tree-nested.c


-- 


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



[Bug bootstrap/30272] Build failure under SGI Irix (GFortran)

2006-12-21 Thread P dot Schaffnit at access dot rwth-aachen dot de


--- Comment #4 from P dot Schaffnit at access dot rwth-aachen dot de  
2006-12-21 13:22 ---
Created an attachment (id=12831)
 -- (http://gcc.gnu.org/bugzilla/attachment.cgi?id=12831action=view)
GZip-ed relevant math.h


-- 


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



[Bug bootstrap/30272] Build failure under SGI Irix (GFortran)

2006-12-21 Thread P dot Schaffnit at access dot rwth-aachen dot de


--- Comment #5 from P dot Schaffnit at access dot rwth-aachen dot de  
2006-12-21 13:23 ---
Following Daniel's advice (which does sound to make sense), here's this faulty
math.h...

I hope someone can make sense of this all...

Thanks!

Philippe


-- 


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



[Bug middle-end/30262] [4.0/4.1/4.2/4.3 Regression] ICE with nested fn accessed var in asm m constraint

2006-12-21 Thread jakub at gcc dot gnu dot org


--- Comment #6 from jakub at gcc dot gnu dot org  2006-12-21 13:37 ---
Subject: Bug 30262

Author: jakub
Date: Thu Dec 21 13:37:41 2006
New Revision: 120108

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120108
Log:
PR middle-end/30262
PR middle-end/30263
* tree-nested.c (walk_asm_expr): New function.
(walk_stmts): Use it for ASM_EXPR.

* gcc.c-torture/execute/20061220-1.c: New test.
* gcc.dg/gomp/asm-1.c: New test.

Added:
   
branches/redhat/gcc-4_1-branch/gcc/testsuite/gcc.c-torture/execute/20061220-1.c
branches/redhat/gcc-4_1-branch/gcc/testsuite/gcc.dg/gomp/asm-1.c
Modified:
branches/redhat/gcc-4_1-branch/gcc/ChangeLog
branches/redhat/gcc-4_1-branch/gcc/testsuite/ChangeLog
branches/redhat/gcc-4_1-branch/gcc/tree-nested.c


-- 


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



[Bug middle-end/30263] ICE with openmp parallel accessed var in asm m constraint

2006-12-21 Thread jakub at gcc dot gnu dot org


--- Comment #4 from jakub at gcc dot gnu dot org  2006-12-21 13:38 ---
Subject: Bug 30263

Author: jakub
Date: Thu Dec 21 13:37:41 2006
New Revision: 120108

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120108
Log:
PR middle-end/30262
PR middle-end/30263
* tree-nested.c (walk_asm_expr): New function.
(walk_stmts): Use it for ASM_EXPR.

* gcc.c-torture/execute/20061220-1.c: New test.
* gcc.dg/gomp/asm-1.c: New test.

Added:
   
branches/redhat/gcc-4_1-branch/gcc/testsuite/gcc.c-torture/execute/20061220-1.c
branches/redhat/gcc-4_1-branch/gcc/testsuite/gcc.dg/gomp/asm-1.c
Modified:
branches/redhat/gcc-4_1-branch/gcc/ChangeLog
branches/redhat/gcc-4_1-branch/gcc/testsuite/ChangeLog
branches/redhat/gcc-4_1-branch/gcc/tree-nested.c


-- 


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



[Bug c++/30274] New: bool bit-field: wrong increment and decremenet

2006-12-21 Thread s__nakayama at infoseek dot jp
testcase

#include stdio.h

#ifndef __cplusplus
typedef _Bool bool;
#endif

struct S
{
  bool x: 4;
};

int main()
{
  struct S x = {1};
  x.x++;// x.x: value becomes 2.
  printf(%d\n, x.x);
//  x.x--;// accept invalid
  return 0;
}

GCC 4.2 result
$g++ a.c -o a; ./a
2

GCC 4.1 result
$g++ a.c -o a; ./a
1


GCC version:4.2.0 20061212
The same bug exists also in C-frontend since 4.0.


-- 
   Summary: bool bit-field: wrong increment and decremenet
   Product: gcc
   Version: 4.2.0
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: s__nakayama at infoseek dot jp


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



[Bug middle-end/30263] ICE with openmp parallel accessed var in asm m constraint

2006-12-21 Thread jakub at gcc dot gnu dot org


--- Comment #5 from jakub at gcc dot gnu dot org  2006-12-21 13:52 ---
Fixed in SVN.


-- 

jakub at gcc dot gnu dot org changed:

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution||FIXED


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



[Bug middle-end/30262] [4.0/4.1 Regression] ICE with nested fn accessed var in asm m constraint

2006-12-21 Thread jakub at gcc dot gnu dot org


--- Comment #7 from jakub at gcc dot gnu dot org  2006-12-21 13:53 ---
Fixed for 4.2/4.3 so far.


-- 

jakub at gcc dot gnu dot org changed:

   What|Removed |Added

Summary|[4.0/4.1/4.2/4.3 Regression]|[4.0/4.1 Regression] ICE
   |ICE with nested fn accessed |with nested fn accessed var
   |var in asm m constraint   |in asm m constraint


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



[Bug fortran/30202] ICE in trans-array.c

2006-12-21 Thread pault at gcc dot gnu dot org


--- Comment #6 from pault at gcc dot gnu dot org  2006-12-21 14:00 ---
Subject: Bug 30202

Author: pault
Date: Thu Dec 21 13:59:57 2006
New Revision: 120109

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120109
Log:
2006-12-21  Paul Thomas  [EMAIL PROTECTED]

PR fortran/30202
* trans-array.c (gfc_conv_function_call): Use parmse.expr for
the nullifying of intent(out) arguments rather than the backend
declaration.

2006-12-21  Paul Thomas  [EMAIL PROTECTED]

PR fortran/30202
* gfortran.dg/alloc_comp_basics_3.f90: New test.



Added:
trunk/gcc/testsuite/gfortran.dg/alloc_comp_basics_3.f90
Modified:
trunk/gcc/fortran/ChangeLog
trunk/gcc/fortran/trans-expr.c
trunk/gcc/testsuite/ChangeLog


-- 


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



[Bug fortran/29464] [4.1 and 4.2 only] problem with duplicate USE, ONLY of procedure in INTERFACE

2006-12-21 Thread pault at gcc dot gnu dot org


--- Comment #5 from pault at gcc dot gnu dot org  2006-12-21 14:19 ---
Subject: Bug 29464

Author: pault
Date: Thu Dec 21 14:19:40 2006
New Revision: 120110

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120110
Log:
2006-11-21  Paul Thomas  [EMAIL PROTECTED]

PR fortran/29464
* module.c (load_generic_interfaces): Add symbols for all the
local names of an interface.  Share the interface amongst the
symbols.
* gfortran.h : Add generic_copy to symbol_attribute.
* symbol.c (free_symbol): Only free interface if generic_copy
is not set.

2006-11-21  Paul Thomas  [EMAIL PROTECTED]

PR fortran/29464
* gfortran.dg/module_interface_2.f90: New test.


Added:
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/module_interface_2.f90
Modified:
branches/gcc-4_2-branch/gcc/fortran/ChangeLog
branches/gcc-4_2-branch/gcc/fortran/gfortran.h
branches/gcc-4_2-branch/gcc/fortran/module.c
branches/gcc-4_2-branch/gcc/fortran/symbol.c
branches/gcc-4_2-branch/gcc/testsuite/ChangeLog


-- 


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



[Bug fortran/29941] [4.1 and 4.2 only] gfortran reports error with len of assumed size character array

2006-12-21 Thread pault at gcc dot gnu dot org


--- Comment #5 from pault at gcc dot gnu dot org  2006-12-21 14:33 ---
Subject: Bug 29941

Author: pault
Date: Thu Dec 21 14:32:51 2006
New Revision: 120111

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120111
Log:
2006-12-21  Paul Thomas  [EMAIL PROTECTED]

PR fortran/29941
* resolve.c (resolve_function): Add LEN to the functions not
checked for assumed size actual args.


2006-12-21  Paul Thomas  [EMAIL PROTECTED]

PR fortran/29941
* gfortran.dg/assumed_len.f90: New test.


Added:
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/assumed_len.f90
Modified:
branches/gcc-4_2-branch/gcc/fortran/ChangeLog
branches/gcc-4_2-branch/gcc/fortran/resolve.c
branches/gcc-4_2-branch/gcc/testsuite/ChangeLog


-- 


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



[Bug fortran/29464] [4.1 only] problem with duplicate USE, ONLY of procedure in INTERFACE

2006-12-21 Thread pault at gcc dot gnu dot org


--- Comment #6 from pault at gcc dot gnu dot org  2006-12-21 14:56 ---
Fixed on trunk and 4.2

Paul


-- 

pault at gcc dot gnu dot org changed:

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution||FIXED
Summary|[4.1 and 4.2 only] problem  |[4.1 only] problem with
   |with duplicate USE, ONLY of |duplicate USE, ONLY of
   |procedure in INTERFACE  |procedure in INTERFACE


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



[Bug fortran/29941] [4.1 only] gfortran reports error with len of assumed size character array

2006-12-21 Thread pault at gcc dot gnu dot org


--- Comment #6 from pault at gcc dot gnu dot org  2006-12-21 14:56 ---
Fixed on trunk and 4.2

Paul


-- 

pault at gcc dot gnu dot org changed:

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution||FIXED
Summary|[4.1 and 4.2 only] gfortran |[4.1 only] gfortran reports
   |reports error with len of   |error with len of assumed
   |assumed size character array|size character array


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



[Bug fortran/30096] [4.1 and 4.2 only] Interface bug: gfortran falsely detect ambigious interface, scoping problem?

2006-12-21 Thread pault at gcc dot gnu dot org


--- Comment #7 from pault at gcc dot gnu dot org  2006-12-21 15:05 ---
Subject: Bug 30096

Author: pault
Date: Thu Dec 21 15:05:24 2006
New Revision: 120113

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120113
Log:
2006-12-21  Paul Thomas  [EMAIL PROTECTED]

PR fortran/29975
PR fortran/30068
PR fortran/30096
* interface.c (compare_type_rank_if): Reject invalid generic
interfaces.
(check_interface1): Give a warning for nonreferred to ambiguous
interfaces.
(check_sym_interfaces): Check whether an ambiguous interface is
referred to.  Do not check host associated interfaces since these
cannot be ambiguous with the local versions.
(check_uop_interface, gfc_check_interfaces): Update call to
check_interface1.
* symbol.c (gfc_get_sym_tree, gfc_get_sym_tree): Allow adding
unambiguous procedures to generic interfaces.
* gfortran.h (symbol_attribute): Added use_only and
ambiguous_interfaces.
* module.c (load_need): Set the use_only flag, if needed.
* resolve.c (resolve_fl_procedure): Warn for nonreferred
interfaces.
* expr.c (find_array_section): Fix initializer array contructor.


2006-12-21  Paul Thomas  [EMAIL PROTECTED]
Tobias Burnus  [EMAIL PROTECTED]

PR fortran/29975
PR fortran/30068
* gfortran.dg/interface_4.f90: Test adding procedure to generic
interface.
* gfortran.dg/interface_5.f90: Test warning for not-referenced-to
ambiguous interfaces.
* gfortran.dg/interface_6.f90: Test invalid, ambiguous interface.
* gfortran.dg/interface_7.f90: Test invalid, ambiguous interface.
* gfortran.dg/interface_8.f90: Test warning for not-referenced-to
ambiguous interfaces.
* gfortran.dg/interface_1.f90: Change dg-error into a dg-warning.
* gfortran.dg/array_initializer_2.f90: Add initializer array
constructor test.

PR fortran/30096
* gfortran.dg/interface_9.f90: Test that host interfaces are
not checked for ambiguity with the local version.


Added:
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_4.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_5.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_6.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_7.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_8.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_9.f90
Modified:
branches/gcc-4_2-branch/gcc/fortran/ChangeLog
branches/gcc-4_2-branch/gcc/fortran/expr.c
branches/gcc-4_2-branch/gcc/fortran/gfortran.h
branches/gcc-4_2-branch/gcc/fortran/interface.c
branches/gcc-4_2-branch/gcc/fortran/module.c
branches/gcc-4_2-branch/gcc/fortran/resolve.c
branches/gcc-4_2-branch/gcc/fortran/symbol.c
branches/gcc-4_2-branch/gcc/testsuite/ChangeLog
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/array_initializer_2.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/generic_7.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_1.f90


-- 


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



[Bug fortran/29975] [meta-bugs] [4.1 and 4.2 only] ICEs with CP2K

2006-12-21 Thread pault at gcc dot gnu dot org


--- Comment #41 from pault at gcc dot gnu dot org  2006-12-21 15:05 ---
Subject: Bug 29975

Author: pault
Date: Thu Dec 21 15:05:24 2006
New Revision: 120113

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120113
Log:
2006-12-21  Paul Thomas  [EMAIL PROTECTED]

PR fortran/29975
PR fortran/30068
PR fortran/30096
* interface.c (compare_type_rank_if): Reject invalid generic
interfaces.
(check_interface1): Give a warning for nonreferred to ambiguous
interfaces.
(check_sym_interfaces): Check whether an ambiguous interface is
referred to.  Do not check host associated interfaces since these
cannot be ambiguous with the local versions.
(check_uop_interface, gfc_check_interfaces): Update call to
check_interface1.
* symbol.c (gfc_get_sym_tree, gfc_get_sym_tree): Allow adding
unambiguous procedures to generic interfaces.
* gfortran.h (symbol_attribute): Added use_only and
ambiguous_interfaces.
* module.c (load_need): Set the use_only flag, if needed.
* resolve.c (resolve_fl_procedure): Warn for nonreferred
interfaces.
* expr.c (find_array_section): Fix initializer array contructor.


2006-12-21  Paul Thomas  [EMAIL PROTECTED]
Tobias Burnus  [EMAIL PROTECTED]

PR fortran/29975
PR fortran/30068
* gfortran.dg/interface_4.f90: Test adding procedure to generic
interface.
* gfortran.dg/interface_5.f90: Test warning for not-referenced-to
ambiguous interfaces.
* gfortran.dg/interface_6.f90: Test invalid, ambiguous interface.
* gfortran.dg/interface_7.f90: Test invalid, ambiguous interface.
* gfortran.dg/interface_8.f90: Test warning for not-referenced-to
ambiguous interfaces.
* gfortran.dg/interface_1.f90: Change dg-error into a dg-warning.
* gfortran.dg/array_initializer_2.f90: Add initializer array
constructor test.

PR fortran/30096
* gfortran.dg/interface_9.f90: Test that host interfaces are
not checked for ambiguity with the local version.


Added:
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_4.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_5.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_6.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_7.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_8.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_9.f90
Modified:
branches/gcc-4_2-branch/gcc/fortran/ChangeLog
branches/gcc-4_2-branch/gcc/fortran/expr.c
branches/gcc-4_2-branch/gcc/fortran/gfortran.h
branches/gcc-4_2-branch/gcc/fortran/interface.c
branches/gcc-4_2-branch/gcc/fortran/module.c
branches/gcc-4_2-branch/gcc/fortran/resolve.c
branches/gcc-4_2-branch/gcc/fortran/symbol.c
branches/gcc-4_2-branch/gcc/testsuite/ChangeLog
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/array_initializer_2.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/generic_7.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_1.f90


-- 


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



[Bug fortran/30068] [4.1 and 4.2 only] Ambigous interfaces not detected

2006-12-21 Thread pault at gcc dot gnu dot org


--- Comment #14 from pault at gcc dot gnu dot org  2006-12-21 15:05 ---
Subject: Bug 30068

Author: pault
Date: Thu Dec 21 15:05:24 2006
New Revision: 120113

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=120113
Log:
2006-12-21  Paul Thomas  [EMAIL PROTECTED]

PR fortran/29975
PR fortran/30068
PR fortran/30096
* interface.c (compare_type_rank_if): Reject invalid generic
interfaces.
(check_interface1): Give a warning for nonreferred to ambiguous
interfaces.
(check_sym_interfaces): Check whether an ambiguous interface is
referred to.  Do not check host associated interfaces since these
cannot be ambiguous with the local versions.
(check_uop_interface, gfc_check_interfaces): Update call to
check_interface1.
* symbol.c (gfc_get_sym_tree, gfc_get_sym_tree): Allow adding
unambiguous procedures to generic interfaces.
* gfortran.h (symbol_attribute): Added use_only and
ambiguous_interfaces.
* module.c (load_need): Set the use_only flag, if needed.
* resolve.c (resolve_fl_procedure): Warn for nonreferred
interfaces.
* expr.c (find_array_section): Fix initializer array contructor.


2006-12-21  Paul Thomas  [EMAIL PROTECTED]
Tobias Burnus  [EMAIL PROTECTED]

PR fortran/29975
PR fortran/30068
* gfortran.dg/interface_4.f90: Test adding procedure to generic
interface.
* gfortran.dg/interface_5.f90: Test warning for not-referenced-to
ambiguous interfaces.
* gfortran.dg/interface_6.f90: Test invalid, ambiguous interface.
* gfortran.dg/interface_7.f90: Test invalid, ambiguous interface.
* gfortran.dg/interface_8.f90: Test warning for not-referenced-to
ambiguous interfaces.
* gfortran.dg/interface_1.f90: Change dg-error into a dg-warning.
* gfortran.dg/array_initializer_2.f90: Add initializer array
constructor test.

PR fortran/30096
* gfortran.dg/interface_9.f90: Test that host interfaces are
not checked for ambiguity with the local version.


Added:
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_4.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_5.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_6.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_7.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_8.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_9.f90
Modified:
branches/gcc-4_2-branch/gcc/fortran/ChangeLog
branches/gcc-4_2-branch/gcc/fortran/expr.c
branches/gcc-4_2-branch/gcc/fortran/gfortran.h
branches/gcc-4_2-branch/gcc/fortran/interface.c
branches/gcc-4_2-branch/gcc/fortran/module.c
branches/gcc-4_2-branch/gcc/fortran/resolve.c
branches/gcc-4_2-branch/gcc/fortran/symbol.c
branches/gcc-4_2-branch/gcc/testsuite/ChangeLog
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/array_initializer_2.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/generic_7.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.dg/interface_1.f90


-- 


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



[Bug fortran/30068] [4.1 only] Ambigous interfaces not detected

2006-12-21 Thread pault at gcc dot gnu dot org


--- Comment #15 from pault at gcc dot gnu dot org  2006-12-21 15:07 ---
Fixed on trunk and 4.2

Paul


-- 

pault at gcc dot gnu dot org changed:

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution||FIXED
Summary|[4.1 and 4.2 only] Ambigous |[4.1 only] Ambigous
   |interfaces not detected |interfaces not detected


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



  1   2   >