* [PATCH, PR49121] [4.7 Regression] FAIL: gcc.dg/tree-ssa/ivopt_infer_2.c scan-tree-dump-times ivopts "Replacing" 0
@ 2011-05-24 1:31 Tom de Vries
2011-05-24 11:00 ` Zdenek Dvorak
0 siblings, 1 reply; 2+ messages in thread
From: Tom de Vries @ 2011-05-24 1:31 UTC (permalink / raw)
To: Zdenek Dvorak; +Cc: gcc-patches
[-- Attachment #1: Type: text/plain, Size: 2942 bytes --]
Hi,
This test case gcc.dg/tree-ssa/ivopt_infer_2.c started failing due to
http://gcc.gnu.org/ml/gcc-cvs/2011-05/msg00837.html.
test case:
...
#ifndef TYPE
#define TYPE char*
#endif
extern int a[];
/* Can not infer loop iteration from array -- exit test can not be replaced.
*/
void foo (int i_width, TYPE dst, TYPE src1, TYPE src2)
{
TYPE dstn= dst + i_width;
TYPE dst0 = dst;
unsigned long long i = 0;
for( ; dst <= dstn; )
{
dst0[i] = ( src1[i] + src2[i] + 1 +a[i]) >> 1;
dst++;
i += 16;
}
}
...
test case representation at ivopts:
...
foo (int i_width, char * dst, char * src1, char * src2)
{
long long unsigned int i;
char * dstn;
char D.2707;
int D.2706;
int D.2705;
int D.2704;
int D.2703;
int D.2702;
int D.2701;
char D.2700;
char * D.2699;
int D.2698;
char D.2697;
char * D.2696;
char * D.2695;
long unsigned int D.2694;
<bb 2>:
D.2694_4 = (long unsigned int) i_width_3(D);
dstn_6 = dst_5(D) + D.2694_4;
if (dst_5(D) <= dstn_6)
goto <bb 3>;
else
goto <bb 7>;
<bb 3>:
<bb 4>:
# dst_32 = PHI <dst_24(5), dst_5(D)(3)>
# i_33 = PHI <i_25(5), 0(3)>
D.2695_9 = dst_5(D) + i_33;
D.2696_11 = src1_10(D) + i_33;
D.2697_12 = *D.2696_11;
D.2698_13 = (int) D.2697_12;
D.2699_15 = src2_14(D) + i_33;
D.2700_16 = *D.2699_15;
D.2701_17 = (int) D.2700_16;
D.2702_18 = D.2698_13 + D.2701_17;
D.2703_19 = D.2702_18 + 1;
D.2704_20 = a[i_33];
D.2705_21 = D.2703_19 + D.2704_20;
D.2706_22 = D.2705_21 >> 1;
D.2707_23 = (char) D.2706_22;
*D.2695_9 = D.2707_23;
dst_24 = dst_32 + 1;
i_25 = i_33 + 16;
if (dstn_6 >= dst_24)
goto <bb 5>;
else
goto <bb 6>;
<bb 5>:
goto <bb 4>;
<bb 6>:
<bb 7>:
return;
}
...
the patch causes estimated_loop_iterations (loop, true, &max_niter) in
may_eliminate_iv to return a different value:
without patch: 0x10000000000000000
with patch: 0x01000000000000000
The analysis in the patch concludes that the pointer arithmetic statement
D.2695_9 = dst_5(D) + i_33
can only be executed 0x01000000000000000 times, based on the fact that i is
incremented with 16 each iteration. Note that the statement corresponds to the
pointer arithmetic in 'dst0[i]'.
Since the proposed new char pointer iterator can represent 0x10000000000000000
distinct values, may_eliminate_iv returns true, and the exit test is replaced:
...
Replacing exit test: if (dstn_6 >= dst_24)
...
This causes the check:
...
/* { dg-final { scan-tree-dump-times "Replacing" 0 "ivopts"} } */
...
to fail.
The analysis is correct, and the test case needs to be adapted.
I adapted the testcase such that it still replaces the exit test if 'a' is
declared as 'char a[400]', but not if it is declared as 'extern char a[]'.
ok for trunk?
Thanks,
- Tom
2011-05-23 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/49121
* gcc.dg/tree-ssa/ivopt_infer_2.c: Adapt test.
[-- Attachment #2: pr49121.patch --]
[-- Type: text/x-patch, Size: 989 bytes --]
Index: gcc/testsuite/gcc.dg/tree-ssa/ivopt_infer_2.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/ivopt_infer_2.c (revision 173703)
+++ gcc/testsuite/gcc.dg/tree-ssa/ivopt_infer_2.c (working copy)
@@ -5,20 +5,20 @@
#define TYPE char*
#endif
-extern int a[];
+extern char a[];
/* Can not infer loop iteration from array -- exit test can not be replaced. */
-void foo (int i_width, TYPE dst, TYPE src1, TYPE src2)
+void foo (unsigned int i_width, TYPE dst)
{
- TYPE dstn= dst + i_width;
- TYPE dst0 = dst;
- unsigned long long i = 0;
- for( ; dst <= dstn; )
- {
- dst0[i] = ( src1[i] + src2[i] + 1 +a[i]) >> 1;
- dst++;
- i += 16;
- }
+ unsigned long long i = 0;
+ unsigned long long j = 0;
+ for ( ; j < i_width; )
+ {
+ *dst = a[i];
+ dst++;
+ i += 2;
+ j += 1;
+ }
}
/* { dg-final { scan-tree-dump-times "Replacing" 0 "ivopts"} } */
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH, PR49121] [4.7 Regression] FAIL: gcc.dg/tree-ssa/ivopt_infer_2.c scan-tree-dump-times ivopts "Replacing" 0
2011-05-24 1:31 [PATCH, PR49121] [4.7 Regression] FAIL: gcc.dg/tree-ssa/ivopt_infer_2.c scan-tree-dump-times ivopts "Replacing" 0 Tom de Vries
@ 2011-05-24 11:00 ` Zdenek Dvorak
0 siblings, 0 replies; 2+ messages in thread
From: Zdenek Dvorak @ 2011-05-24 11:00 UTC (permalink / raw)
To: Tom de Vries; +Cc: gcc-patches
Hi,
> The analysis is correct, and the test case needs to be adapted.
>
> I adapted the testcase such that it still replaces the exit test if 'a' is
> declared as 'char a[400]', but not if it is declared as 'extern char a[]'.
>
> ok for trunk?
OK,
Zdenek
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-05-24 8:04 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-05-24 1:31 [PATCH, PR49121] [4.7 Regression] FAIL: gcc.dg/tree-ssa/ivopt_infer_2.c scan-tree-dump-times ivopts "Replacing" 0 Tom de Vries
2011-05-24 11:00 ` Zdenek Dvorak
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).