[PATCH] Add un-distribution capabilities to tree reassoc (3rd try)

Xinliang David Li davidxl@google.com
Thu Aug 14 21:37:00 GMT 2008


>>>          lhs = gimple_assign_lhs (stmt);
>>>          rhs1 = gimple_assign_rhs1 (stmt);
>>> --- 1760,1775 ----
>>>          /* If this was part of an already processed statement,
>>>             we don't need to touch it again. */
>>>          if (gimple_visited_p (stmt))
>>> !           {
>>> !             /* This statement might have become dead because of previous
>>> !                reassociations.  */
>>> !             if (has_zero_uses (gimple_get_lhs (stmt)))
>>> !               {
>>> !                 gsi_remove (&gsi, true);
>>> !                 release_defs (stmt);

There seem to be a minor problem -- there needs to be an gsi_end_p check 
   and break after the removal.

Thanks,

David


>>> !               }
>>> !             continue;
>>> !           }
>>>
>>>          lhs = gimple_assign_lhs (stmt);
>>>          rhs1 = gimple_assign_rhs1 (stmt);
>>> *************** reassociate_bb (basic_block bb)
>>> *** 1375,1386 ****
>>>                continue;
>>>
>>>              gimple_set_visited (stmt, true);
>>> !             linearize_expr_tree (&ops, stmt);
>>>              qsort (VEC_address (operand_entry_t, ops),
>>>                     VEC_length (operand_entry_t, ops),
>>>                     sizeof (operand_entry_t),
>>>                     sort_by_operand_rank);
>>>              optimize_ops_list (rhs_code, &ops);
>>>
>>>              if (VEC_length (operand_entry_t, ops) == 1)
>>>                {
>>> --- 1800,1820 ----
>>>                continue;
>>>
>>>              gimple_set_visited (stmt, true);
>>> !             linearize_expr_tree (&ops, stmt, true);
>>>              qsort (VEC_address (operand_entry_t, ops),
>>>                     VEC_length (operand_entry_t, ops),
>>>                     sizeof (operand_entry_t),
>>>                     sort_by_operand_rank);
>>>              optimize_ops_list (rhs_code, &ops);
>>> +             if (undistribute_ops_list (rhs_code, &ops,
>>> +                                        loop_containing_stmt (stmt)))
>>> +               {
>>> +                 qsort (VEC_address (operand_entry_t, ops),
>>> +                        VEC_length (operand_entry_t, ops),
>>> +                        sizeof (operand_entry_t),
>>> +                        sort_by_operand_rank);
>>> +                 optimize_ops_list (rhs_code, &ops);
>>> +               }
>>>
>>>              if (VEC_length (operand_entry_t, ops) == 1)
>>>                {
>>> Index: gcc/testsuite/gcc.dg/tree-ssa/reassoc-14.c
>>> ===================================================================
>>> *** /dev/null   1970-01-01 00:00:00.000000000 +0000
>>> --- gcc/testsuite/gcc.dg/tree-ssa/reassoc-14.c  2008-08-07 11:27:42.000000000 +0200
>>> ***************
>>> *** 0 ****
>>> --- 1,23 ----
>>> + /* { dg-do compile } */
>>> + /* { dg-options "-O2 -fdump-tree-reassoc1" } */
>>> +
>>> + int test1 (int x, int y, int z, int weight)
>>> + {
>>> +   int tmp1 = x * weight;
>>> +   int tmp2 = y * weight;
>>> +   int tmp3 = (x - y) * weight;
>>> +   return tmp1 + (tmp2 + tmp3);
>>> + }
>>> +
>>> + int test2 (int x, int y, int z, int weight)
>>> + {
>>> +   int tmp1 = x * weight;
>>> +   int tmp2 = y * weight * weight;
>>> +   int tmp3 = z * weight * weight * weight;
>>> +   return tmp1 + tmp2 + tmp3;
>>> + }
>>> +
>>> + /* There should be one multiplication left in test1 and three in test2.  */
>>> +
>>> + /* { dg-final { scan-tree-dump-times "\\\*" 4 "reassoc1" } } */
>>> + /* { dg-final { cleanup-tree-dump "reassoc1" } } */
>>> Index: gcc/testsuite/gcc.dg/tree-ssa/reassoc-15.c
>>> ===================================================================
>>> *** /dev/null   1970-01-01 00:00:00.000000000 +0000
>>> --- gcc/testsuite/gcc.dg/tree-ssa/reassoc-15.c  2008-08-07 11:27:42.000000000 +0200
>>> ***************
>>> *** 0 ****
>>> --- 1,19 ----
>>> + /* { dg-do compile } */
>>> + /* { dg-options "-O2 -fdump-tree-reassoc1" } */
>>> +
>>> + int test3 (int x, int y, int z, int weight, int w1, int w2, int w3)
>>> + {
>>> +   int wtmp1 = w1 * weight;
>>> +   int wtmp2 = w2 * weight;
>>> +   int wtmp3 = w3 * weight;
>>> +   int tmp1 = x * wtmp1;
>>> +   int tmp2 = y * wtmp2;
>>> +   int tmp3 = z * wtmp3;
>>> +   return tmp1 + tmp2 + tmp3;
>>> + }
>>> +
>>> + /* The multiplication with weight should be un-distributed.
>>> +    ???  This pattern is not recognized currently.  */
>>> +
>>> + /* { dg-final { scan-tree-dump-times "\\\*" 4 "reassoc1" } } */
>>> + /* { dg-final { cleanup-tree-dump "reassoc1" } } */
>>> Index: gcc/testsuite/gcc.dg/tree-ssa/reassoc-16.c
>>> ===================================================================
>>> *** /dev/null   1970-01-01 00:00:00.000000000 +0000
>>> --- gcc/testsuite/gcc.dg/tree-ssa/reassoc-16.c  2008-08-07 11:27:42.000000000 +0200
>>> ***************
>>> *** 0 ****
>>> --- 1,16 ----
>>> + /* { dg-do compile } */
>>> + /* { dg-options "-O2 -ffast-math -fdump-tree-reassoc1" } */
>>> +
>>> + double test1 (double x, double y, double z, double weight)
>>> + {
>>> +   double tmp1 = x / weight;
>>> +   double tmp2 = y / weight;
>>> +   double tmp3 = -x / weight;
>>> +   return tmp1 + tmp2 + tmp3;
>>> + }
>>> +
>>> + /* The division should be un-distributed and all references to x should
>>> +    be gone.  */
>>> +
>>> + /* { dg-final { scan-tree-dump-times "/" 1 "reassoc1" } } */
>>> + /* { dg-final { cleanup-tree-dump "reassoc1" } } */
>>> Index: gcc/testsuite/gcc.dg/torture/reassoc-1.c
>>> ===================================================================
>>> *** /dev/null   1970-01-01 00:00:00.000000000 +0000
>>> --- gcc/testsuite/gcc.dg/torture/reassoc-1.c    2008-08-07 11:27:42.000000000 +0200
>>> ***************
>>> *** 0 ****
>>> --- 1,24 ----
>>> + /* { dg-do run } */
>>> +
>>> + int x;
>>> +
>>> + int __attribute__((noinline))
>>> + foo(int a, int b, int w)
>>> + {
>>> +   int tmp1 = a * w;
>>> +   int tmp2 = b * w;
>>> +   x = tmp1;
>>> +   return tmp1 + tmp2;
>>> + }
>>> +
>>> + extern void abort (void);
>>> +
>>> + int main()
>>> + {
>>> +   if (foo(1, 2, 3) != 9)
>>> +     abort ();
>>> +   if (x != 3)
>>> +     abort ();
>>> +   return 0;
>>> + }
>>> +
>>> Index: gcc/testsuite/gcc.dg/tree-ssa/recip-2.c
>>> ===================================================================
>>> *** gcc/testsuite/gcc.dg/tree-ssa/recip-2.c.orig        2008-08-07 11:20:19.000000000 +0200
>>> --- gcc/testsuite/gcc.dg/tree-ssa/recip-2.c     2008-08-07 11:27:42.000000000 +0200
>>> ***************
>>> *** 1,7 ****
>>>  /* { dg-do compile } */
>>>  /* { dg-options "-O1 -funsafe-math-optimizations -fdump-tree-recip" } */
>>>
>>> ! float e(float a, float b, float c, float d, float e, float f)
>>>  {
>>>    if (a < b)
>>>      {
>>> --- 1,9 ----
>>>  /* { dg-do compile } */
>>>  /* { dg-options "-O1 -funsafe-math-optimizations -fdump-tree-recip" } */
>>>
>>> ! float u, v, w, x, y, z;
>>> !
>>> ! void e(float a, float b, float c, float d, float e, float f)
>>>  {
>>>    if (a < b)
>>>      {
>>> *************** float e(float a, float b, float c, float
>>> *** 20,26 ****
>>>    /* This should not be left as a multiplication.  */
>>>    c = 1 / c;
>>>
>>> !   return a + b + c + d + e + f;
>>>  }
>>>
>>>  /* { dg-final { scan-tree-dump-times " / " 2 "recip" } } */
>>> --- 22,33 ----
>>>    /* This should not be left as a multiplication.  */
>>>    c = 1 / c;
>>>
>>> !   u = a;
>>> !   v = b;
>>> !   w = c;
>>> !   x = d;
>>> !   y = e;
>>> !   z = f;
>>>  }
>>>
>>>  /* { dg-final { scan-tree-dump-times " / " 2 "recip" } } */
>>> Index: gcc/testsuite/gcc.dg/tree-ssa/recip-6.c
>>> ===================================================================
>>> *** gcc/testsuite/gcc.dg/tree-ssa/recip-6.c.orig        2008-08-07 11:20:19.000000000 +0200
>>> --- gcc/testsuite/gcc.dg/tree-ssa/recip-6.c     2008-08-07 11:27:42.000000000 +0200
>>> ***************
>>> *** 5,11 ****
>>>
>>>  extern int f2();
>>>
>>> ! double f1(double y, double z, double w)
>>>  {
>>>    double b, c, d, e, f;
>>>
>>> --- 5,13 ----
>>>
>>>  extern int f2();
>>>
>>> ! double m, n, o;
>>> !
>>> ! void f1(double y, double z, double w)
>>>  {
>>>    double b, c, d, e, f;
>>>
>>> *************** double f1(double y, double z, double w)
>>> *** 18,24 ****
>>>    e = c / y;
>>>    f = 1 / y;
>>>
>>> !   return d + e + f;
>>>  }
>>>
>>>  /* { dg-final { scan-tree-dump-times " / " 1 "recip" } } */
>>> --- 20,28 ----
>>>    e = c / y;
>>>    f = 1 / y;
>>>
>>> !   m = d;
>>> !   n = e;
>>> !   o = f;
>>>  }
>>>
>>>  /* { dg-final { scan-tree-dump-times " / " 1 "recip" } } */
>>> Index: gcc/testsuite/gcc.dg/tree-ssa/recip-7.c
>>> ===================================================================
>>> *** gcc/testsuite/gcc.dg/tree-ssa/recip-7.c.orig        2008-08-07 11:20:19.000000000 +0200
>>> --- gcc/testsuite/gcc.dg/tree-ssa/recip-7.c     2008-08-07 11:27:42.000000000 +0200
>>> ***************
>>> *** 5,11 ****
>>>
>>>  extern double h();
>>>
>>> ! double f(int x, double z, double w)
>>>  {
>>>    double b, c, d, e, f;
>>>    double y = h ();
>>> --- 5,13 ----
>>>
>>>  extern double h();
>>>
>>> ! double m, n, o;
>>> !
>>> ! void f(int x, double z, double w)
>>>  {
>>>    double b, c, d, e, f;
>>>    double y = h ();
>>> *************** double f(int x, double z, double w)
>>> *** 19,25 ****
>>>    e = c / y;
>>>    f = 1 / y;
>>>
>>> !   return d + e + f;
>>>  }
>>>
>>>  /* { dg-final { scan-tree-dump-times " / " 1 "recip" } } */
>>> --- 21,29 ----
>>>    e = c / y;
>>>    f = 1 / y;
>>>
>>> !   m = d;
>>> !   n = e;
>>> !   o = f;
>>>  }
>>>
>>>  /* { dg-final { scan-tree-dump-times " / " 1 "recip" } } */
>>> Index: gcc/passes.c
>>> ===================================================================
>>> *** gcc/passes.c.orig   2008-08-07 11:21:29.000000000 +0200
>>> --- gcc/passes.c        2008-08-07 11:27:42.000000000 +0200
>>> *************** init_optimization_passes (void)
>>> *** 633,641 ****
>>>         only examines PHIs to discover const/copy propagation
>>>         opportunities.  */
>>>        NEXT_PASS (pass_phi_only_cprop);
>>>        NEXT_PASS (pass_reassoc);
>>>        NEXT_PASS (pass_dce);
>>> -       NEXT_PASS (pass_dse);
>>>        NEXT_PASS (pass_forwprop);
>>>        NEXT_PASS (pass_phiopt);
>>>        NEXT_PASS (pass_object_sizes);
>>> --- 633,641 ----
>>>         only examines PHIs to discover const/copy propagation
>>>         opportunities.  */
>>>        NEXT_PASS (pass_phi_only_cprop);
>>> +       NEXT_PASS (pass_dse);
>>>        NEXT_PASS (pass_reassoc);
>>>        NEXT_PASS (pass_dce);
>>>        NEXT_PASS (pass_forwprop);
>>>        NEXT_PASS (pass_phiopt);
>>>        NEXT_PASS (pass_object_sizes);
>>> Index: gcc/testsuite/gfortran.dg/reassoc_4.f
>>> ===================================================================
>>> *** /dev/null   1970-01-01 00:00:00.000000000 +0000
>>> --- gcc/testsuite/gfortran.dg/reassoc_4.f       2008-08-07 11:27:42.000000000 +0200
>>> ***************
>>> *** 0 ****
>>> --- 1,43 ----
>>> + ! { dg-do compile }
>>> + ! { dg-options "-O3 -ffast-math -fdump-tree-reassoc1" }
>>> +       subroutine anisonl(w,vo,anisox,s,ii1,jj1,weight)
>>> +       integer ii1,jj1,i1,iii1,j1,jjj1,k1,l1,m1,n1
>>> +       real*8 w(3,3),vo(3,3),anisox(3,3,3,3),s(60,60),weight
>>> + !
>>> + !     This routine replaces the following lines in e_c3d.f for
>>> + !     an anisotropic material
>>> + !
>>> +                       do i1=1,3
>>> +                         iii1=ii1+i1-1
>>> +                         do j1=1,3
>>> +                           jjj1=jj1+j1-1
>>> +                           do k1=1,3
>>> +                             do l1=1,3
>>> +                               s(iii1,jjj1)=s(iii1,jjj1)
>>> +      &                          +anisox(i1,k1,j1,l1)*w(k1,l1)*weight
>>> +                               do m1=1,3
>>> +                                 s(iii1,jjj1)=s(iii1,jjj1)
>>> +      &                              +anisox(i1,k1,m1,l1)*w(k1,l1)
>>> +      &                                 *vo(j1,m1)*weight
>>> +      &                              +anisox(m1,k1,j1,l1)*w(k1,l1)
>>> +      &                                 *vo(i1,m1)*weight
>>> +                                 do n1=1,3
>>> +                                   s(iii1,jjj1)=s(iii1,jjj1)
>>> +      &                              +anisox(m1,k1,n1,l1)
>>> +      &                              *w(k1,l1)*vo(i1,m1)*vo(j1,n1)*weight
>>> +                                 enddo
>>> +                               enddo
>>> +                             enddo
>>> +                           enddo
>>> +                         enddo
>>> +                       enddo
>>> +
>>> +       return
>>> +       end
>>> +
>>> + ! There should be 22 multiplications left after un-distributing
>>> + ! weigth, w(k1,l1), vo(i1,m1) and vo(j1,m1) on the innermost two
>>> + ! unrolled loops.
>>> +
>>> + ! { dg-final { scan-tree-dump-times "\[0-9\] \\\* " 22 "reassoc1" } }
>>> + ! { dg-final { cleanup-tree-dump "reassoc1" } }
>>> Index: gcc/testsuite/gcc.dg/tree-ssa/reassoc-17.c
>>> ===================================================================
>>> *** /dev/null   1970-01-01 00:00:00.000000000 +0000
>>> --- gcc/testsuite/gcc.dg/tree-ssa/reassoc-17.c  2008-08-07 11:27:42.000000000 +0200
>>> ***************
>>> *** 0 ****
>>> --- 1,16 ----
>>> + /* { dg-do compile } */
>>> + /* { dg-options "-O2 -ffast-math -fdump-tree-reassoc1" } */
>>> +
>>> + double test2 (double x, double y, double ddj, int b)
>>> + {
>>> +   double tmp1, tmp2, sum;
>>> +   sum = 0.0;
>>> +   if (b)
>>> +     sum = 1.0;
>>> +   tmp1 = sum/ddj;
>>> +   tmp2 = x/ddj;
>>> +   return tmp1 + y + tmp2;
>>> + }
>>> +
>>> + /* { dg-final { scan-tree-dump-times "/" 1 "reassoc1" } } */
>>> + /* { dg-final { cleanup-tree-dump "reassoc1" } } */
>>> Index: gcc/tree-ssa-loop-niter.c
>>> ===================================================================
>>> *** gcc/tree-ssa-loop-niter.c.orig      2008-08-07 11:20:19.000000000 +0200
>>> --- gcc/tree-ssa-loop-niter.c   2008-08-07 11:27:42.000000000 +0200
>>> *************** stmt_dominates_stmt_p (gimple s1, gimple
>>> *** 2918,2923 ****
>>> --- 2918,2929 ----
>>>      {
>>>        gimple_stmt_iterator bsi;
>>>
>>> +       if (gimple_code (s2) == GIMPLE_PHI)
>>> +       return false;
>>> +
>>> +       if (gimple_code (s1) == GIMPLE_PHI)
>>> +       return true;
>>> +
>>>        for (bsi = gsi_start_bb (bb1); gsi_stmt (bsi) != s2; gsi_next (&bsi))
>>>        if (gsi_stmt (bsi) == s1)
>>>          return true;
>>> Index: gcc/testsuite/gcc.dg/tree-ssa/reassoc-18.c
>>> ===================================================================
>>> *** /dev/null   1970-01-01 00:00:00.000000000 +0000
>>> --- gcc/testsuite/gcc.dg/tree-ssa/reassoc-18.c  2008-08-07 11:27:42.000000000 +0200
>>> ***************
>>> *** 0 ****
>>> --- 1,12 ----
>>> + /* { dg-do compile } */
>>> + /* { dg-options "-O -fdump-tree-reassoc1" } */
>>> +
>>> + int
>>> + ETree_nFactorEntriesInFront (int b, int m)
>>> + {
>>> +   int nent = b*b + 2*b*m;
>>> +   return nent;
>>> + }
>>> +
>>> + /* { dg-final { scan-tree-dump-times "\\\*" 2 "reassoc1" } } */
>>> + /* { dg-final { cleanup-tree-dump "reassoc1" } } */
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> Subject:
>>> Re: [C++ PATCH] Fix decltype for calls to function pointers, references
>>> From:
>>> Mark Mitchell <mark@codesourcery.com>
>>> Date:
>>> Thu, 07 Aug 2008 07:23:03 -0700
>>> To:
>>> Paolo Bonzini <bonzini@gnu.org>
>>>
>>> To:
>>> Paolo Bonzini <bonzini@gnu.org>
>>> CC:
>>> Doug Gregor <doug.gregor@gmail.com>, Gcc Patch List 
>>> <gcc-patches@gcc.gnu.org>
>>>
>>>
>>> Paolo Bonzini wrote:
>>>>
>>>>> I'm guessing you mean okay for mainline, but not 4.3? This isn't a
>>>>> regression; it's a bug-fix for a new C++0x feature.
>>>>
>>>> What is the risk that we get complaints when 4.4 is out from people 
>>>> that were using the buggy feature and expecting the wrong result?
>>>
>>> Sure, that could happen.
>>>
>>> But, the same thing applies when backporting to 4.3; people using 
>>> 4.3.1 will be surprised if 4.3.2 breaks their application, and, in 
>>> fact, more surprised than if they go to a new major release.  Sadly, 
>>> people have been well-trained that going from X.Y to X.Y+N will force 
>>> them to change their code.
>>>
>>> We have the regression-only rule for a good reason: it means we don't 
>>> have to have a discussion about whether to backport every patch and 
>>> we err on the side of making X.Y.Z->X.Y.Z + N transitions preserve 
>>> the workingness of programs.  Arguably, having that discussion for 
>>> more patches might improve releases, but certainly at the cost of 
>>> time spent elsewhere.  That's why we have a bright-line rule.
>>>
>>> In general, everyone thinks their patch important, and everyone 
>>> thinks their patch safe...
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> Subject:
>>> Re: [C++ PATCH] Fix decltype for calls to function pointers, references
>>> From:
>>> Paolo Bonzini <bonzini@gnu.org>
>>> Date:
>>> Thu, 07 Aug 2008 16:45:31 +0200
>>> To:
>>> Mark Mitchell <mark@codesourcery.com>
>>>
>>> To:
>>> Mark Mitchell <mark@codesourcery.com>
>>> CC:
>>> Doug Gregor <doug.gregor@gmail.com>, Gcc Patch List 
>>> <gcc-patches@gcc.gnu.org>
>>>
>>>
>>>
>>>> But, the same thing applies when backporting to 4.3; people using 
>>>> 4.3.1 will be surprised if 4.3.2 breaks their application, and, in 
>>>> fact, more surprised than if they go to a new major release.
>>>
>>> Yes, though there is a difference being 6 or more months of monkeys 
>>> typing wrong code. :-)  That's the main reason why I asked.
>>>
>>>> In general, everyone thinks their patch important, and everyone 
>>>> thinks their patch safe... 
>>>
>>> It's not my patch! :-)
>>>
>>> I don't know even if people would understand that 4.3 has a bug, or 
>>> they could happily go on and use the wrong result.  Understanding 
>>> that is another reason why I asked.
>>>
>>> Thanks,
>>>
>>> Paolo
>>>
>>> ------------------------------------------------------------------------
>>>
>>> Subject:
>>> Re: [C++ PATCH] Fix decltype for calls to function pointers, references
>>> From:
>>> Mark Mitchell <mark@codesourcery.com>
>>> Date:
>>> Thu, 07 Aug 2008 08:33:52 -0700
>>> To:
>>> Paolo Bonzini <bonzini@gnu.org>
>>>
>>> To:
>>> Paolo Bonzini <bonzini@gnu.org>
>>> CC:
>>> Doug Gregor <doug.gregor@gmail.com>, Gcc Patch List 
>>> <gcc-patches@gcc.gnu.org>
>>>
>>>
>>> Paolo Bonzini wrote:
>>>
>>>>> In general, everyone thinks their patch important, and everyone 
>>>>> thinks their patch safe... 
>>>>
>>>> It's not my patch! :-)
>>>
>>> I know.  Sorry, I was trying to make the general point.
>>>
>>> My feeling here is that the things worth fixing in point releases are 
>>> regressions (which make us look bad relative to previous releases), 
>>> and things that have really widespread impact, like, for example, a 
>>> miscompilation of the Linux kernel.  I think it's overkill to try to 
>>> look at every patch and decide whether it's safe enough and valuable 
>>> enough to backport.  In this case, we're talking about a C++0x 
>>> feature, which means it's used by a very small fraction of our 
>>> userbase at this point, so it certainly doesn't seem worth it to me.
>>>
>>> I'm not saying it would be harmful, but I want to avoid having this 
>>> conversation every time.  Once we open the door, everyone will try to 
>>> get through it, and it's too much work for not enough benefit.
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> Subject:
>>> Re: [patch-rfc] N2179: Exception Propagation in C++
>>> From:
>>> Paolo Carlini <paolo.carlini@oracle.com>
>>> Date:
>>> Thu, 7 Aug 2008 09:33:01 -0500 (CDT)
>>> To:
>>> Paolo Carlini <paolo.carlini@oracle.com>, sebastian.redl@getdesigned.at
>>>
>>> To:
>>> Paolo Carlini <paolo.carlini@oracle.com>, sebastian.redl@getdesigned.at
>>> CC:
>>> gcc-patches@gcc.gnu.org, libstdc++@gcc.gnu.org
>>>
>>>
>>> Hi again,
>>>
>>>>> Can you please send over the ChangeLog entry? It will facilitates
>>>>> the final review, then we can commit very soon.
>>>> I'm trying again with a different email address which I found
>>>> in the GCC archive, got returned email from mail.windmuehlgasse...
>>>
>>> Apparently this address worked, no bounced messages so far...
>>>
>>> In the meanwhile, I checked with FSF and the work is cleared to be accepted, given the status of the paperwork. Thus, please provide a ChangeLog entry, regtest again the patch, submit it in the final form... Thanks!
>>>
>>> Paolo.
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> Subject:
>>> Fix i386 bootstrap problem
>>> From:
>>> Jan Hubicka <jh@suse.cz>
>>> Date:
>>> Thu, 7 Aug 2008 16:54:57 +0200
>>> To:
>>> gcc-patches@gcc.gnu.org
>>>
>>> To:
>>> gcc-patches@gcc.gnu.org
>>>
>>>
>>> Hi,
>>> my patch for optimize_insn_for_size_p predicates probably broke i386
>>> bootstrap on any mdern system (our testing setup still use glibc with
>>> stringop inlines that masked the issue).
>>>
>>> I've bootstrapped the following and will commit it in minute.
>>>
>>> Honza
>>>
>>> Index: ChangeLog
>>> ===================================================================
>>> *** ChangeLog	(revision 138840)
>>> --- ChangeLog	(working copy)
>>> ***************
>>> *** 1,3 ****
>>> --- 1,8 ----
>>> + 2008-08-07  Jan Hubicka  <jh@suse.cz>
>>> + 
>>> + 	PR target/37048
>>> + 	* i386.md (single stringop patterns): Enable unconditionally. 
>>> + 
>>>   2008-08-07  H.J. Lu  <hongjiu.lu@intel.com>
>>>   
>>>   	PR target/36992
>>> Index: config/i386/i386.md
>>> ===================================================================
>>> *** config/i386/i386.md	(revision 138840)
>>> --- config/i386/i386.md	(working copy)
>>> ***************
>>> *** 18652,18658 ****
>>>      (set (match_operand:DI 1 "register_operand" "=S")
>>>   	(plus:DI (match_dup 3)
>>>   		 (const_int 8)))]
>>> !   "TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "movsq"
>>>     [(set_attr "type" "str")
>>>      (set_attr "mode" "DI")
>>> --- 18652,18658 ----
>>>      (set (match_operand:DI 1 "register_operand" "=S")
>>>   	(plus:DI (match_dup 3)
>>>   		 (const_int 8)))]
>>> !   "TARGET_64BIT"
>>>     "movsq"
>>>     [(set_attr "type" "str")
>>>      (set_attr "mode" "DI")
>>> ***************
>>> *** 18667,18673 ****
>>>      (set (match_operand:SI 1 "register_operand" "=S")
>>>   	(plus:SI (match_dup 3)
>>>   		 (const_int 4)))]
>>> !   "!TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "movs{l|d}"
>>>     [(set_attr "type" "str")
>>>      (set_attr "mode" "SI")
>>> --- 18667,18673 ----
>>>      (set (match_operand:SI 1 "register_operand" "=S")
>>>   	(plus:SI (match_dup 3)
>>>   		 (const_int 4)))]
>>> !   "!TARGET_64BIT"
>>>     "movs{l|d}"
>>>     [(set_attr "type" "str")
>>>      (set_attr "mode" "SI")
>>> ***************
>>> *** 18682,18688 ****
>>>      (set (match_operand:DI 1 "register_operand" "=S")
>>>   	(plus:DI (match_dup 3)
>>>   		 (const_int 4)))]
>>> !   "TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "movs{l|d}"
>>>     [(set_attr "type" "str")
>>>      (set_attr "mode" "SI")
>>> --- 18682,18688 ----
>>>      (set (match_operand:DI 1 "register_operand" "=S")
>>>   	(plus:DI (match_dup 3)
>>>   		 (const_int 4)))]
>>> !   "TARGET_64BIT"
>>>     "movs{l|d}"
>>>     [(set_attr "type" "str")
>>>      (set_attr "mode" "SI")
>>> ***************
>>> *** 18697,18703 ****
>>>      (set (match_operand:SI 1 "register_operand" "=S")
>>>   	(plus:SI (match_dup 3)
>>>   		 (const_int 2)))]
>>> !   "!TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "movsw"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "both")
>>> --- 18697,18703 ----
>>>      (set (match_operand:SI 1 "register_operand" "=S")
>>>   	(plus:SI (match_dup 3)
>>>   		 (const_int 2)))]
>>> !   "!TARGET_64BIT"
>>>     "movsw"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "both")
>>> ***************
>>> *** 18712,18718 ****
>>>      (set (match_operand:DI 1 "register_operand" "=S")
>>>   	(plus:DI (match_dup 3)
>>>   		 (const_int 2)))]
>>> !   "TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "movsw"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "both")
>>> --- 18712,18718 ----
>>>      (set (match_operand:DI 1 "register_operand" "=S")
>>>   	(plus:DI (match_dup 3)
>>>   		 (const_int 2)))]
>>> !   "TARGET_64BIT"
>>>     "movsw"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "both")
>>> ***************
>>> *** 18727,18733 ****
>>>      (set (match_operand:SI 1 "register_operand" "=S")
>>>   	(plus:SI (match_dup 3)
>>>   		 (const_int 1)))]
>>> !   "!TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "movsb"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "both")
>>> --- 18727,18733 ----
>>>      (set (match_operand:SI 1 "register_operand" "=S")
>>>   	(plus:SI (match_dup 3)
>>>   		 (const_int 1)))]
>>> !   "!TARGET_64BIT"
>>>     "movsb"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "both")
>>> ***************
>>> *** 18742,18748 ****
>>>      (set (match_operand:DI 1 "register_operand" "=S")
>>>   	(plus:DI (match_dup 3)
>>>   		 (const_int 1)))]
>>> !   "TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "movsb"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "both")
>>> --- 18742,18748 ----
>>>      (set (match_operand:DI 1 "register_operand" "=S")
>>>   	(plus:DI (match_dup 3)
>>>   		 (const_int 1)))]
>>> !   "TARGET_64BIT"
>>>     "movsb"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "both")
>>> ***************
>>> *** 18917,18923 ****
>>>   		   (match_operand 2 "register_operand" ""))
>>>   	      (set (match_operand 0 "register_operand" "")
>>>   		   (match_operand 3 "" ""))])]
>>> !   "TARGET_SINGLE_STRINGOP"
>>>     "ix86_current_function_needs_cld = 1;")
>>>   
>>>   (define_insn "*strsetdi_rex_1"
>>> --- 18917,18923 ----
>>>   		   (match_operand 2 "register_operand" ""))
>>>   	      (set (match_operand 0 "register_operand" "")
>>>   		   (match_operand 3 "" ""))])]
>>> !   ""
>>>     "ix86_current_function_needs_cld = 1;")
>>>   
>>>   (define_insn "*strsetdi_rex_1"
>>> ***************
>>> *** 18926,18932 ****
>>>      (set (match_operand:DI 0 "register_operand" "=D")
>>>   	(plus:DI (match_dup 1)
>>>   		 (const_int 8)))]
>>> !   "TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "stosq"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>> --- 18926,18932 ----
>>>      (set (match_operand:DI 0 "register_operand" "=D")
>>>   	(plus:DI (match_dup 1)
>>>   		 (const_int 8)))]
>>> !   "TARGET_64BIT"
>>>     "stosq"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>> ***************
>>> *** 18938,18944 ****
>>>      (set (match_operand:SI 0 "register_operand" "=D")
>>>   	(plus:SI (match_dup 1)
>>>   		 (const_int 4)))]
>>> !   "!TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "stos{l|d}"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>> --- 18938,18944 ----
>>>      (set (match_operand:SI 0 "register_operand" "=D")
>>>   	(plus:SI (match_dup 1)
>>>   		 (const_int 4)))]
>>> !   "!TARGET_64BIT"
>>>     "stos{l|d}"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>> ***************
>>> *** 18950,18956 ****
>>>      (set (match_operand:DI 0 "register_operand" "=D")
>>>   	(plus:DI (match_dup 1)
>>>   		 (const_int 4)))]
>>> !   "TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "stos{l|d}"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>> --- 18950,18956 ----
>>>      (set (match_operand:DI 0 "register_operand" "=D")
>>>   	(plus:DI (match_dup 1)
>>>   		 (const_int 4)))]
>>> !   "TARGET_64BIT"
>>>     "stos{l|d}"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>> ***************
>>> *** 18962,18968 ****
>>>      (set (match_operand:SI 0 "register_operand" "=D")
>>>   	(plus:SI (match_dup 1)
>>>   		 (const_int 2)))]
>>> !   "!TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "stosw"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>> --- 18962,18968 ----
>>>      (set (match_operand:SI 0 "register_operand" "=D")
>>>   	(plus:SI (match_dup 1)
>>>   		 (const_int 2)))]
>>> !   "!TARGET_64BIT"
>>>     "stosw"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>> ***************
>>> *** 18974,18980 ****
>>>      (set (match_operand:DI 0 "register_operand" "=D")
>>>   	(plus:DI (match_dup 1)
>>>   		 (const_int 2)))]
>>> !   "TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "stosw"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>> --- 18974,18980 ----
>>>      (set (match_operand:DI 0 "register_operand" "=D")
>>>   	(plus:DI (match_dup 1)
>>>   		 (const_int 2)))]
>>> !   "TARGET_64BIT"
>>>     "stosw"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>> ***************
>>> *** 18986,18992 ****
>>>      (set (match_operand:SI 0 "register_operand" "=D")
>>>   	(plus:SI (match_dup 1)
>>>   		 (const_int 1)))]
>>> !   "!TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "stosb"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>> --- 18986,18992 ----
>>>      (set (match_operand:SI 0 "register_operand" "=D")
>>>   	(plus:SI (match_dup 1)
>>>   		 (const_int 1)))]
>>> !   "!TARGET_64BIT"
>>>     "stosb"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>> ***************
>>> *** 18998,19004 ****
>>>      (set (match_operand:DI 0 "register_operand" "=D")
>>>   	(plus:DI (match_dup 1)
>>>   		 (const_int 1)))]
>>> !   "TARGET_64BIT && TARGET_SINGLE_STRINGOP"
>>>     "stosb"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>> --- 18998,19004 ----
>>>      (set (match_operand:DI 0 "register_operand" "=D")
>>>   	(plus:DI (match_dup 1)
>>>   		 (const_int 1)))]
>>> !   "TARGET_64BIT"
>>>     "stosb"
>>>     [(set_attr "type" "str")
>>>      (set_attr "memory" "store")
>>>
>>> ------------------------------------------------------------------------
>>>
>>> Subject:
>>> Re: Combine iWMMXt vector move patterns
>>> From:
>>> Paul Brook <paul@codesourcery.com>
>>> Date:
>>> Thu, 7 Aug 2008 16:24:20 +0100
>>> To:
>>> gcc-patches@gcc.gnu.org
>>>
>>> To:
>>> gcc-patches@gcc.gnu.org
>>> CC:
>>> "Joseph S. Myers" <joseph@codesourcery.com>
>>>
>>>
>>>> 2008-07-27  Joseph Myers  <joseph@codesourcery.com>
>>>>
>>>> 	* config/arm/iwmmxt.md (movv8qi_internal, movv4hi_internal,
>>>> 	movv2si_internal): Combine into mov<mode>_internal.
>>>> 	(movv2si_internal_2): Remove.
>>>
>>> Ok.
>>>
>>> Paul
>>>
>>> ------------------------------------------------------------------------
>>>
>>> Subject:
>>> Re: patch for merging graphite branch (before tuplification)
>>> From:
>>> Jack Howarth <howarth@bromo.msbb.uc.edu>
>>> Date:
>>> Thu, 7 Aug 2008 11:25:33 -0400
>>> To:
>>> Sebastian Pop <sebpop@gmail.com>
>>>
>>> To:
>>> Sebastian Pop <sebpop@gmail.com>
>>> CC:
>>> Richard Guenther <richard.guenther@gmail.com>, GCC Patches 
>>> <gcc-patches@gcc.gnu.org>, Mark Mitchell <mark@codesourcery.com>, 
>>> Jakub Jelinek <jakub@redhat.com>, David Edelsohn 
>>> <edelsohn@gmail.com>, "Harle, Christophe" <christophe.harle@amd.com>, 
>>> Tobias Grosser <grosser@fim.uni-passau.de>, Konrad Trifunovic 
>>> <konrad.trifunovic@gmail.com>, Albert Cohen <Albert.Cohen@inria.fr>, 
>>> Roberto Bagnara <bagnara@cs.unipr.it>
>>>
>>>
>>> Sebastian,
>>>     A couple questions. Do you know when the ppl cvs
>>> will be released as the next ppl version? I noticed today
>>> that the ppl testsuite failures I am seeing on
>>> i386-apple-darwin9 appear to be fixed in ppl cvs.
>>> Also is it likely that cloog-ppl git and the graphite
>>> patches would build under ppl cvs? I ask because I
>>> thought I would try ppl cvs to see if it eliminated
>>> the two graphite gcc testsuite failures I am seeing
>>> on i686-apple-darwin9 with ppl 0.9 (since that release
>>> shows failures in the ppl testsuite on that target).
>>>                        Jack
>>>
>>>
>>>
>>>
>>> On Sat, Aug 02, 2008 at 07:26:18PM -0500, Sebastian Pop wrote:
>>>> Hi,
>>>>
>>>> The graphite branch has been tuplified and the port to PPL passes the
>>>> graphite testsuite.  For building the graphite branch right now, here
>>>> are the steps you'll have to go through:
>>>>
>>>> You have to get a copy of the release 0.9 of PPL from:
>>>> http://www.cs.unipr.it/ppl/Download/
>>>>
>>>> cd ppl
>>>> ./configure --prefix=/somewhere
>>>> make
>>>> make install
>>>>
>>>> Then you can get a copy of the port of Cloog to PPL as follows:
>>>>
>>>> cd cloog
>>>> git-init
>>>> git-pull http://repo.or.cz/w/cloog-ppl.git
>>>> aclocal
>>>> autoconf
>>>> ./configure --with-ppl=/somewhere --prefix=/somewhere
>>>> make
>>>> make install
>>>>
>>>> Then grab a version of graphite branch and configure like this:
>>>>
>>>> cd gcc/build
>>>> ../configure --with-cloog=/somewhere --with-ppl=/somewhere
>>>> make
>>>>
>>>> For the moment I think that building the cloog and ppl libs in the gcc
>>>> directory is broken.  I have not been able to configure ppl within the
>>>> build of gcc because ieeefp.h has not been found on my ubuntu system.
>>>> I will try to see how that can be fixed, or better, not provide this
>>>> functionality and expect all the time the cloog and ppl libs to be
>>>> installed on the system.
>>>>
>>>> Note that ppl and polylib are two backends of cloog, and one has the
>>>> choice of the polyhedral library to be used.  For the moment the code
>>>> generated by the ppl backend contains much more conditions that are
>>>> redundant with respect to the enclosing loops because of the
>>>> cloog_domain_simplify operation that is still very inefficient in the
>>>> ppl backend.  This should be improved either in newer versions of PPL.
>>>>
>>>> Sebastian Pop
>>>> --
>>>> AMD - GNU Tools



More information about the Gcc-patches mailing list