[Fortran] RFC / RFA patch for using build_predict_expr instead of builtin_expect / PR 58721

Tobias Burnus burnus@net-b.de
Sun Dec 15 20:59:00 GMT 2013


Jan Hubicka wrote:
> Yep, they should not roduce incorrect code. Isn't the problem
> that you expect the whole expression to have value and predit_expr
> "reutrns" nothing?
> Can you check what lands into gimple?

That could well be the case – I replace "0" by "{ built_predict; 0 }" 
and I wouldn't be surprised if the built_predict causes problem as it 
returns 'nothing'. At least the basic block belonging to "else" 
(<D.1934>) is empty:

Original dump (4.8 and 4.9 with predict patch):
           sub1 (&v[S.0 + -1], (logical(kind=4)) __builtin_expect 
((integer(kind=8)) (D.1897 == 0B), 0) ? 0B : &(*D.1897)[(S.0 + D.1901) * 
D.1903 + D.1898]);
and
           sub1 (&v[S.0 + -1], D.1917 != 0B ? &(*D.1917)[(S.0 + D.1921) 
* D.1923 + D.1918] : (void) 0);

Gimple of 4.8:
       if (D.1916 != 0) goto <D.1917>; else goto <D.1918>;
       <D.1917>:
       iftmp.2 = 0B;
       goto <D.1919>;
       <D.1918>:
...
       iftmp.2 = &*D.1897[D.1922];
       <D.1919>:
..
       sub1 (D.1924, iftmp.2);

gimple of 4.9 with patch:
       if (D.1917 != 0B) goto <D.1933>; else goto <D.1934>;
       <D.1933>:
       D.1935 = S.0 + D.1921;
       D.1936 = D.1935 * D.1923;
       D.1937 = D.1936 + D.1918;
       iftmp.2 = &*D.1917[D.1937];
       goto <D.1938>;
       <D.1934>:
       <D.1938>:
       D.1939 = S.0 + -1;
       D.1940 = &v[D.1939];
       sub1 (D.1940, iftmp.2);

Tobias

PS: That's for the code:

   implicit none
   type t2
     integer, allocatable :: a
     integer, pointer :: p2(:) => null()
   end type t2
   type(t2), save :: x
   integer, save :: s, v(2)
   call sub1 (v, x%p2)
contains
   elemental subroutine sub1 (x, y)
     integer, intent(inout) :: x
     integer, intent(in), optional :: y
   end subroutine sub1
end



More information about the Fortran mailing list