https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96559

            Bug ID: 96559
           Summary: Wrong code with -march=z900 -mtune=z9-109
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: marxin at gcc dot gnu.org
                CC: krebbel at gcc dot gnu.org
  Target Milestone: ---
              Host: x86_64-linux-gnu
            Target: s390x-linux-gnu

For the following test-case (reduced from Firefox):

$ cat ff.ii
char compute___trans_tmp_3;
long CountLeadingZeroes64_aValue;
void CeilingLog2() {
  compute___trans_tmp_3 = __builtin_clzll(CountLeadingZeroes64_aValue);
}

we end with:

$ ./xgcc -B. ff.ii -march=z900 -mtune=z9-109 -S -o/dev/stdout -O1
...
.globl __clzdi2
        .align  8
.globl _Z11CeilingLog2v
        .type   _Z11CeilingLog2v, @function
_Z11CeilingLog2v:
.LFB0:
        stmg    %r12,%r15,96(%r15)
.LCFI0:
        aghi    %r15,-160
.LCFI1:
        larl    %r12,.LANCHOR0
        lg      %r2,0(%r12)
        brasl   %r14,__clzdi2
        stc     %r2,8(%r12)
        lg      %r4,272(%r15)
        lmg     %r12,%r15,256(%r15)

which is bogus as __clzdi2 points to the very same place as _Z11CeilingLog2v.
So 
 brasl  %r14,__clzdi2 is an infinite loop.

The .globl for __clzdi2 is emitted in the following back-trace:

