http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53427

--- Comment #1 from Uros Bizjak <ubizjak at gmail dot com> 2012-05-20 19:14:20 
UTC ---
(gdb) bt
#0  save_call_clobbered_regs () at ../../gcc-svn/trunk/gcc/caller-save.c:877
#1  0x0000000000873bd7 in reload (first=0x7ffff1b100c0, global=1) at
../../gcc-svn/trunk/gcc/reload1.c:939
#2  0x00000000007b6488 in do_reload () at ../../gcc-svn/trunk/gcc/ira.c:4261
#3  rest_of_handle_reload () at ../../gcc-svn/trunk/gcc/ira.c:4352
#4  0x0000000000827645 in execute_one_pass (pass=0x1427920) at
../../gcc-svn/trunk/gcc/passes.c:2183
#5  0x0000000000827a05 in execute_pass_list (pass=0x1427920) at
../../gcc-svn/trunk/gcc/passes.c:2238
#6  0x0000000000827a17 in execute_pass_list (pass=0x1428060) at
../../gcc-svn/trunk/gcc/passes.c:2239
#7  0x0000000000616688 in expand_function (node=0x7ffff19b1750) at
../../gcc-svn/trunk/gcc/cgraphunit.c:1603
#8  0x000000000061822b in expand_all_functions () at
../../gcc-svn/trunk/gcc/cgraphunit.c:1708
#9  compile () at ../../gcc-svn/trunk/gcc/cgraphunit.c:2007

(gdb) list
872                       && HARD_REGISTER_P (cheap)
873                       && TEST_HARD_REG_BIT (call_used_reg_set, REGNO
(cheap)))
874                     {
875                       rtx call_set = single_set (insn);
876                       rtx dest = SET_DEST (call_set);
877                       rtx pat = gen_rtx_SET (VOIDmode, cheap,
878                                              copy_rtx (dest));
879                       chain = insert_one_insn (chain, 0, -1, pat);
880                     }
881                 }

(gdb) p call_set
$7 = (rtx_def *) 0x0

(gdb) p debug_rtx (insn)
(call_insn 22 21 25 2 (parallel [
            (set (reg:DI 0 ax)
                (call (mem:QI (symbol_ref:DI ("memcpy") [flags 0x41]
<function_decl 0x7ffff1aee600 memcpy>) [0 memcpy S1 A8])
                    (const_int 0 [0])))
            (unspec [
                    (const_int 2 [0x2])
                ] UNSPEC_CALL_NEEDS_VZEROUPPER)
        ]) pr53427.c:12 632 {*call_value_vzeroupper}
     (expr_list:REG_RETURNED (reg/v/f:DI 2 cx [orig:64 arg ] [64])
        (expr_list:REG_DEAD (reg:DI 5 di)
            (expr_list:REG_DEAD (reg:DI 4 si)
                (expr_list:REG_DEAD (reg:DI 1 dx)
                    (expr_list:REG_UNUSED (reg:DI 0 ax)
                        (expr_list:REG_EH_REGION (const_int 0 [0])
                            (nil)))))))
    (expr_list:REG_FRAME_RELATED_EXPR (set (reg:DI 0 ax)
            (reg:DI 5 di))
        (expr_list:REG_FRAME_RELATED_EXPR (use (reg:DI 5 di))
            (expr_list:REG_FRAME_RELATED_EXPR (use (reg:DI 4 si))
                (expr_list:REG_FRAME_RELATED_EXPR (use (reg:DI 1 dx))
                    (nil))))))

As said elsewhere, tagging call insns with vzeroupper unspecs was not a good
idea. While it worked, it is very fragile and not future proof.

Please look at PR 47440. The fix for that PR will magically avoid failures of
this type.

Reply via email to