This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [Patch, Fortran] Use __builtin_expect in libgfortran
Tobias Burnus wrote:
Andrew Thomas Pinski wrote:
If rutime_error is marked as noreturn, gcc already does this internally.
Great! That reduces the patch size a lot (at least in terms of changed
lines). Attached an updated version of the patch. Additional to
removing the not needed __builtin_expected, I added __attribute__
((format (printf...))) to two functions in libgfortran.h to improve
compile-time error checking.
I missed two places. Additionally, Andrew pointed out on IRC that
a) ptr == NULL
b) ptr1 == ptr2
comparisons are regarded to be unlikely (cf. predict.c -> "pointer
heuristic"). I therefore removed some other __builtin_expects.
We should keep (a) in mind for the procedures, which take optional
arguments; at least in some cases optional arguments are only rarely
passed. In these cases one can use __built_expected(..., 1). [But one
should be careful as one easily might get this wrong. For instance might
be there programs which are relying on iostat= errors (e.g. file does
not exist), which can be called much more frequently than the not
failing calls.]
As follow-up work one could mark if-branches for zero-sized arrays as
unlikely; I think I marked a few such, but there are presumably much more.
Build on x86-64-linux. OK for the trunk?
Tobias
PS: The most useful part of this patch is presumably at several places:
- if (compile_options.bounds_check)
+ if (__builtin_expect (compile_options.bounds_check, 0))
2008-08-03 Tobias Burnus <burnus@net-b.de>
* libgfortran.h (__mingw_snprintf, runtime_warning_at):
Add __attribute__ ((format (printf...))).
* io/file_pos.c (st_backspace, st_endfile, st_rewind,
export_proto): Use __builtin_expect.
* io/open.c (edit_modes, new_unit, already_open,
st_open): Ditto.
* intrinsics/dtime.c (dtime_sub): Ditto.
* intrinsics/pack_generic.c (pack_internal): Ditto.
* intrinsics/etime.c (etime_sub): Ditto.
* intrinsics/spread_generic.c (spread_internal): Ditto.
* intrinsics/random.c (arandom_r8, arandom_r10, arandom_r16): Ditto.
* intrinsics/args.c (getarg_i4,get_command_argument_i4,
get_command_i4): Ditto.
* m4/spread.m4 (spread_'rtype_code`): Ditto.
* m4/iforeach.m4 (name`'rtype_qual`_'atype_code,
m'name`'rtype_qual`_'atype_code, s'name`'rtype_qual`_'atype_code):
Ditto.
* m4/matmull.m4 (matmul_'rtype_code`): Ditto.
* m4/ifunction_logical.m4 (name`'rtype_qual`_'atype_code): Ditto.
* m4/ifunction.m4 (name`'rtype_qual`_'atype_code): Ditto.
* m4/matmul.m4 (matmul_'rtype_code`): Ditto.
* generated/minval_r8.c: Regenerated.
* generated/maxloc1_4_r8.c: Regenerated.
* generated/minloc1_16_r16.c: Regenerated.
* generated/spread_r10.c: Regenerated.
* generated/sum_i8.c: Regenerated.
* generated/any_l16.c: Regenerated.
* generated/spread_i8.c: Regenerated.
* generated/maxval_i2.c: Regenerated.
* generated/any_l2.c: Regenerated.
* generated/product_r4.c: Regenerated.
* generated/maxloc1_8_i4.c: Regenerated.
* generated/maxloc0_4_r4.c: Regenerated.
* generated/all_l1.c: Regenerated.
* generated/matmul_r8.c: Regenerated.
* generated/product_i2.c: Regenerated.
* generated/minloc0_4_r16.c: Regenerated.
* generated/minloc0_4_i1.c: Regenerated.
* generated/maxloc0_4_r16.c: Regenerated.
* generated/maxloc0_4_i2.c: Regenerated.
* generated/minloc1_8_r16.c: Regenerated.
* generated/maxloc1_8_r16.c: Regenerated.
* generated/maxloc0_8_i8.c: Regenerated.
* generated/sum_r16.c: Regenerated.
* generated/sum_i1.c: Regenerated.
* generated/minloc1_4_r8.c: Regenerated.
* generated/maxloc1_16_r16.c: Regenerated.
* generated/minloc1_16_i4.c: Regenerated.
* generated/maxloc1_16_i4.c: Regenerated.
* generated/minloc0_16_i8.c: Regenerated.
* generated/spread_i1.c: Regenerated.
* generated/maxloc0_16_i8.c: Regenerated.
* generated/maxval_r16.c: Regenerated.
* generated/product_c10.c: Regenerated.
* generated/minloc1_8_i4.c: Regenerated.
* generated/minloc0_16_i16.c: Regenerated.
* generated/matmul_r16.c: Regenerated.
* generated/minloc0_4_r4.c: Regenerated.
* generated/all_l2.c: Regenerated.
* generated/product_c4.c: Regenerated.
* generated/sum_r4.c: Regenerated.
* generated/minloc0_4_i2.c: Regenerated.
* generated/spread_c10.c: Regenerated.
* generated/maxloc0_8_i1.c: Regenerated.
* generated/spread_r4.c: Regenerated.
* generated/minloc0_8_i8.c: Regenerated.
* generated/matmul_c8.c: Regenerated.
* generated/all_l16.c: Regenerated.
* generated/minloc1_16_r10.c: Regenerated.
* generated/sum_i2.c: Regenerated.
* generated/minloc0_16_i1.c: Regenerated.
* generated/maxloc0_16_i1.c: Regenerated.
* generated/maxloc1_8_r8.c: Regenerated.
* generated/minval_i16.c: Regenerated.
* generated/spread_i2.c: Regenerated.
* generated/maxval_i4.c: Regenerated.
* generated/any_l4.c: Regenerated.
* generated/minval_i8.c: Regenerated.
* generated/maxloc1_4_i8.c: Regenerated.
* generated/maxloc0_16_i16.c: Regenerated.
* generated/maxloc0_8_r4.c: Regenerated.
* generated/minloc1_4_i16.c: Regenerated.
* generated/minloc0_4_r10.c: Regenerated.
* generated/maxloc1_4_i16.c: Regenerated.
* generated/minloc0_8_i16.c: Regenerated.
* generated/maxloc0_4_r10.c: Regenerated.
* generated/maxloc0_8_i16.c: Regenerated.
* generated/minloc1_8_r10.c: Regenerated.
* generated/minloc0_16_r4.c: Regenerated.
* generated/product_i4.c: Regenerated.
* generated/maxloc1_8_r10.c: Regenerated.
* generated/sum_c16.c: Regenerated.
* generated/maxloc0_16_r4.c: Regenerated.
* generated/minloc0_8_i1.c: Regenerated.
* generated/minloc1_16_r8.c: Regenerated.
* generated/maxloc0_4_i4.c: Regenerated.
* generated/maxloc1_16_r8.c: Regenerated.
* generated/maxloc0_8_i2.c: Regenerated.
* generated/count_4_l.c: Regenerated.
* generated/sum_r10.c: Regenerated.
* generated/count_8_l.c: Regenerated.
* generated/sum_c4.c: Regenerated.
* generated/maxloc1_16_r10.c: Regenerated.
* generated/matmul_i8.c: Regenerated.
* generated/minloc0_16_i2.c: Regenerated.
* generated/minloc1_8_r8.c: Regenerated.
* generated/maxloc0_16_i2.c: Regenerated.
* generated/spread_c4.c: Regenerated.
* generated/matmul_c16.c: Regenerated.
* generated/maxval_r10.c: Regenerated.
* generated/minval_i1.c: Regenerated.
* generated/maxloc1_4_i1.c: Regenerated.
* generated/matmul_r10.c: Regenerated.
* generated/minloc1_4_i8.c: Regenerated.
* generated/minloc0_8_r4.c: Regenerated.
* generated/matmul_l4.c: Regenerated.
* generated/minloc0_16_r16.c: Regenerated.
* generated/product_i16.c: Regenerated.
* generated/all_l4.c: Regenerated.
* generated/minloc0_4_i4.c: Regenerated.
* generated/minloc0_8_i2.c: Regenerated.
* generated/matmul_i1.c: Regenerated.
* generated/minval_r4.c: Regenerated.
* generated/maxloc1_4_r4.c: Regenerated.
* generated/spread_i16.c: Regenerated.
* generated/sum_i4.c: Regenerated.
* generated/maxval_r8.c: Regenerated.
* generated/spread_i4.c: Regenerated.
* generated/minloc1_4_i1.c: Regenerated.
* generated/minval_r16.c: Regenerated.
* generated/minval_i2.c: Regenerated.
* generated/maxloc1_4_i2.c: Regenerated.
* generated/product_r8.c: Regenerated.
* generated/maxloc1_8_i8.c: Regenerated.
* generated/maxloc0_4_r8.c: Regenerated.
* generated/maxloc0_16_r16.c: Regenerated.
* generated/matmul_r4.c: Regenerated.
* generated/sum_c10.c: Regenerated.
* generated/minloc1_4_r16.c: Regenerated.
* generated/maxloc1_4_r16.c: Regenerated.
* generated/minloc0_8_r16.c: Regenerated.
* generated/maxloc0_8_r16.c: Regenerated.
* generated/count_1_l.c: Regenerated.
* generated/maxloc0_8_i4.c: Regenerated.
* generated/matmul_i2.c: Regenerated.
* generated/minloc1_4_r4.c: Regenerated.
* generated/matmul_c10.c: Regenerated.
* generated/minloc0_16_i4.c: Regenerated.
* generated/maxloc0_16_i4.c: Regenerated.
* generated/minloc1_16_i8.c: Regenerated.
* generated/maxloc1_16_i8.c: Regenerated.
* generated/minloc1_4_i2.c: Regenerated.
* generated/matmul_l16.c: Regenerated.
* generated/maxloc1_8_i1.c: Regenerated.
* generated/minloc0_16_r10.c: Regenerated.
* generated/minloc1_8_i8.c: Regenerated.
* generated/minloc0_4_r8.c: Regenerated.
* generated/product_r16.c: Regenerated.
* generated/product_c8.c: Regenerated.
* generated/sum_r8.c: Regenerated.
* generated/minloc0_8_i4.c: Regenerated.
* generated/matmul_c4.c: Regenerated.
* generated/minloc1_16_i16.c: Regenerated.
* generated/spread_r8.c: Regenerated.
* generated/maxloc1_8_r4.c: Regenerated.
* generated/minloc1_16_i1.c: Regenerated.
* generated/maxloc1_16_i1.c: Regenerated.
* generated/spread_r16.c: Regenerated.
* generated/minval_r10.c: Regenerated.
* generated/count_16_l.c: Regenerated.
* generated/minval_i4.c: Regenerated.
* generated/minloc1_8_i1.c: Regenerated.
* generated/maxloc1_4_i4.c: Regenerated.
* generated/maxloc1_8_i2.c: Regenerated.
* generated/maxval_i8.c: Regenerated.
* generated/any_l8.c: Regenerated.
* generated/maxloc0_16_r10.c: Regenerated.
* generated/minloc0_4_i16.c: Regenerated.
* generated/maxloc0_8_r8.c: Regenerated.
* generated/maxloc0_4_i16.c: Regenerated.
* generated/minloc1_4_r10.c: Regenerated.
* generated/minloc1_8_i16.c: Regenerated.
* generated/maxloc1_4_r10.c: Regenerated.
* generated/maxloc1_8_i16.c: Regenerated.
* generated/minloc0_8_r10.c: Regenerated.
* generated/maxloc0_8_r10.c: Regenerated.
* generated/minloc1_16_r4.c: Regenerated.
* generated/maxloc1_16_r4.c: Regenerated.
* generated/minloc0_16_r8.c: Regenerated.
* generated/product_i8.c: Regenerated.
* generated/maxloc0_16_r8.c: Regenerated.
* generated/sum_i16.c: Regenerated.
* generated/count_2_l.c: Regenerated.
* generated/maxloc0_4_i8.c: Regenerated.
* generated/maxloc1_16_i16.c: Regenerated.
* generated/matmul_i4.c: Regenerated.
* generated/minloc1_8_r4.c: Regenerated.
* generated/sum_c8.c: Regenerated.
* generated/minloc1_16_i2.c: Regenerated.
* generated/maxloc1_16_i2.c: Regenerated.
* generated/maxval_i16.c: Regenerated.
* generated/spread_c8.c: Regenerated.
* generated/matmul_i16.c: Regenerated.
* generated/minloc1_4_i4.c: Regenerated.
* generated/maxval_i1.c: Regenerated.
* generated/minloc1_8_i2.c: Regenerated.
* generated/any_l1.c: Regenerated.
* generated/product_c16.c: Regenerated.
* generated/minloc0_8_r8.c: Regenerated.
* generated/matmul_l8.c: Regenerated.
* generated/product_r10.c: Regenerated.
* generated/product_i1.c: Regenerated.
* generated/all_l8.c: Regenerated.
* generated/maxloc0_4_i1.c: Regenerated.
* generated/minloc0_4_i8.c: Regenerated.
* generated/spread_c16.c: Regenerated.
* generated/maxval_r4.c: Regenerated.
Index: libgfortran/libgfortran.h
===================================================================
--- libgfortran/libgfortran.h (Revision 138565)
+++ libgfortran/libgfortran.h (Arbeitskopie)
@@ -102,17 +102,18 @@ typedef off_t gfc_offset;
#endif
#endif
/* On mingw, work around the buggy Windows snprintf() by using the one
mingw provides, __mingw_snprintf(). We also provide a prototype for
__mingw_snprintf(), because the mingw headers currently don't have one. */
#if HAVE_MINGW_SNPRINTF
-extern int __mingw_snprintf (char *, size_t, const char *, ...);
+extern int __mingw_snprintf (char *, size_t, const char *, ...)
+ __attribute__ ((format (printf, 3, 4)));
#undef snprintf
#define snprintf __mingw_snprintf
#endif
/* For a library, a standard prefix is a requirement in order to partition
the namespace. IPREFIX is for symbols intended to be internal to the
library. */
@@ -638,17 +639,18 @@ internal_proto(show_locus);
extern void runtime_error (const char *, ...)
__attribute__ ((noreturn, format (printf, 1, 2)));
iexport_proto(runtime_error);
extern void runtime_error_at (const char *, const char *, ...)
__attribute__ ((noreturn, format (printf, 2, 3)));
iexport_proto(runtime_error_at);
-extern void runtime_warning_at (const char *, const char *, ...);
+extern void runtime_warning_at (const char *, const char *, ...)
+ __attribute__ ((format (printf, 2, 3)));
iexport_proto(runtime_warning_at);
extern void internal_error (st_parameter_common *, const char *)
__attribute__ ((noreturn));
internal_proto(internal_error);
extern const char *get_oserror (void);
internal_proto(get_oserror);
Index: libgfortran/io/file_pos.c
===================================================================
--- libgfortran/io/file_pos.c (Revision 138565)
+++ libgfortran/io/file_pos.c (Arbeitskopie)
@@ -194,24 +194,25 @@ st_backspace (st_parameter_filepos *fpp)
{
generate_error (&fpp->common, LIBERROR_BAD_UNIT, NULL);
goto done;
}
/* Direct access is prohibited, and so is unformatted stream access. */
- if (u->flags.access == ACCESS_DIRECT)
+ if (__builtin_expect (u->flags.access == ACCESS_DIRECT, 0))
{
generate_error (&fpp->common, LIBERROR_OPTION_CONFLICT,
"Cannot BACKSPACE a file opened for DIRECT access");
goto done;
}
- if (u->flags.access == ACCESS_STREAM && u->flags.form == FORM_UNFORMATTED)
+ if (__builtin_expect (u->flags.access == ACCESS_STREAM
+ && u->flags.form == FORM_UNFORMATTED, 0))
{
generate_error (&fpp->common, LIBERROR_OPTION_CONFLICT,
"Cannot BACKSPACE an unformatted stream file");
goto done;
}
/* Make sure format buffer is flushed. */
fbuf_flush (u, 1);
@@ -275,17 +276,17 @@ st_endfile (st_parameter_filepos *fpp)
{
gfc_unit *u;
library_start (&fpp->common);
u = find_unit (fpp->common.unit);
if (u != NULL)
{
- if (u->flags.access == ACCESS_DIRECT)
+ if (__builtin_expect (u->flags.access == ACCESS_DIRECT, 0))
{
generate_error (&fpp->common, LIBERROR_OPTION_CONFLICT,
"Cannot perform ENDFILE on a file opened"
" for DIRECT access");
goto done;
}
/* If there are previously written bytes from a write with ADVANCE="no",
@@ -325,17 +326,17 @@ st_rewind (st_parameter_filepos *fpp)
{
gfc_unit *u;
library_start (&fpp->common);
u = find_unit (fpp->common.unit);
if (u != NULL)
{
- if (u->flags.access == ACCESS_DIRECT)
+ if (__builtin_expect (u->flags.access == ACCESS_DIRECT, 0))
generate_error (&fpp->common, LIBERROR_BAD_OPTION,
"Cannot REWIND a file opened for DIRECT access");
else
{
/* If there are previously written bytes from a write with ADVANCE="no",
add a record marker before performing the ENDFILE. */
if (u->previous_nonadvancing_write)
@@ -390,17 +391,17 @@ export_proto(st_flush);
void
st_flush (st_parameter_filepos *fpp)
{
gfc_unit *u;
library_start (&fpp->common);
u = find_unit (fpp->common.unit);
- if (u != NULL)
+ if (__builtin_expect (u != NULL, 1))
{
flush (u->s);
unlock_unit (u);
}
else
/* FLUSH on unconnected unit is illegal: F95 std., 9.3.5. */
generate_error (&fpp->common, LIBERROR_BAD_OPTION,
"Specified UNIT in FLUSH is not connected");
Index: libgfortran/io/open.c
===================================================================
--- libgfortran/io/open.c (Revision 138565)
+++ libgfortran/io/open.c (Arbeitskopie)
@@ -163,84 +163,89 @@ test_endfile (gfc_unit * u)
/* Change the modes of a file, those that are allowed * to be
changed. */
static void
edit_modes (st_parameter_open *opp, gfc_unit * u, unit_flags * flags)
{
/* Complain about attempts to change the unchangeable. */
- if (flags->status != STATUS_UNSPECIFIED && flags->status != STATUS_OLD &&
- u->flags.status != flags->status)
+ if (__builtin_expect (flags->status != STATUS_UNSPECIFIED
+ && flags->status != STATUS_OLD
+ && u->flags.status != flags->status, 0))
generate_error (&opp->common, LIBERROR_BAD_OPTION,
"Cannot change STATUS parameter in OPEN statement");
- if (flags->access != ACCESS_UNSPECIFIED && u->flags.access != flags->access)
+ if (__builtin_expect (flags->access != ACCESS_UNSPECIFIED
+ && u->flags.access != flags->access, 0))
generate_error (&opp->common, LIBERROR_BAD_OPTION,
"Cannot change ACCESS parameter in OPEN statement");
- if (flags->form != FORM_UNSPECIFIED && u->flags.form != flags->form)
+ if (__builtin_expect (flags->form != FORM_UNSPECIFIED
+ && u->flags.form != flags->form, 0))
generate_error (&opp->common, LIBERROR_BAD_OPTION,
"Cannot change FORM parameter in OPEN statement");
- if ((opp->common.flags & IOPARM_OPEN_HAS_RECL_IN)
- && opp->recl_in != u->recl)
+ if (__builtin_expect ((opp->common.flags & IOPARM_OPEN_HAS_RECL_IN)
+ && opp->recl_in != u->recl,0 ))
generate_error (&opp->common, LIBERROR_BAD_OPTION,
"Cannot change RECL parameter in OPEN statement");
- if (flags->action != ACTION_UNSPECIFIED && u->flags.action != flags->action)
+ if (__builtin_expect (flags->action != ACTION_UNSPECIFIED
+ && u->flags.action != flags->action, 0))
generate_error (&opp->common, LIBERROR_BAD_OPTION,
"Cannot change ACTION parameter in OPEN statement");
/* Status must be OLD if present. */
- if (flags->status != STATUS_UNSPECIFIED && flags->status != STATUS_OLD &&
- flags->status != STATUS_UNKNOWN)
+ if (__builtin_expect (flags->status != STATUS_UNSPECIFIED
+ && flags->status != STATUS_OLD
+ && flags->status != STATUS_UNKNOWN, 0))
{
if (flags->status == STATUS_SCRATCH)
notify_std (&opp->common, GFC_STD_GNU,
"OPEN statement must have a STATUS of OLD or UNKNOWN");
else
generate_error (&opp->common, LIBERROR_BAD_OPTION,
"OPEN statement must have a STATUS of OLD or UNKNOWN");
}
if (u->flags.form == FORM_UNFORMATTED)
{
- if (flags->delim != DELIM_UNSPECIFIED)
+ if (__builtin_expect (flags->delim != DELIM_UNSPECIFIED, 0))
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"DELIM parameter conflicts with UNFORMATTED form in "
"OPEN statement");
- if (flags->blank != BLANK_UNSPECIFIED)
+ if (__builtin_expect (flags->blank != BLANK_UNSPECIFIED, 0))
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"BLANK parameter conflicts with UNFORMATTED form in "
"OPEN statement");
- if (flags->pad != PAD_UNSPECIFIED)
+ if (__builtin_expect (flags->pad != PAD_UNSPECIFIED, 0))
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"PAD parameter conflicts with UNFORMATTED form in "
"OPEN statement");
- if (flags->decimal != DECIMAL_UNSPECIFIED)
+ if (__builtin_expect (flags->decimal != DECIMAL_UNSPECIFIED, 0))
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"DECIMAL parameter conflicts with UNFORMATTED form in "
"OPEN statement");
- if (flags->encoding != ENCODING_UNSPECIFIED)
+ if (__builtin_expect (flags->encoding != ENCODING_UNSPECIFIED, 0))
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"ENCODING parameter conflicts with UNFORMATTED form in "
"OPEN statement");
- if (flags->round != ROUND_UNSPECIFIED)
+ if (__builtin_expect (flags->round != ROUND_UNSPECIFIED, 0))
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"ROUND parameter conflicts with UNFORMATTED form in "
"OPEN statement");
- if (flags->sign != SIGN_UNSPECIFIED)
+ if (__builtin_expect (flags->sign != SIGN_UNSPECIFIED, 0))
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"SIGN parameter conflicts with UNFORMATTED form in "
"OPEN statement");
}
if ((opp->common.flags & IOPARM_LIBRETURN_MASK) == IOPARM_LIBRETURN_OK)
{
/* Change the changeable: */
@@ -326,108 +331,109 @@ new_unit (st_parameter_open *opp, gfc_un
flags->status = STATUS_UNKNOWN;
/* Checks. */
if (flags->delim == DELIM_UNSPECIFIED)
flags->delim = DELIM_NONE;
else
{
- if (flags->form == FORM_UNFORMATTED)
+ if (__builtin_expect (flags->form == FORM_UNFORMATTED, 0))
{
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"DELIM parameter conflicts with UNFORMATTED form in "
"OPEN statement");
goto fail;
}
}
if (flags->blank == BLANK_UNSPECIFIED)
flags->blank = BLANK_NULL;
else
{
- if (flags->form == FORM_UNFORMATTED)
+ if (__builtin_expect (flags->form == FORM_UNFORMATTED, 0))
{
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"BLANK parameter conflicts with UNFORMATTED form in "
"OPEN statement");
goto fail;
}
}
if (flags->pad == PAD_UNSPECIFIED)
flags->pad = PAD_YES;
else
{
- if (flags->form == FORM_UNFORMATTED)
+ if (__builtin_expect (flags->form == FORM_UNFORMATTED, 0))
{
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"PAD parameter conflicts with UNFORMATTED form in "
"OPEN statement");
goto fail;
}
}
if (flags->decimal == DECIMAL_UNSPECIFIED)
flags->decimal = DECIMAL_POINT;
else
{
- if (flags->form == FORM_UNFORMATTED)
+ if (__builtin_expect (flags->form == FORM_UNFORMATTED, 0))
{
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"DECIMAL parameter conflicts with UNFORMATTED form "
"in OPEN statement");
goto fail;
}
}
if (flags->encoding == ENCODING_UNSPECIFIED)
flags->encoding = ENCODING_DEFAULT;
else
{
- if (flags->form == FORM_UNFORMATTED)
+ if (__builtin_expect (flags->form == FORM_UNFORMATTED, 0))
{
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"ENCODING parameter conflicts with UNFORMATTED form in "
"OPEN statement");
goto fail;
}
}
/* NB: the value for ROUND when it's not specified by the user does not
have to be PROCESSOR_DEFINED; the standard says that it is
processor dependent, and requires that it is one of the
possible value (see F2003, 9.4.5.13). */
if (flags->round == ROUND_UNSPECIFIED)
flags->round = ROUND_PROCDEFINED;
else
{
- if (flags->form == FORM_UNFORMATTED)
+ if (__builtin_expect (flags->form == FORM_UNFORMATTED, 0))
{
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"ROUND parameter conflicts with UNFORMATTED form in "
"OPEN statement");
goto fail;
}
}
if (flags->sign == SIGN_UNSPECIFIED)
flags->sign = SIGN_PROCDEFINED;
else
{
- if (flags->form == FORM_UNFORMATTED)
+ if (__builtin_expect (flags->form == FORM_UNFORMATTED, 0))
{
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"SIGN parameter conflicts with UNFORMATTED form in "
"OPEN statement");
goto fail;
}
}
- if (flags->position != POSITION_ASIS && flags->access == ACCESS_DIRECT)
+ if (__builtin_expect (flags->position != POSITION_ASIS
+ && flags->access == ACCESS_DIRECT, 0))
{
generate_error (&opp->common, LIBERROR_OPTION_CONFLICT,
"ACCESS parameter conflicts with SEQUENTIAL access in "
"OPEN statement");
goto fail;
}
else
if (flags->position == POSITION_UNSPECIFIED)
@@ -436,27 +442,28 @@ new_unit (st_parameter_open *opp, gfc_un
if (flags->access == ACCESS_DIRECT
&& (opp->common.flags & IOPARM_OPEN_HAS_RECL_IN) == 0)
{
generate_error (&opp->common, LIBERROR_MISSING_OPTION,
"Missing RECL parameter in OPEN statement");
goto fail;
}
- if ((opp->common.flags & IOPARM_OPEN_HAS_RECL_IN) && opp->recl_in <= 0)
+ if (__builtin_expect ((opp->common.flags & IOPARM_OPEN_HAS_RECL_IN)
+ && opp->recl_in <= 0, 0))
{
generate_error (&opp->common, LIBERROR_BAD_OPTION,
"RECL parameter is non-positive in OPEN statement");
goto fail;
}
switch (flags->status)
{
case STATUS_SCRATCH:
- if ((opp->common.flags & IOPARM_OPEN_HAS_FILE) == 0)
+ if (__builtin_expect ((opp->common.flags & IOPARM_OPEN_HAS_FILE) == 0, 1))
{
opp->file = NULL;
break;
}
generate_error (&opp->common, LIBERROR_BAD_OPTION,
"FILE parameter must not be present in OPEN statement");
goto fail;
@@ -552,17 +559,17 @@ new_unit (st_parameter_open *opp, gfc_un
u->current_record = 0;
u->mode = READING;
u->maxrec = 0;
u->bytes_left = 0;
u->saved_pos = 0;
if (flags->position == POSITION_APPEND)
{
- if (sseek (u->s, file_length (u->s)) == FAILURE)
+ if (__builtin_expect (sseek (u->s, file_length (u->s)) == FAILURE, 0))
generate_error (&opp->common, LIBERROR_OS, NULL);
u->endfile = AT_ENDFILE;
}
/* Unspecified recl ends up with a processor dependent value. */
if ((opp->common.flags & IOPARM_OPEN_HAS_RECL_IN))
{
@@ -676,17 +683,17 @@ already_open (st_parameter_open *opp, gf
char *path = NULL;
if (u->file && u->flags.status == STATUS_SCRATCH)
{
path = (char *) gfc_alloca (u->file_len + 1);
unpack_filename (path, u->file, u->file_len);
}
#endif
- if (sclose (u->s) == FAILURE)
+ if (__builtin_expect (sclose (u->s) == FAILURE, 0))
{
unlock_unit (u);
generate_error (&opp->common, LIBERROR_OS,
"Error closing file in OPEN statement");
return;
}
u->s = NULL;
@@ -813,29 +820,29 @@ st_open (st_parameter_open *opp)
default:
internal_error (&opp->common, "Illegal value for CONVERT");
break;
}
flags.convert = conv;
- if (opp->common.unit < 0)
+ if (__builtin_expect (opp->common.unit < 0, 0))
generate_error (&opp->common, LIBERROR_BAD_OPTION,
"Bad unit number in OPEN statement");
- if (flags.position != POSITION_UNSPECIFIED
- && flags.access == ACCESS_DIRECT)
+ if (__builtin_expect (flags.position != POSITION_UNSPECIFIED
+ && flags.access == ACCESS_DIRECT, 0))
generate_error (&opp->common, LIBERROR_BAD_OPTION,
"Cannot use POSITION with direct access files");
if (flags.access == ACCESS_APPEND)
{
- if (flags.position != POSITION_UNSPECIFIED
- && flags.position != POSITION_APPEND)
+ if (__builtin_expect (flags.position != POSITION_UNSPECIFIED
+ && flags.position != POSITION_APPEND, 0))
generate_error (&opp->common, LIBERROR_BAD_OPTION,
"Conflicting ACCESS and POSITION flags in"
" OPEN statement");
notify_std (&opp->common, GFC_STD_GNU,
"Extension: APPEND as a value for ACCESS in OPEN statement");
flags.access = ACCESS_SEQUENTIAL;
flags.position = POSITION_APPEND;
Index: libgfortran/intrinsics/dtime.c
===================================================================
--- libgfortran/intrinsics/dtime.c (Revision 138565)
+++ libgfortran/intrinsics/dtime.c (Arbeitskopie)
@@ -42,21 +42,22 @@ iexport_proto(dtime_sub);
void
dtime_sub (gfc_array_r4 *t, GFC_REAL_4 *result)
{
static GFC_REAL_4 tu = 0.0, ts = 0.0, tt = 0.0;
GFC_REAL_4 *tp;
long user_sec, user_usec, system_sec, system_usec;
- if (((t->dim[0].ubound + 1 - t->dim[0].lbound)) < 2)
+ if ((t->dim[0].ubound + 1 - t->dim[0].lbound) < 2)
runtime_error ("Insufficient number of elements in TARRAY.");
__gthread_mutex_lock (&dtime_update_lock);
- if (__time_1 (&user_sec, &user_usec, &system_sec, &system_usec) == 0)
+ if (__builtin_expect (__time_1 (&user_sec, &user_usec, &system_sec,
+ &system_usec) == 0, 1))
{
tu = (GFC_REAL_4)(user_sec + 1.e-6 * user_usec) - tu;
ts = (GFC_REAL_4)(system_sec + 1.e-6 * system_usec) - ts;
tt = tu + ts;
}
else
{
tu = (GFC_REAL_4)-1.0;
Index: libgfortran/intrinsics/pack_generic.c
===================================================================
--- libgfortran/intrinsics/pack_generic.c (Revision 138565)
+++ libgfortran/intrinsics/pack_generic.c (Arbeitskopie)
@@ -201,17 +201,17 @@ pack_internal (gfc_array_char *ret, cons
{
count[n]++;
m += mstride[n];
}
}
}
}
- if (ret->data == NULL)
+ if (__builtin_expect (ret->data == NULL, 1))
{
/* Setup the array descriptor. */
ret->dim[0].lbound = 0;
ret->dim[0].ubound = total - 1;
ret->dim[0].stride = 1;
ret->offset = 0;
if (total == 0)
Index: libgfortran/intrinsics/etime.c
===================================================================
--- libgfortran/intrinsics/etime.c (Revision 138565)
+++ libgfortran/intrinsics/etime.c (Arbeitskopie)
@@ -35,20 +35,21 @@ extern void etime_sub (gfc_array_r4 *t,
iexport_proto(etime_sub);
void
etime_sub (gfc_array_r4 *t, GFC_REAL_4 *result)
{
GFC_REAL_4 tu, ts, tt, *tp;
long user_sec, user_usec, system_sec, system_usec;
- if (((t->dim[0].ubound + 1 - t->dim[0].lbound)) < 2)
+ if ((t->dim[0].ubound + 1 - t->dim[0].lbound) < 2)
runtime_error ("Insufficient number of elements in TARRAY.");
- if (__time_1 (&user_sec, &user_usec, &system_sec, &system_usec) == 0)
+ if (__builtin_expect (__time_1 (&user_sec, &user_usec, &system_sec,
+ &system_usec) == 0, 1))
{
tu = (GFC_REAL_4)(user_sec + 1.e-6 * user_usec);
ts = (GFC_REAL_4)(system_sec + 1.e-6 * system_usec);
tt = tu + ts;
}
else
{
tu = (GFC_REAL_4)-1.0;
Index: libgfortran/intrinsics/spread_generic.c
===================================================================
--- libgfortran/intrinsics/spread_generic.c (Revision 138565)
+++ libgfortran/intrinsics/spread_generic.c (Arbeitskopie)
@@ -113,17 +113,17 @@ spread_internal (gfc_array_char *ret, co
int zero_sized;
zero_sized = 0;
dim = 0;
if (GFC_DESCRIPTOR_RANK(ret) != rrank)
runtime_error ("rank mismatch in spread()");
- if (compile_options.bounds_check)
+ if (__builtin_expect (compile_options.bounds_check, 0))
{
for (n = 0; n < rrank; n++)
{
index_type ret_extent;
ret_extent = ret->dim[n].ubound + 1 - ret->dim[n].lbound;
if (n == *along - 1)
{
Index: libgfortran/intrinsics/random.c
===================================================================
--- libgfortran/intrinsics/random.c (Revision 138565)
+++ libgfortran/intrinsics/random.c (Arbeitskopie)
@@ -442,17 +442,17 @@ arandom_r8 (gfc_array_r8 *x)
dim = GFC_DESCRIPTOR_RANK (x);
for (n = 0; n < dim; n++)
{
count[n] = 0;
stride[n] = x->dim[n].stride;
extent[n] = x->dim[n].ubound + 1 - x->dim[n].lbound;
- if (extent[n] <= 0)
+ if (__builtin_expect (extent[n] <= 0, 0))
return;
}
stride0 = stride[0];
__gthread_mutex_lock (&random_lock);
while (dest)
@@ -512,17 +512,17 @@ arandom_r10 (gfc_array_r10 *x)
dim = GFC_DESCRIPTOR_RANK (x);
for (n = 0; n < dim; n++)
{
count[n] = 0;
stride[n] = x->dim[n].stride;
extent[n] = x->dim[n].ubound + 1 - x->dim[n].lbound;
- if (extent[n] <= 0)
+ if (__builtin_expect (extent[n] <= 0, 0))
return;
}
stride0 = stride[0];
__gthread_mutex_lock (&random_lock);
while (dest)
@@ -584,17 +584,17 @@ arandom_r16 (gfc_array_r16 *x)
dim = GFC_DESCRIPTOR_RANK (x);
for (n = 0; n < dim; n++)
{
count[n] = 0;
stride[n] = x->dim[n].stride;
extent[n] = x->dim[n].ubound + 1 - x->dim[n].lbound;
- if (extent[n] <= 0)
+ if (__builtin_expect (extent[n] <= 0, 0))
return;
}
stride0 = stride[0];
__gthread_mutex_lock (&random_lock);
while (dest)
Index: libgfortran/intrinsics/args.c
===================================================================
--- libgfortran/intrinsics/args.c (Revision 138565)
+++ libgfortran/intrinsics/args.c (Arbeitskopie)
@@ -42,17 +42,17 @@ void
getarg_i4 (GFC_INTEGER_4 *pos, char *val, gfc_charlen_type val_len)
{
int argc;
int arglen;
char **argv;
get_args (&argc, &argv);
- if (val_len < 1 || !val )
+ if (__builtin_expect (val_len < 1 || !val, 0))
return; /* something is wrong , leave immediately */
memset (val, ' ', val_len);
if ((*pos) + 1 <= argc && *pos >=0 )
{
arglen = strlen (argv[*pos]);
if (arglen > val_len)
@@ -122,33 +122,33 @@ iexport_proto(get_command_argument_i4);
void
get_command_argument_i4 (GFC_INTEGER_4 *number, char *value,
GFC_INTEGER_4 *length, GFC_INTEGER_4 *status,
gfc_charlen_type value_len)
{
int argc, arglen = 0, stat_flag = GFC_GC_SUCCESS;
char **argv;
- if (number == NULL )
+ if (number == NULL)
/* Should never happen. */
runtime_error ("Missing argument to get_command_argument");
if (value == NULL && length == NULL && status == NULL)
return; /* No need to do anything. */
get_args (&argc, &argv);
- if (*number < 0 || *number >= argc)
+ if (__builtin_expect (*number < 0 || *number >= argc, 0))
stat_flag = GFC_GC_FAILURE;
else
arglen = strlen(argv[*number]);
if (value != NULL)
{
- if (value_len < 1)
+ if (__builtin_expect (value_len < 1, 0))
stat_flag = GFC_GC_FAILURE;
else
memset (value, ' ', value_len);
}
if (value != NULL && stat_flag != GFC_GC_FAILURE)
{
if (arglen > value_len)
@@ -210,17 +210,17 @@ get_command_i4 (char *command, GFC_INTEG
if (command == NULL && length == NULL && status == NULL)
return; /* No need to do anything. */
get_args (&argc, &argv);
if (command != NULL)
{
/* Initialize the string to blanks. */
- if (command_len < 1)
+ if (__builtin_expect (command_len < 1, 0))
stat_flag = GFC_GC_FAILURE;
else
memset (command, ' ', command_len);
}
for (i = 0; i < argc ; i++)
{
arglen = strlen(argv[i]);
Index: libgfortran/m4/spread.m4
===================================================================
--- libgfortran/m4/spread.m4 (Revision 138565)
+++ libgfortran/m4/spread.m4 (Arbeitskopie)
@@ -117,17 +117,17 @@ spread_'rtype_code` ('rtype` *ret, const
int zero_sized;
zero_sized = 0;
dim = 0;
if (GFC_DESCRIPTOR_RANK(ret) != rrank)
runtime_error ("rank mismatch in spread()");
- if (compile_options.bounds_check)
+ if (__builtin_expect (compile_options.bounds_check, 0))
{
for (n = 0; n < rrank; n++)
{
index_type ret_extent;
ret_extent = ret->dim[n].ubound + 1 - ret->dim[n].lbound;
if (n == along - 1)
{
Index: libgfortran/m4/iforeach.m4
===================================================================
--- libgfortran/m4/iforeach.m4 (Revision 138565)
+++ libgfortran/m4/iforeach.m4 (Arbeitskopie)
@@ -31,17 +31,17 @@ name`'rtype_qual`_'atype_code (rtype * c
retarray->dim[0].ubound = rank-1;
retarray->dim[0].stride = 1;
retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
retarray->offset = 0;
retarray->data = internal_malloc_size (sizeof (rtype_name) * rank);
}
else
{
- if (compile_options.bounds_check)
+ if (__builtin_expect (compile_options.bounds_check, 0))
{
int ret_rank;
index_type ret_extent;
ret_rank = GFC_DESCRIPTOR_RANK (retarray);
if (ret_rank != 1)
runtime_error ("rank of return array in u_name intrinsic"
" should be 1, is %ld", (long int) ret_rank);
@@ -147,17 +147,17 @@ void
retarray->dim[0].ubound = rank-1;
retarray->dim[0].stride = 1;
retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
retarray->offset = 0;
retarray->data = internal_malloc_size (sizeof (rtype_name) * rank);
}
else
{
- if (compile_options.bounds_check)
+ if (__builtin_expect (compile_options.bounds_check, 0))
{
int ret_rank, mask_rank;
index_type ret_extent;
int n;
index_type array_extent, mask_extent;
ret_rank = GFC_DESCRIPTOR_RANK (retarray);
if (ret_rank != 1)
@@ -306,17 +306,17 @@ void
retarray->dim[0].ubound = rank-1;
retarray->dim[0].stride = 1;
retarray->dtype = (retarray->dtype & ~GFC_DTYPE_RANK_MASK) | 1;
retarray->offset = 0;
retarray->data = internal_malloc_size (sizeof (rtype_name) * rank);
}
else
{
- if (compile_options.bounds_check)
+ if (__builtin_expect (compile_options.bounds_check, 0))
{
int ret_rank;
index_type ret_extent;
ret_rank = GFC_DESCRIPTOR_RANK (retarray);
if (ret_rank != 1)
runtime_error ("rank of return array in u_name intrinsic"
" should be 1, is %ld", (long int) ret_rank);
Index: libgfortran/m4/matmull.m4
===================================================================
--- libgfortran/m4/matmull.m4 (Revision 138565)
+++ libgfortran/m4/matmull.m4 (Arbeitskopie)
@@ -95,17 +95,17 @@ matmul_'rtype_code` ('rtype` * const res
retarray->dim[1].ubound = b->dim[1].ubound - b->dim[1].lbound;
retarray->dim[1].stride = retarray->dim[0].ubound+1;
}
retarray->data
= internal_malloc_size (sizeof ('rtype_name`) * size0 ((array_t *) retarray));
retarray->offset = 0;
}
- else if (compile_options.bounds_check)
+ else if (__builtin_expect (compile_options.bounds_check, 0))
{
index_type ret_extent, arg_extent;
if (GFC_DESCRIPTOR_RANK (a) == 1)
{
arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
if (arg_extent != ret_extent)
Index: libgfortran/m4/ifunction_logical.m4
===================================================================
--- libgfortran/m4/ifunction_logical.m4 (Revision 138565)
+++ libgfortran/m4/ifunction_logical.m4 (Arbeitskopie)
@@ -105,17 +105,17 @@ name`'rtype_qual`_'atype_code (rtype * c
else
{
if (rank != GFC_DESCRIPTOR_RANK (retarray))
runtime_error ("rank of return array incorrect in"
" u_name intrinsic: is %ld, should be %ld",
(long int) GFC_DESCRIPTOR_RANK (retarray),
(long int) rank);
- if (compile_options.bounds_check)
+ if (__builtin_expect (compile_options.bounds_check, 0))
{
for (n=0; n < rank; n++)
{
index_type ret_extent;
ret_extent = retarray->dim[n].ubound + 1
- retarray->dim[n].lbound;
if (extent[n] != ret_extent)
Index: libgfortran/m4/ifunction.m4
===================================================================
--- libgfortran/m4/ifunction.m4 (Revision 138565)
+++ libgfortran/m4/ifunction.m4 (Arbeitskopie)
@@ -101,17 +101,17 @@ name`'rtype_qual`_'atype_code (rtype * c
else
{
if (rank != GFC_DESCRIPTOR_RANK (retarray))
runtime_error ("rank of return array incorrect in"
" u_name intrinsic: is %ld, should be %ld",
(long int) (GFC_DESCRIPTOR_RANK (retarray)),
(long int) rank);
- if (compile_options.bounds_check)
+ if (__builtin_expect (compile_options.bounds_check, 0))
{
for (n=0; n < rank; n++)
{
index_type ret_extent;
ret_extent = retarray->dim[n].ubound + 1
- retarray->dim[n].lbound;
if (extent[n] != ret_extent)
@@ -289,17 +289,17 @@ void
retarray->data = internal_malloc_size (alloc_size);
}
else
{
if (rank != GFC_DESCRIPTOR_RANK (retarray))
runtime_error ("rank of return array incorrect in u_name intrinsic");
- if (compile_options.bounds_check)
+ if (__builtin_expect (compile_options.bounds_check, 0))
{
for (n=0; n < rank; n++)
{
index_type ret_extent;
ret_extent = retarray->dim[n].ubound + 1
- retarray->dim[n].lbound;
if (extent[n] != ret_extent)
@@ -473,17 +473,17 @@ void
else
{
if (rank != GFC_DESCRIPTOR_RANK (retarray))
runtime_error ("rank of return array incorrect in"
" u_name intrinsic: is %ld, should be %ld",
(long int) (GFC_DESCRIPTOR_RANK (retarray)),
(long int) rank);
- if (compile_options.bounds_check)
+ if (__builtin_expect (compile_options.bounds_check, 0))
{
for (n=0; n < rank; n++)
{
index_type ret_extent;
ret_extent = retarray->dim[n].ubound + 1
- retarray->dim[n].lbound;
if (extent[n] != ret_extent)
Index: libgfortran/m4/matmul.m4
===================================================================
--- libgfortran/m4/matmul.m4 (Revision 138565)
+++ libgfortran/m4/matmul.m4 (Arbeitskopie)
@@ -131,17 +131,17 @@ matmul_'rtype_code` ('rtype` * const res
retarray->dim[1].ubound = b->dim[1].ubound - b->dim[1].lbound;
retarray->dim[1].stride = retarray->dim[0].ubound+1;
}
retarray->data
= internal_malloc_size (sizeof ('rtype_name`) * size0 ((array_t *) retarray));
retarray->offset = 0;
}
- else if (compile_options.bounds_check)
+ else if (__builtin_expect (compile_options.bounds_check, 0))
{
index_type ret_extent, arg_extent;
if (GFC_DESCRIPTOR_RANK (a) == 1)
{
arg_extent = b->dim[1].ubound + 1 - b->dim[1].lbound;
ret_extent = retarray->dim[0].ubound + 1 - retarray->dim[0].lbound;
if (arg_extent != ret_extent)