Breakpoint 5, default_globalize_label (stream=0x2712300, name=0x7ffff7700d50
"__clzdi2") at /home/marxin/Programming/gcc/gcc/varasm.c:7321
7321      fputs (GLOBAL_ASM_OP, stream);
Missing separate debuginfos, use: zypper install
libmpfr6-debuginfo-4.1.0-1.1.x86_64 libzstd1-debuginfo-1.4.5-2.2.x86_64
(gdb) bt
#0  default_globalize_label (stream=0x2712300, name=0x7ffff7700d50 "__clzdi2")
at /home/marxin/Programming/gcc/gcc/varasm.c:7321
#1  0x000000000125d536 in default_external_libcall (fun=0x7ffff7764648) at
/home/marxin/Programming/gcc/gcc/targhooks.c:107
#2  0x00000000016c5d15 in assemble_external_libcall (fun=0x7ffff7764648) at
/home/marxin/Programming/gcc/gcc/varasm.c:2506
#3  0x0000000000cf28f6 in emit_library_call_value_1 (retval=1,
orgfun=0x7ffff7764648, value=0x0, fn_type=<optimized out>, outmode=E_SImode,
nargs=1, args=<optimized out>) at /home/marxin/Programming/gcc/gcc/calls.c:5272
#4  0x00000000010dd18b in emit_library_call_value (fun=0x7ffff7764648,
value=0x0, fn_type=LCT_CONST, outmode=E_SImode, arg1=0x7ffff7764630,
arg1_mode=E_DImode) at /home/marxin/Programming/gcc/gcc/rtl.h:4245
#5  0x00000000010d06d2 in expand_unop (mode=E_DImode, unoptab=clz_optab,
op0=0x7ffff7764630, target=0x7ffff77644f8, unsignedp=1) at
/home/marxin/Programming/gcc/gcc/optabs.c:3059
#6  0x0000000000cd49d5 in expand_builtin_unop (target_mode=E_SImode,
exp=<call_expr 0x7ffff7758380>, target=0x7ffff77644f8, subtarget=<optimized
out>, op_optab=clz_optab) at /home/marxin/Programming/gcc/gcc/tree.h:3296
#7  0x0000000000cea061 in expand_builtin (exp=<call_expr 0x7ffff7758380>,
target=<optimized out>, subtarget=0x0, mode=E_SImode, ignore=0) at
/home/marxin/Programming/gcc/gcc/builtins.c:8236
#8  0x0000000000e38f5d in expand_expr_real_1 (exp=<call_expr 0x7ffff7758380>,
target=<optimized out>, tmode=E_SImode, modifier=EXPAND_NORMAL,
alt_rtl=0x7fffffffdb48, inner_reference_p=<optimized out>) at
/home/marxin/Programming/gcc/gcc/expr.c:11237
#9  0x0000000000e42281 in store_expr (exp=<call_expr 0x7ffff7758380>,
target=0x7ffff77644f8, call_param_p=<optimized out>, nontemporal=<optimized
out>, reverse=<optimized out>) at /home/marxin/Programming/gcc/gcc/expr.c:5852
#10 0x0000000000e444cf in expand_assignment (to=<ssa_name 0x7ffff75df438 3>,
from=<call_expr 0x7ffff7758380>, nontemporal=<optimized out>) at
/home/marxin/Programming/gcc/gcc/expr.c:5588
#11 0x0000000000d09e34 in expand_call_stmt (stmt=0x7ffff7fc4510) at
/home/marxin/Programming/gcc/gcc/cfgexpand.c:2701
#12 expand_gimple_stmt_1 (stmt=<gimple_call 0x7ffff7fc4510>) at
/home/marxin/Programming/gcc/gcc/cfgexpand.c:3682
#13 expand_gimple_stmt (stmt=<gimple_call 0x7ffff7fc4510>) at
/home/marxin/Programming/gcc/gcc/cfgexpand.c:3847
#14 0x0000000000d0f60b in expand_gimple_basic_block (bb=<optimized out>,
disable_tail_calls=<optimized out>) at
/home/marxin/Programming/gcc/gcc/cfgexpand.c:5888
#15 0x0000000000d110b7 in (anonymous namespace)::pass_expand::execute
(this=<optimized out>, fun=0x7ffff7759000) at
/home/marxin/Programming/gcc/gcc/cfgexpand.c:6572
#16 0x000000000112fd75 in execute_one_pass (pass=<opt_pass* 0x270b2b0
"expand"(245)>) at /home/marxin/Programming/gcc/gcc/passes.c:2509
#17 0x000000000113009a in execute_pass_list_1 (pass=<opt_pass* 0x270b2b0
"expand"(245)>) at /home/marxin/Programming/gcc/gcc/passes.c:2597
#18 0x0000000001130123 in execute_pass_list (fn=0x7ffff7759000, pass=<opt_pass*
0x2707570 "fixup_cfg"(96)>) at /home/marxin/Programming/gcc/gcc/passes.c:2608
#19 0x0000000000d44cec in cgraph_node::expand (this=<cgraph_node * const
0x7ffff775d000 "CeilingLog2"/2>) at
/home/marxin/Programming/gcc/gcc/context.h:48
#20 0x0000000000d462ff in expand_all_functions () at
/home/marxin/Programming/gcc/gcc/cgraphunit.c:2472
#21 symbol_table::compile (this=0x7ffff75d9000) at
/home/marxin/Programming/gcc/gcc/cgraphunit.c:2835
#22 0x0000000000d48713 in symbol_table::compile (this=0x7ffff75d9000) at
/home/marxin/Programming/gcc/gcc/cgraphunit.c:3013
#23 symbol_table::finalize_compilation_unit (this=0x7ffff75d9000) at
/home/marxin/Programming/gcc/gcc/cgraphunit.c:3013
#24 0x0000000001265fae in compile_file () at
/home/marxin/Programming/gcc/gcc/toplev.c:482
#25 0x0000000001269243 in do_compile () at
/home/marxin/Programming/gcc/gcc/toplev.c:2324
#26 0x0000000001269539 in toplev::main (this=0x7fffffffe0de, argc=17,
argv=0x7fffffffe1e8) at /home/marxin/Programming/gcc/gcc/toplev.c:2463
#27 0x0000000001ed6c82 in main (argc=17, argv=0x7fffffffe1e8) at
/home/marxin/Programming/gcc/gcc/main.c:39

Reply via email to