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);

Reply via email to