Register r14 is used for two different values at the same time. $ cat http_core.c int strcmp (const char *, const char *); int printf (const char *, ...); int ap_standalone; const char * ap_check_cmd_context (void *a, int b) { return 0; } const char * server_type (void *a, void *b, char *arg) { const char *err = ap_check_cmd_context (a, 0x01|0x02|0x04|0x08|0x10); if (err) return err; if (!strcmp (arg, "inetd")) ap_standalone = 0; else if (!strcmp (arg, "standalone")) { // printf ("standalone"); ap_standalone = 1; } else return "ServerType must be either 'inetd' or 'standalone'"; return 0; } int main () { server_type (0, 0, "standalone"); } $ gcc -O2 -g http_core.c $ ./a.out Segmentation fault addl r14 = @ltoffx(ap_standalone#), r1 ;; .mii ld8.mov r15 = [r14], ap_standalone# addl r14 = @ltoffx(.LC2), r1 ;; (p7) addl r14 = 1, r0 <--- r14 clobbered ;; .mii (p7) st4 [r15] = r14 nop.i 0 nop.i 0 .mbb ld8.mov r14 = [r14], .LC2 <--- crash Workaround: compile with -fno-sched-interblock or -fno-if-conversion2 or -fno-sched-spec or -fno-schedule-insns.
Confirmed on gcc version 3.3.1 20030703 (prerelease). Preliminary investigations suggest that the culprit is the machine dependent reorganisation pass, which swaps (jump_insn 82 88 122 3 0x401b54c0 (set (pc) (if_then_else (eq (reg:BI 262 p6 [361]) (const_int 0 [0x0])) (label_ref 100) (pc))) 214 {*br_true} (insn_list 81 (nil)) (expr_list:REG_DEAD (reg:BI 262 p6 [361]) (expr_list:REG_BR_PROB (const_int 5000 [0x1388]) (nil)))) (insn 96 122 159 4 0x401b54c0 (set (reg/f:DI 14 r14 [340]) (lo_sum:DI (reg:DI 14 r14 [365]) (symbol_ref/f:DI ("*.LC2")))) 12 {*load_symptr_low} (nil) (expr_list:REG_EQUAL (symbol_ref/f:DI ("*.LC2")) (nil))) to produce .mbb ld8 r14 = [r14] (p7) br.cond.dptk .L4 I don't know enough of IA-64 to say whether swapping back the instructions in the assembly file is sufficient, or whether they should not have ended up in the same bundle in the first place.
Replacing: .mii (p7) st4 [r15] = r14 nop.i 0 nop.i 0 .mbb ld8.mov r14 = [r14], .LC2 (p7) br.cond.dptk .L5 br .L2 ;; with: .mib (p7) st4 [r15] = r14 nop.i 0 (p7) br.cond.dptk .L5 .mbb ld8.mov r14 = [r14], .LC2 nop.b 0 br .L2 ;; (thus effectively undoing the swapping) produces working code.
Thanks. I think I've found the root of the problem and even a possible solution, but I'll need your help for testing because I don't have access to IA-64 hardware.
Postponed until GCC 3.3.2; IA64 is not a primary platform.
*** Bug 11399 has been marked as a duplicate of this bug. ***
Subject: Bug 11320 CVSROOT: /cvs/gcc Module name: gcc Changes by: ebotcazou@gcc.gnu.org 2003-07-15 13:02:21 Modified files: gcc : ChangeLog sched-deps.c sched-ebb.c sched-int.h sched-rgn.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/gcc.c-torture/execute: 20030715-1.c Log message: PR optimization/11320 * sched-int.h (struct deps) [reg_conditional_sets]: New field. (struct sched_info) [compute_jump_reg_dependencies]: New prototype. * sched-deps.c (sched_analyze_insn) [JUMP_INSN]: Update call to current_sched_info->compute_jump_reg_dependencies. Record which registers are used and which registers are set by the jump. Clear deps->reg_conditional_sets after a barrier. Set deps->reg_conditional_sets if the insn is a COND_EXEC. Clear deps->reg_conditional_sets if the insn is not a COND_EXEC. (init_deps): Initialize reg_conditional_sets. (free_deps): Clear reg_conditional_sets. * sched-ebb.c (compute_jump_reg_dependencies): New prototype. Mark registers live on entry of the fallthrough block and conditionally set as set by the jump. Mark registers live on entry of non-fallthrough blocks as used by the jump. * sched-rgn.c (compute_jump_reg_dependencies): New prototype. Mark new parameters as unused. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.511&r2=2.512 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/sched-deps.c.diff?cvsroot=gcc&r1=1.59&r2=1.60 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/sched-ebb.c.diff?cvsroot=gcc&r1=1.29&r2=1.30 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/sched-int.h.diff?cvsroot=gcc&r1=1.27&r2=1.28 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/sched-rgn.c.diff?cvsroot=gcc&r1=1.60&r2=1.61 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.2877&r2=1.2878 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/20030715-1.c.diff?cvsroot=gcc&r1=NONE&r2=1.1
Subject: Bug 11320 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_3-branch Changes by: ebotcazou@gcc.gnu.org 2003-07-15 13:09:15 Modified files: gcc : ChangeLog sched-deps.c sched-ebb.c sched-int.h sched-rgn.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/gcc.c-torture/execute: 20030715-1.c Log message: PR optimization/11320 * sched-int.h (struct deps) [reg_conditional_sets]: New field. (struct sched_info) [compute_jump_reg_dependencies]: New prototype. * sched-deps.c (sched_analyze_insn) [JUMP_INSN]: Update call to current_sched_info->compute_jump_reg_dependencies. Record which registers are used and which registers are set by the jump. Clear deps->reg_conditional_sets after a barrier. Set deps->reg_conditional_sets if the insn is a COND_EXEC. Clear deps->reg_conditional_sets if the insn is not a COND_EXEC. (init_deps): Initialize reg_conditional_sets. (free_deps): Clear reg_conditional_sets. * sched-ebb.c (compute_jump_reg_dependencies): New prototype. Mark registers live on entry of the fallthrough block and conditionally set as set by the jump. Mark registers live on entry of non-fallthrough blocks as used by the jump. * sched-rgn.c (compute_jump_reg_dependencies): New prototype. Mark new parameters as unused. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.16114.2.658&r2=1.16114.2.659 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/sched-deps.c.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.49&r2=1.49.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/sched-ebb.c.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.17&r2=1.17.20.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/sched-int.h.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.23&r2=1.23.4.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/sched-rgn.c.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.50&r2=1.50.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.2261.2.233&r2=1.2261.2.234 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/20030715-1.c.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=NONE&r2=1.1.2.1
See http://gcc.gnu.org/ml/gcc-patches/2003-07/msg01044.html
Subject: Bug 11320 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_2-rhl8-branch Changes by: jakub@gcc.gnu.org 2004-02-28 11:22:23 Modified files: gcc : ChangeLog sched-deps.c sched-ebb.c sched-int.h sched-rgn.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/gcc.c-torture/execute: 20030715-1.c Log message: 2003-07-15 Eric Botcazou <ebotcazou@libertysurf.fr> PR optimization/11320 * sched-int.h (struct deps) [reg_conditional_sets]: New field. (struct sched_info) [compute_jump_reg_dependencies]: New prototype. * sched-deps.c (sched_analyze_insn) [JUMP_INSN]: Update call to current_sched_info->compute_jump_reg_dependencies. Record which registers are used and which registers are set by the jump. Clear deps->reg_conditional_sets after a barrier. Set deps->reg_conditional_sets if the insn is a COND_EXEC. Clear deps->reg_conditional_sets if the insn is not a COND_EXEC. (init_deps): Initialize reg_conditional_sets. (free_deps): Clear reg_conditional_sets. * sched-ebb.c (compute_jump_reg_dependencies): New prototype. Mark registers live on entry of the fallthrough block and conditionally set as set by the jump. Mark registers live on entry of non-fallthrough blocks as used by the jump. * sched-rgn.c (compute_jump_reg_dependencies): New prototype. Mark new parameters as unused. * gcc.c-torture/execute/20030715-1.c: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-rhl8-branch&r1=1.13152.2.657.2.27.2.186&r2=1.13152.2.657.2.27.2.187 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/sched-deps.c.diff?cvsroot=gcc&only_with_tag=gcc-3_2-rhl8-branch&r1=1.34.6.1.2.3&r2=1.34.6.1.2.4 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/sched-ebb.c.diff?cvsroot=gcc&only_with_tag=gcc-3_2-rhl8-branch&r1=1.8.12.4&r2=1.8.12.5 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/sched-int.h.diff?cvsroot=gcc&only_with_tag=gcc-3_2-rhl8-branch&r1=1.18.2.1.4.1.2.2&r2=1.18.2.1.4.1.2.3 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/sched-rgn.c.diff?cvsroot=gcc&only_with_tag=gcc-3_2-rhl8-branch&r1=1.32.2.3.8.2&r2=1.32.2.3.8.3 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-rhl8-branch&r1=1.1672.2.166.2.8.2.77&r2=1.1672.2.166.2.8.2.78 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/20030715-1.c.diff?cvsroot=gcc&only_with_tag=gcc-3_2-rhl8-branch&r1=NONE&r2=1.1.34.1
Author: bernds Date: Thu Jul 14 17:06:33 2011 New Revision: 176280 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=176280 Log: PR rtl-optimization/11320 * config/ia64/ia64.md (load_symptr_low): Show a MEM. * config/ia64/ia64.c (ia64_expand_load_address): Generate it. Modified: trunk/gcc/ChangeLog trunk/gcc/config/ia64/ia64.c trunk/gcc/config/ia64/ia64.md
Author: bernds Date: Fri Jul 15 13:20:10 2011 New Revision: 176315 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=176315 Log: Revert 2003-07-10 Eric Botcazou <ebotcazou@libertysurf.fr> PR rtl-optimization/11320 * sched-int.h (struct deps) [reg_conditional_sets]: New field. (struct sched_info) [compute_jump_reg_dependencies]: New prototype. * sched-deps.c (sched_analyze_insn) [JUMP_INSN]: Update call to current_sched_info->compute_jump_reg_dependencies. Record which registers are used and which registers are set by the jump. Clear deps->reg_conditional_sets after a barrier. Set deps->reg_conditional_sets if the insn is a COND_EXEC. Clear deps->reg_conditional_sets if the insn is not a COND_EXEC. (init_deps): Initialize reg_conditional_sets. (free_deps): Clear reg_conditional_sets. * sched-ebb.c (compute_jump_reg_dependencies): New prototype. Mark registers live on entry of the fallthrough block and conditionally set as set by the jump. Mark registers live on entry of non-fallthrough blocks as used by the jump. * sched-rgn.c (compute_jump_reg_dependencies): New prototype. Mark new parameters as unused. Modified: trunk/gcc/ChangeLog trunk/gcc/modulo-sched.c trunk/gcc/sched-deps.c trunk/gcc/sched-ebb.c trunk/gcc/sched-int.h trunk/gcc/sched-rgn.c