On Thu, Jan 19, 2006 at 04:35:17PM -0700, Walter Szeliga wrote: > Hello, > It appears that although the most recent svn update (Revision > 109975) of gcc compiles apparently fine, simple OpenMP programs will > only operate when OMP_NUM_THREADS=1. I am compiling and running gcc > on a Dual CPU G5 PowerPC running OS X 10.4.4. If I compile > omp_hello.c from testsuite/libgomp.c with > > gcc -fopenmp omp_hello.c -o omp_hello -lgomp > > then the program reports that 1 thread is created. If I then set > OMP_NUM_THREADS=2, omp_hello hangs. If one runs recomplies this > program, runs it in gdb and Ctrl-C's it when it hangs, here is the > backtrace generated
Yeah, that's a known thing, libgomp is miscompiled on PowerPC. > > #0 0x900c48fc in sem_wait () > #1 0x00020c24 in gomp_sem_wait (sem=0x222c4) at ../../../gomp/ > libgomp/config/posix/sem.c:44 > #2 0x00020d68 in gomp_barrier_wait_end (bar=0x22298, > last=4294967295) at ../../../gomp/libgomp/config/posix/bar.c:92 > #3 0x000202f8 in gomp_team_start (fn=0x2a08 <main.omp_fn.0>, > data=0x0, nthreads=2, work_share=0x0) at ../../../gomp/libgomp/team.c: > 293 > #4 0x000029e0 in main (argc=1, argv=0xbffff714) at omp_hello.c:33 On redhat/gcc-4_1-branch (which has also a gomp branch backport) I'm using following patch that cures it, but I bet it won't apply cleanly to the trunk. 2005-11-25 Jakub Jelinek <[EMAIL PROTECTED]> * config/rs6000/rs6000.md (UNSPEC_LWSYNC, UNSPEC_ISYNC, UNSPEC_SYNC_OP, UNSPEC_ATOMIC, UNSPEC_CMPXCHG, UNSPEC_XCHG): Rename to... (UNSPECV_LWSYNC, UNSPECV_ISYNC, UNSPECV_SYNC_OP, UNSPECV_ATOMIC, UNSPECV_CMPXCHG, UNSPECV_XCHG): ... these. * config/rs6000/sync.md: Adjust for the above changes, use unspec_volatile instead of unspec for UNSPECV_{SYNC_OP,ATOMIC,CMPXCHG,XCHG}. --- gcc/config/rs6000/sync.md.jj 2005-11-24 13:24:35.000000000 +0100 +++ gcc/config/rs6000/sync.md 2005-11-25 10:43:31.000000000 +0100 @@ -70,10 +70,10 @@ [(set (match_operand:GPR 0 "gpc_reg_operand" "=&r") (match_operand:GPR 1 "memory_operand" "+Z")) (set (match_dup 1) - (unspec:GPR + (unspec_volatile:GPR [(match_operand:GPR 2 "reg_or_short_operand" "rI") (match_operand:GPR 3 "gpc_reg_operand" "r")] - UNSPEC_CMPXCHG)) + UNSPECV_CMPXCHG)) (clobber (match_scratch:GPR 4 "=&r")) (clobber (match_scratch:CC 5 "=&x"))] "TARGET_POWERPC" @@ -90,9 +90,9 @@ [(set (match_operand:GPR 0 "gpc_reg_operand" "=&r") (match_operand:GPR 1 "memory_operand" "+Z")) (set (match_dup 1) - (unspec:GPR + (unspec_volatile:GPR [(match_operand:GPR 2 "reg_or_short_operand" "rL")] - UNSPEC_XCHG)) + UNSPECV_XCHG)) (clobber (match_scratch:GPR 3 "=&r")) (clobber (match_scratch:CC 4 "=&x"))] "TARGET_POWERPC" @@ -107,10 +107,10 @@ (define_expand "sync_<fetchop_name><mode>" [(parallel [(set (match_operand:INT1 0 "memory_operand" "") - (unspec:INT1 + (unspec_volatile:INT1 [(FETCHOP:INT1 (match_dup 0) (match_operand:INT1 1 "<fetchop_pred>" ""))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (scratch:INT1)) (clobber (scratch:CC))])] "TARGET_POWERPC" @@ -128,10 +128,10 @@ (define_insn_and_split "*sync_<fetchop_name>si_internal" [(set (match_operand:SI 0 "memory_operand" "+Z") - (unspec:SI + (unspec_volatile:SI [(FETCHOP:SI (match_dup 0) (match_operand:SI 1 "<fetchop_pred>" "<fetchopsi_constr>"))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (match_scratch:SI 2 "=&b")) (clobber (match_scratch:CC 3 "=&x"))] "TARGET_POWERPC" @@ -146,10 +146,10 @@ (define_insn_and_split "*sync_<fetchop_name>di_internal" [(set (match_operand:DI 0 "memory_operand" "+Z") - (unspec:DI + (unspec_volatile:DI [(FETCHOP:DI (match_dup 0) (match_operand:DI 1 "<fetchop_pred>" "<fetchopdi_constr>"))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (match_scratch:DI 2 "=&b")) (clobber (match_scratch:CC 3 "=&x"))] "TARGET_POWERPC" @@ -164,10 +164,10 @@ (define_expand "sync_nand<mode>" [(parallel [(set (match_operand:INT1 0 "memory_operand" "") - (unspec:INT1 + (unspec_volatile:INT1 [(and:INT1 (not:INT1 (match_dup 0)) (match_operand:INT1 1 "gpc_reg_operand" ""))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (scratch:INT1)) (clobber (scratch:CC))])] "TARGET_POWERPC" @@ -187,10 +187,10 @@ (define_insn_and_split "*sync_nand<mode>_internal" [(set (match_operand:GPR 0 "memory_operand" "+Z") - (unspec:GPR + (unspec_volatile:GPR [(and:GPR (not:GPR (match_dup 0)) (match_operand:GPR 1 "gpc_reg_operand" "r"))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (match_scratch:GPR 2 "=&r")) (clobber (match_scratch:CC 3 "=&x"))] "TARGET_POWERPC" @@ -207,10 +207,10 @@ [(parallel [(set (match_operand:INT1 0 "gpc_reg_operand" "") (match_operand:INT1 1 "memory_operand" "")) (set (match_dup 1) - (unspec:INT1 + (unspec_volatile:INT1 [(FETCHOP:INT1 (match_dup 1) (match_operand:INT1 2 "<fetchop_pred>" ""))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (scratch:INT1)) (clobber (scratch:CC))])] "TARGET_POWERPC" @@ -230,10 +230,10 @@ [(set (match_operand:SI 0 "gpc_reg_operand" "=&r") (match_operand:SI 1 "memory_operand" "+Z")) (set (match_dup 1) - (unspec:SI + (unspec_volatile:SI [(FETCHOP:SI (match_dup 1) (match_operand:SI 2 "<fetchop_pred>" "<fetchopsi_constr>"))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (match_scratch:SI 3 "=&b")) (clobber (match_scratch:CC 4 "=&x"))] "TARGET_POWERPC" @@ -250,10 +250,10 @@ [(set (match_operand:DI 0 "gpc_reg_operand" "=&r") (match_operand:DI 1 "memory_operand" "+Z")) (set (match_dup 1) - (unspec:DI + (unspec_volatile:DI [(FETCHOP:DI (match_dup 1) (match_operand:DI 2 "<fetchop_pred>" "<fetchopdi_constr>"))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (match_scratch:DI 3 "=&b")) (clobber (match_scratch:CC 4 "=&x"))] "TARGET_POWERPC" @@ -270,10 +270,10 @@ [(parallel [(set (match_operand:INT1 0 "gpc_reg_operand" "") (match_operand:INT1 1 "memory_operand" "")) (set (match_dup 1) - (unspec:INT1 + (unspec_volatile:INT1 [(and:INT1 (not:INT1 (match_dup 1)) (match_operand:INT1 2 "gpc_reg_operand" ""))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (scratch:INT1)) (clobber (scratch:CC))])] "TARGET_POWERPC" @@ -295,10 +295,10 @@ [(set (match_operand:GPR 0 "gpc_reg_operand" "=&r") (match_operand:GPR 1 "memory_operand" "+Z")) (set (match_dup 1) - (unspec:GPR + (unspec_volatile:GPR [(and:GPR (not:GPR (match_dup 1)) (match_operand:GPR 2 "gpc_reg_operand" "r"))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (match_scratch:GPR 3 "=&r")) (clobber (match_scratch:CC 4 "=&x"))] "TARGET_POWERPC" @@ -317,9 +317,9 @@ (match_operand:INT1 1 "memory_operand" "") (match_operand:INT1 2 "<fetchop_pred>" ""))) (set (match_dup 1) - (unspec:INT1 + (unspec_volatile:INT1 [(FETCHOP:INT1 (match_dup 1) (match_dup 2))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (scratch:INT1)) (clobber (scratch:CC))])] "TARGET_POWERPC" @@ -341,9 +341,9 @@ (match_operand:SI 1 "memory_operand" "+Z") (match_operand:SI 2 "<fetchop_pred>" "<fetchopsi_constr>"))) (set (match_dup 1) - (unspec:SI + (unspec_volatile:SI [(FETCHOP:SI (match_dup 1) (match_dup 2))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (match_scratch:SI 3 "=&b")) (clobber (match_scratch:CC 4 "=&x"))] "TARGET_POWERPC" @@ -362,9 +362,9 @@ (match_operand:DI 1 "memory_operand" "+Z") (match_operand:DI 2 "<fetchop_pred>" "<fetchopdi_constr>"))) (set (match_dup 1) - (unspec:DI + (unspec_volatile:DI [(FETCHOP:DI (match_dup 1) (match_dup 2))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (match_scratch:DI 3 "=&b")) (clobber (match_scratch:CC 4 "=&x"))] "TARGET_POWERPC" @@ -383,9 +383,9 @@ (not:INT1 (match_operand:INT1 1 "memory_operand" "")) (match_operand:INT1 2 "gpc_reg_operand" ""))) (set (match_dup 1) - (unspec:INT1 + (unspec_volatile:INT1 [(and:INT1 (not:INT1 (match_dup 1)) (match_dup 2))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (scratch:INT1)) (clobber (scratch:CC))])] "TARGET_POWERPC" @@ -409,9 +409,9 @@ (not:GPR (match_operand:GPR 1 "memory_operand" "+Z")) (match_operand:GPR 2 "gpc_reg_operand" "r"))) (set (match_dup 1) - (unspec:GPR + (unspec_volatile:GPR [(and:GPR (not:GPR (match_dup 1)) (match_dup 2))] - UNSPEC_ATOMIC)) + UNSPECV_ATOMIC)) (clobber (match_scratch:GPR 3 "=&r")) (clobber (match_scratch:CC 4 "=&x"))] "TARGET_POWERPC" @@ -469,10 +469,11 @@ (and:SI (not:SI (match_dup 4)) (match_dup 0)))) (set (match_operand:SI 3 "gpc_reg_operand" "=&b") (match_dup 0)) (set (match_dup 0) - (unspec:SI [(ior:SI (and:SI (plus:SI (match_dup 0) (match_dup 1)) - (match_dup 4)) - (and:SI (not:SI (match_dup 4)) (match_dup 0)))] - UNSPEC_SYNC_OP)) + (unspec_volatile:SI + [(ior:SI (and:SI (plus:SI (match_dup 0) (match_dup 1)) + (match_dup 4)) + (and:SI (not:SI (match_dup 4)) (match_dup 0)))] + UNSPECV_SYNC_OP)) (clobber (match_scratch:CC 5 "=&x")) (clobber (match_scratch:SI 6 "=&r"))] "TARGET_POWERPC && !PPC405_ERRATUM77" @@ -487,10 +488,11 @@ (and:SI (not:SI (match_dup 4)) (match_dup 0)))) (set (match_operand:SI 3 "gpc_reg_operand" "=&b") (match_dup 0)) (set (match_dup 0) - (unspec:SI [(ior:SI (and:SI (minus:SI (match_dup 0) (match_dup 1)) - (match_dup 4)) - (and:SI (not:SI (match_dup 4)) (match_dup 0)))] - UNSPEC_SYNC_OP)) + (unspec_volatile:SI + [(ior:SI (and:SI (minus:SI (match_dup 0) (match_dup 1)) + (match_dup 4)) + (and:SI (not:SI (match_dup 4)) (match_dup 0)))] + UNSPECV_SYNC_OP)) (clobber (match_scratch:CC 5 "=&x")) (clobber (match_scratch:SI 6 "=&r"))] "TARGET_POWERPC && !PPC405_ERRATUM77" @@ -503,8 +505,8 @@ (match_operand:SI 1 "and_operand" "r,T,K,L"))) (set (match_operand:SI 3 "gpc_reg_operand" "=&b,&b,&b,&b") (match_dup 0)) (set (match_dup 0) - (unspec:SI [(and:SI (match_dup 0) (match_dup 1))] - UNSPEC_SYNC_OP)) + (unspec_volatile:SI [(and:SI (match_dup 0) (match_dup 1))] + UNSPECV_SYNC_OP)) (clobber (match_scratch:CC 4 "=&x,&x,&x,&x"))] "TARGET_POWERPC && !PPC405_ERRATUM77" "@ @@ -520,7 +522,7 @@ [(match_operand:SI 0 "memory_operand" "+Z,Z,Z") (match_operand:SI 1 "logical_operand" "r,K,L")])) (set (match_operand:SI 3 "gpc_reg_operand" "=&b,&b,&b") (match_dup 0)) - (set (match_dup 0) (unspec:SI [(match_dup 4)] UNSPEC_SYNC_OP)) + (set (match_dup 0) (unspec_volatile:SI [(match_dup 4)] UNSPECV_SYNC_OP)) (clobber (match_scratch:CC 5 "=&x,&x,&x"))] "TARGET_POWERPC && !PPC405_ERRATUM77" "@ @@ -540,7 +542,7 @@ (match_operand:SI 5 "logical_operand" "rK")) (match_operand:SI 1 "gpc_reg_operand" "r")])) (set (match_operand:SI 3 "gpc_reg_operand" "=&b") (match_dup 0)) - (set (match_dup 0) (unspec:SI [(match_dup 4)] UNSPEC_SYNC_OP)) + (set (match_dup 0) (unspec_volatile:SI [(match_dup 4)] UNSPECV_SYNC_OP)) (clobber (match_scratch:CC 6 "=&x"))] "TARGET_POWERPC && !PPC405_ERRATUM77" "lwarx %3,%y0\n\txor%I2 %2,%3,%5\n\t%q4 %2,%2,%1\n\tstwcx. %2,%y0\n\tbne- $-16" @@ -548,7 +550,7 @@ (define_insn "isync" [(set (mem:BLK (match_scratch 0 "X")) - (unspec_volatile:BLK [(mem:BLK (match_scratch 1 "X"))] UNSPEC_ISYNC))] + (unspec_volatile:BLK [(mem:BLK (match_scratch 1 "X"))] UNSPECV_ISYNC))] "" "{ics|isync}" [(set_attr "type" "isync")]) @@ -567,7 +569,7 @@ ; Some AIX assemblers don't accept lwsync, so we use a .long. (define_insn "lwsync" [(set (mem:BLK (match_scratch 0 "X")) - (unspec_volatile:BLK [(mem:BLK (match_scratch 1 "X"))] UNSPEC_LWSYNC))] + (unspec_volatile:BLK [(mem:BLK (match_scratch 1 "X"))] UNSPECV_LWSYNC))] "" ".long 0x7c2004ac" [(set_attr "type" "sync")]) --- gcc/config/rs6000/rs6000.c.jj 2005-11-24 13:24:35.000000000 +0100 +++ gcc/config/rs6000/rs6000.c 2005-11-25 10:46:23.000000000 +0100 @@ -12076,9 +12076,9 @@ rs6000_emit_sync (enum rtx_code code, en set_after = gen_rtx_SET (VOIDmode, after, the_op); set_before = gen_rtx_SET (VOIDmode, before, used_m); set_atomic = gen_rtx_SET (VOIDmode, used_m, - gen_rtx_UNSPEC (used_mode, + gen_rtx_UNSPEC_VOLATILE (used_mode, gen_rtvec (1, the_op), - UNSPEC_SYNC_OP)); + UNSPECV_SYNC_OP)); cc_scratch = gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (CCmode)); if ((code == PLUS || code == MINUS) && used_mode != mode) --- gcc/config/rs6000/rs6000.md.jj 2005-11-24 13:24:35.000000000 +0100 +++ gcc/config/rs6000/rs6000.md 2005-11-25 10:45:27.000000000 +0100 @@ -61,12 +61,6 @@ (UNSPEC_SP_SET 35) (UNSPEC_SP_TEST 36) (UNSPEC_SYNC 37) - (UNSPEC_LWSYNC 38) - (UNSPEC_ISYNC 39) - (UNSPEC_SYNC_OP 40) - (UNSPEC_ATOMIC 41) - (UNSPEC_CMPXCHG 42) - (UNSPEC_XCHG 43) (UNSPEC_AND 44) ]) @@ -79,6 +73,12 @@ (UNSPECV_LL 1) ; load-locked (UNSPECV_SC 2) ; store-conditional (UNSPECV_EH_RR 9) ; eh_reg_restore + (UNSPECV_LWSYNC 38) + (UNSPECV_ISYNC 39) + (UNSPECV_SYNC_OP 40) + (UNSPECV_ATOMIC 41) + (UNSPECV_CMPXCHG 42) + (UNSPECV_XCHG 43) ]) ;; Define an insn type attribute. This is used in function unit delay Jakub