The following is an attempt to change those testcases to be less dependent on previous passes. The original motivation of the testcases seems to be testing SCEV capabilities and in turn IVOPTs decisions, thus the testcases are changed to check the IVO dump, use the GIMPLE FE feeding the loop pipeline directly and skip lowering/store-motion we meanwhile do to the testcase.
To avoid some existing issue with CFG construction after GIMPLE parsing we need to be able to add GIMPLE_NOPs which the patch enables to generate from empty stmts (previously those resulted in parse errors). Tested the testcases on x86_64 with {,-m32} sofar I'll appreciate testing on more targets. Full bootstrap / regtest running on x86_64-unknown-linux-gnu. Richard. 2017-01-13 Richard Biener <rguent...@suse.de> PR testsuite/52563 PR testsuite/71237 PR testsuite/77737 c/ * gimple-parser.c (c_parser_gimple_compound_statement): Handle nops. * gcc.dg/tree-ssa/scev-3.c: Re-write to a GIMPLE testcase for IVOPTs. * gcc.dg/tree-ssa/scev-4.c: Likewise. * gcc.dg/tree-ssa/scev-5.c: Likewise. Index: gcc/c/gimple-parser.c =================================================================== --- gcc/c/gimple-parser.c (revision 244393) +++ gcc/c/gimple-parser.c (working copy) @@ -211,6 +211,17 @@ c_parser_gimple_compound_statement (c_pa } goto expr_stmt; + case CPP_SEMICOLON: + { + /* Empty stmt. */ + location_t loc = c_parser_peek_token (parser)->location; + c_parser_consume_token (parser); + gimple *nop = gimple_build_nop (); + gimple_set_location (nop, loc); + gimple_seq_add_stmt (seq, nop); + break; + } + default: expr_stmt: c_parser_gimple_statement (parser, seq); Index: gcc/testsuite/gcc.dg/tree-ssa/scev-3.c =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/scev-3.c (revision 244393) +++ gcc/testsuite/gcc.dg/tree-ssa/scev-3.c (working copy) @@ -1,18 +1,43 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* { dg-options "-O2 -fgimple -fdump-tree-ivopts" } */ int *a_p; int a[1000]; -void -f(int k) +void __GIMPLE (startwith ("loop")) +f (int k) { - int i; + int i; + int * _1; + +bb_2: + i_5 = k_4(D); + if (i_5 <= 999) + goto bb_4; + else + goto bb_3; + +bb_3: + return; + +bb_4: + ; + +bb_5: + i_12 = __PHI (bb_6: i_9, bb_4: i_5); + _1 = &a[i_12]; + a_p = _1; + __MEM <int[1000]> ((int *)&a)[i_12] = 100; + i_9 = i_5 + i_12; + if (i_9 <= 999) + goto bb_6; + else + goto bb_3; + +bb_6: + ; + goto bb_5; - for (i=k; i<1000; i+=k) { - a_p = &a[i]; - *a_p = 100; - } } -/* { dg-final { scan-tree-dump-times "&a" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "&a" 1 "ivopts" } } */ Index: gcc/testsuite/gcc.dg/tree-ssa/scev-4.c =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/scev-4.c (revision 244393) +++ gcc/testsuite/gcc.dg/tree-ssa/scev-4.c (working copy) @@ -1,23 +1,48 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* { dg-options "-O2 -fgimple -fdump-tree-ivopts" } */ typedef struct { - int x; - int y; + int x; + int y; } S; int *a_p; S a[1000]; -void -f(int k) +void __GIMPLE (startwith ("loop")) +f (int k) { - int i; + int i; + int * _1; + +bb_2: + i_5 = k_4(D); + if (i_5 <= 999) + goto bb_4; + else + goto bb_3; + +bb_3: + return; + +bb_4: + ; + +bb_5: + i_12 = __PHI (bb_6: i_9, bb_4: i_5); + _1 = &a[i_12].y; + a_p = _1; + __MEM <S[1000]> ((int *)&a)[i_12].y = 100; + i_9 = i_5 + i_12; + if (i_9 <= 999) + goto bb_6; + else + goto bb_3; + +bb_6: + ; + goto bb_5; - for (i=k; i<1000; i+=k) { - a_p = &a[i].y; - *a_p = 100; - } } -/* { dg-final { scan-tree-dump-times "&a" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "&a" 1 "ivopts" } } */ Index: gcc/testsuite/gcc.dg/tree-ssa/scev-5.c =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/scev-5.c (revision 244393) +++ gcc/testsuite/gcc.dg/tree-ssa/scev-5.c (working copy) @@ -1,18 +1,43 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* { dg-options "-O2 -fgimple -fdump-tree-ivopts" } */ int *a_p; int a[1000]; -void -f(int k) +void __GIMPLE (startwith ("loop")) +f (int k) { - long long i; + long long int i; + int * _1; + +bb_2: + i_5 = (long long int) k_4(D); + if (i_5 <= 999ll) + goto bb_4; + else + goto bb_3; + +bb_3: + return; + +bb_4: + ; + +bb_5: + i_12 = __PHI (bb_6: i_9, bb_4: i_5); + _1 = &a[i_12]; + a_p = _1; + __MEM <int[1000]> ((int *)&a)[i_12] = 100; + i_9 = i_5 + i_12; + if (i_9 <= 999ll) + goto bb_6; + else + goto bb_3; + +bb_6: + ; + goto bb_5; - for (i=k; i<1000; i+=k) { - a_p = &a[i]; - *a_p = 100; - } } -/* { dg-final { scan-tree-dump-times "&a" 1 "optimized" } } */ +/* { dg-final { scan-tree-dump-times "&a" 1 "ivopts" } } */