[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