2013/6/13 Ian Lance Taylor <iant@xxxxxxxxxx>: > On Wed, Jun 12, 2013 at 1:15 AM, dw <limegreensocks@xxxxxxxxx> wrote: [deleted] >> In fact, I *can* generate failure cases if I comment the >> __builtin_ia32_mfence() call out of _mm_mfence and replace it with something >> else (like asm("mfence")). But as soon as I put the __builtin_ia32_mfence >> call back in, my "failure scenario" clears right up. >> >> In short, it looks like __builtin_ia32_mfence *does* generate a barrier. >> But so do other builtins (like __builtin_ia32_pause). Does that even seem >> possible? It would be weird if every builtin (or even every ia32 builtin) >> implied a barrier. [deleted] > > So when I say that as far as I know __builtin_ia32_mfence does not > generate a barrier, what I mean is that as far as I know after it is > expanded to RTL there is no barrier. But I could be wrong. > > Ian I just noticed there is a statement "MEM_VOLATILE_P(operands[0]=1" for mfence pattern in gcc/config/i386/sync.md: (define_expand "sse2_mfence" [(set (match_dup 0) (unspec:BLK [(match_dup 0)] UNSPEC_MFENCE))] "TARGET_SSE2" { operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode)); MEM_VOLATILE_P (operands[0]) = 1; }) And so does "pause" pattern in gcc/config/i386/i386.md: (define_expand "pause" [(set (match_dup 0) (unspec:BLK [(match_dup 0)] UNSPEC_PAUSE))] "" { operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode)); MEM_VOLATILE_P (operands[0]) = 1; }) According to GCC Internal 10.5, the description says that "Volatile memory references may not be deleted, reordered or combined." I think that is why __builtin_ia32_mfence and __builtin_ia32_pause *do* generate a barrier in dw's experiment. Best regards, jasonwucj