Hello,
For this volatile-related issue (no volatile bits on volatile fields of a
non-volatile struct) AFAIU there is an agreement of fixing the front-ends
if needed, but anyways the patch to the selective scheduler is required
that properly merges expressions so that the may_trap_p bit is preserved.
So the following patch was successfully tested on ia64 and x86-64, approved
by Alexander offline, committed to trunk. The patch needs backport to
other branches in about two weeks.
Andrey
PR middle-end/45472
gcc/
* sel-sched-ir.c (merge_expr): Also change vinsn of merged expr
when the may_trap_p bit of the exprs being merged differs.
Reorder tests for speculativeness in the logical and operator.
testsuite/
* gcc.dg/45472.c: New test.
Index: gcc/testsuite/gcc.dg/pr45472.c
===================================================================
*** gcc/testsuite/gcc.dg/pr45472.c (revision 0)
--- gcc/testsuite/gcc.dg/pr45472.c (revision 196308)
***************
*** 0 ****
--- 1,21 ----
+ /* { dg-do compile { target powerpc*-*-* ia64-*-* x86_64-*-* } } */
+ /* { dg-options "-O -fschedule-insns2 -fselective-scheduling2" } */
+
+ struct S
+ {
+ volatile long vl;
+ int i;
+ };
+ struct S s1, s2;
+
+ void
+ foo (int j, int c)
+ {
+ int i;
+ for (i = 0; i <= j; i++)
+ {
+ if (c)
+ s2.vl += s1.vl;
+ s1 = s2;
+ }
+ }
Index: gcc/sel-sched-ir.c
===================================================================
*** gcc/sel-sched-ir.c (revision 196307)
--- gcc/sel-sched-ir.c (revision 196308)
*************** merge_expr (expr_t to, expr_t from, insn
*** 1866,1873 ****
/* Make sure that speculative pattern is propagated into exprs that
have non-speculative one. This will provide us with consistent
speculative bits and speculative patterns inside expr. */
! if (EXPR_SPEC_DONE_DS (to) == 0
! && EXPR_SPEC_DONE_DS (from) != 0)
change_vinsn_in_expr (to, EXPR_VINSN (from));
merge_expr_data (to, from, split_point);
--- 1866,1877 ----
/* Make sure that speculative pattern is propagated into exprs that
have non-speculative one. This will provide us with consistent
speculative bits and speculative patterns inside expr. */
! if ((EXPR_SPEC_DONE_DS (from) != 0
! && EXPR_SPEC_DONE_DS (to) == 0)
! /* Do likewise for volatile insns, so that we always retain
! the may_trap_p bit on the resulting expression. */
! || (VINSN_MAY_TRAP_P (EXPR_VINSN (from))
! && !VINSN_MAY_TRAP_P (EXPR_VINSN (to))))
change_vinsn_in_expr (to, EXPR_VINSN (from));
merge_expr_data (to, from, split_point);