This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix gcse in presence of volatile mems


Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz> writes:

> Hello,
>
> in the appended testcase (obtained from linux kernel), the following
> bug occurred: load motion decides to optimize non-volatile instance
> of src_pte, and not to take volatile instance into account.  When
> checking for availability, we however consider these instances to be equal,
> which causes us to believe that the second load of pte is redundant.
>
> The patch fixes it.
>
> Zdenek
>
> typedef struct { unsigned long pte_low; } pte_t;
> static inline void clear_bit(int nr, volatile void * addr)
> {
>         __asm__ __volatile__(
>                 "btrl %1,%0"
>                 :"=m" ((*(volatile long *) addr))
>                 :"Ir" (nr));
> }
> static inline void ptep_set_wrprotect(pte_t *ptep) { clear_bit(1, ptep); }
> int copy_page_range(void)
> {
>         pte_t * src_pte;
>         pte_t pte = *src_pte;
>
>         if (pte.pte_low) {
>              ptep_set_wrprotect(src_pte);
>              pte = *src_pte;
>            }
>
> 	foo (pte);
>
>         return 0;
> }

Can you convert this into a testcase and add it also to the testsuite?

Andreas

>
> Changelog:
> 	* gcse.c (expr_equiv_p): Don't consider anything to be equal to
> 	volatile mem.
>
> Index: gcse.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/gcse.c,v
> retrieving revision 1.222.2.18
> diff -c -3 -p -r1.222.2.18 gcse.c
> *** gcse.c	15 Aug 2003 13:21:01 -0000	1.222.2.18
> --- gcse.c	29 Aug 2003 22:33:15 -0000
> *************** expr_equiv_p (x, y)
> *** 1844,1849 ****
> --- 1844,1853 ----
>   	 due to it being set with the different alias set.  */
>         if (MEM_ALIAS_SET (x) != MEM_ALIAS_SET (y))
>   	return 0;
> + 
> +       /* A volatile mem should not be considered equivalent to any other.  */
> +       if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y))
> + 	return 0;
>         break;
>   
>       /*  For commutative operations, check both orders.  */
>
>

Andreas
-- 
 Andreas Jaeger, aj@suse.de, http://www.suse.de/~aj
  SuSE Linux AG, Deutschherrnstr. 15-19, 90429 Nürnberg, Germany
   GPG fingerprint = 93A3 365E CE47 B889 DF7F  FED1 389A 563C C272 A126

Attachment: pgp00000.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]