builtins.c (expand_builtin_fputs): When deleting NOP calls to builtin fputs...

* builtins.c (expand_builtin_fputs): When deleting NOP calls to
	builtin fputs, ensure we still evaluate the stream in case it
	has side-effects.

testsuite:
	* gcc.c-torture/execute/stdio-opt-1.c: New test.

From-SVN: r37162
This commit is contained in:
Kaveh R. Ghazi 2000-10-31 18:27:42 +00:00 committed by Kaveh Ghazi
parent bc359d3a5d
commit bcb38cc180
4 changed files with 45 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2000-10-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* builtins.c (expand_builtin_fputs): When deleting NOP calls to
builtin fputs, ensure we still evaluate the stream in case it
has side-effects.
2000-10-31 Jakub Jelinek <jakub@redhat.com>
* expr.c (do_store_flag): Pass operand_mode instead of GET_MODE (op0)

View File

@ -2351,7 +2351,13 @@ expand_builtin_fputs (arglist, ignore)
switch (compare_tree_int (len, 1))
{
case -1: /* length is 0, delete the call entirely . */
return const0_rtx;
{
/* Evaluate and ignore the argument in case it has
side-effects. */
expand_expr (TREE_VALUE (TREE_CHAIN (arglist)), const0_rtx,
VOIDmode, EXPAND_NORMAL);
return const0_rtx;
}
case 0: /* length is 1, call fputc. */
{
tree stripped_string = TREE_VALUE (arglist);

View File

@ -1,3 +1,7 @@
2000-10-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.c-torture/execute/stdio-opt-1.c: New test.
2000-10-31 Jakub Jelinek <jakub@redhat.com>
* g++.old-deja/g++.other/inline16.C: New test.

View File

@ -0,0 +1,28 @@
/* Copyright (C) 2000 Free Software Foundation.
When eliminating NOP calls to builtin fputs, ensure that we still
evaluate the stream argument in case it has side effects.
Written by Kaveh R. Ghazi, 10/30/2000. */
#include <stdio.h>
int main()
{
FILE *s_array[3] = {stdout, NULL, stdout}, **s_ptr = s_array;
/* Increment the stream pointer once. */
fputs ("", *s_ptr++);
/* Increment the stream pointer a second time. */
s_ptr++;
/* If we failed to increment the stream pointer twice, then the
stream passed in here will be NULL and we should crash. */
fputs ("hello world\n", *s_ptr);
/* Just in case, If *s_ptr is NULL abort anyway. */
if (*s_ptr == 0)
abort();
return 0;
}