2.6.4 remove intermittent warnings from spinlock code
PATCH 1/1 2.6.4 remove intermittent warnings from spinlock code
The spinlock code writes to p14. If gcc reuses p14 in the bundles immediately after the spinlock then we get warning messages. Append a stop bit to the spinlock code to remove the warnings. gcc 3.2.3, binutils 2.14.90.0.4.
{standard input}: Assembler messages:
{standard input}:2217: Warning: Use of 'tbit.z' violates WAW dependency 'PR%, % in 1 - 15' (impliedf), specific resource number is 14 {standard input}:2217: Warning: Only the first path encountering the conflict is reported
{standard input}:2211: Warning: This is the location of the conflicting usage
Index: linux-2.6.4/include/asm-ia64/spinlock.h
include/asm-ia64/spinlock.h +4 -0
@@ -52,6 +52,7 @@ "cmp4.ne p14, p0 = r30, r0\n\t" "mov b6 = r29;;\n" "(p14) br.cond.spnt.many b6" + ";;" : "=r"(ptr) : "r"(ptr) : IA64_SPINLOCK_CLOBBERS); # else asm volatile ("{\n\t"
@@ -62,6 +63,7 @@ "cmpxchg4.acq r30 = [%1], r30, ar.ccv;;\n\t" "cmp4.ne p14, p0 = r30, r0\n" "(p14) brl.cond.spnt.many ia64_spinlock_contention_pre3_4" + ";;" : "=r"(ptr) : "r"(ptr) : IA64_SPINLOCK_CLOBBERS); # endif /* CONFIG_MCKINLEY */ #else
@@ -75,6 +77,7 @@ "cmp4.ne p14, p0 = r30, r0\n\t" "mov b6 = r29;;\n" "(p14) br.call.spnt.many b6 = b6" + ";;" : "=r"(ptr) : "r"(ptr) : IA64_SPINLOCK_CLOBBERS); # else asm volatile ("mov r30 = 1\n\t"
@@ -82,6 +85,7 @@ "cmpxchg4.acq r30 = [%0], r30, ar.ccv;;\n\t" "cmp4.ne p14, p0 = r30, r0\n\t" "(p14) brl.call.spnt.many b6=ia64_spinlock_contention" + ";;" : "=r"(ptr) : "r"(ptr) : IA64_SPINLOCK_CLOBBERS); # endif /* CONFIG_MCKINLEY */ #endif
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line · Keith Owens
Keith> The spinlock code writes to p14. If gcc reuses p14 in the Keith> bundles immediately after the spinlock then we get warning Keith> messages. Append a stop bit to the spinlock code to remove Keith> the warnings. gcc 3.2.3, binutils 2.14.90.0.4.
Keith> {standard input}: Assembler messages: {standard input}:2217:
Keith> Warning: Use of 'tbit.z' violates WAW dependency 'PR%, % in 1 Keith> - 15' (impliedf), specific resource number is 14 {standard Keith> input}:2217: Warning: Only the first path encountering the Keith> conflict is reported {standard input}:2211: Warning: This is Keith> the location of the conflicting usage
Hmmh, in my opinion GCC should put a stop-bit when using a register after an "asm" that marks that register as "clobbered". For now, I put an explicit stop-bit after the McKinley spinlock versions (the Merced ones should be OK because they already have a stop-bit after writing p14). We should still sort out why GCC doesn't get this right.
--david
Quoted 6 lines · David Mosberger
Hmmh, in my opinion GCC should put a stop-bit when using a register after an "asm" that marks that register as "clobbered". For now, I put an explicit stop-bit after the McKinley spinlock versions (the Merced ones should be OK because they already have a stop-bit after writing p14). We should still sort out why GCC doesn't get this right.
I'm not a compiler person, but ...
Seems to me that doing exactly what you're asking for is hard. Editing the inline asm to use a stop-bit if the compiler needs to reuse that register would be a really awful layering violation. But it shouldn't be too hard for p14 to be considered unavailable until the next stop bit has been issued.
Al, want to raise this on the gcc mailing list?
Signature · 6 lines
"Next the statesmen will invent cheap lies, putting the blame upon the nation that is attacked, and every man will be glad of those conscience-soothing falsities, and will diligently study them, and refuse to examine any refutations of them; and thus he will by and by convince himself that the war is just, and will thank God for the better sleep he enjoys after this process of grotesque self-deception." -- Mark Twain