This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]