In this PR, OMP lowering is not going into the transaction code. So if GIMPLE_TRANSACTION is found, we lower its body. (Patch also fixes a format issue.)
Note that PR53992 component in Bugzilla must be change from c to libgomp (I don't have bugzilla account with admin rights, who should I ask for that?).
Tested on trunk / i686. Ok for trunk? Ok to backport to 4.7 branch if no regression? Thanks. gcc/ 2012-08-17 Patrick Marlier <patrick.marl...@gmail.com> PR libgomp/53992 * omp-low.c (lower_omp_1): Handle GIMPLE_TRANSACTION.
Index: omp-low.c =================================================================== --- omp-low.c (revision 190488) +++ omp-low.c (working copy) @@ -6827,6 +6827,9 @@ lower_omp_1 (gimple_stmt_iterator *gsi_p, omp_cont lower_omp (gimple_try_eval_ptr (stmt), ctx); lower_omp (gimple_try_cleanup_ptr (stmt), ctx); break; + case GIMPLE_TRANSACTION: + lower_omp (gimple_transaction_body_ptr (stmt), ctx); + break; case GIMPLE_BIND: lower_omp (gimple_bind_body_ptr (stmt), ctx); break; @@ -7108,24 +7111,24 @@ diagnose_sb_2 (gimple_stmt_iterator *gsi_p, bool * break; case GIMPLE_COND: - { - tree lab = gimple_cond_true_label (stmt); - if (lab) - { - n = splay_tree_lookup (all_labels, - (splay_tree_key) lab); - diagnose_sb_0 (gsi_p, context, - n ? (gimple) n->value : NULL); - } - lab = gimple_cond_false_label (stmt); - if (lab) - { - n = splay_tree_lookup (all_labels, - (splay_tree_key) lab); - diagnose_sb_0 (gsi_p, context, - n ? (gimple) n->value : NULL); - } - } + { + tree lab = gimple_cond_true_label (stmt); + if (lab) + { + n = splay_tree_lookup (all_labels, + (splay_tree_key) lab); + diagnose_sb_0 (gsi_p, context, + n ? (gimple) n->value : NULL); + } + lab = gimple_cond_false_label (stmt); + if (lab) + { + n = splay_tree_lookup (all_labels, + (splay_tree_key) lab); + diagnose_sb_0 (gsi_p, context, + n ? (gimple) n->value : NULL); + } + } break; case GIMPLE_GOTO: Index: testsuite/gcc.dg/gomp/pr53992.c =================================================================== --- testsuite/gcc.dg/gomp/pr53992.c (revision 0) +++ testsuite/gcc.dg/gomp/pr53992.c (working copy) @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-fgnu-tm -fopenmp" } */ +/* { dg-require-effective-target fgnu_tm } */ + +int main() { + long data[10000]; + long i, min=10000; + for (i=0; i<10000; i++) data[i] = -i; + +#pragma omp parallel for + for (i=0; i<10000; i++) { + __transaction_atomic + { + if (data[i] < min) + min = data[i]; + } + } + + return !(min == -9999); +}