I get an internal compiler error with gcc-4.2.1 and my own back-end
when I support conditional execution:

../build/gcc/cc1 -Wall -O1 -o bug.O1.s bug.c

bug.c: In function ‘cond_assign_les0’:
bug.c:13: internal compiler error: in elim_reg_cond, at flow.c:3486


The test C file "bug.c" is:

int cond_assign_les0(int cond, int a, int b)
{
  int res;

  if(cond <= 0) {
    res = a;
  }
  else {
    res = b;
  }
  return(res);
}

int main(int argc, char **argv)
{
  int res = cond_assign_les0(1, 0, 1);
  return(res);
}


My "research" so far:
* This error appeared in older gcc versions and is marked as fixed.
* Support for conditional execution works for EQ and NE, but not for
  the other kinds of condition, eg LE
* The ARM back-end works on the test code above without problems, and
  I implemented support for conditional execution in my back-end the
  same way.
* The RTX code x in elim_reg_cond is "UnKnown" (0), regno=48 is the
  first virtual (not hardware) register (see trace below)


The backtrace is:

#0  elim_reg_cond (x=0x140b4ad90, regno=48) at ../../gcc-4.2.1/gcc/flow.c:3486
#1  0x00000001001bc58f in flush_reg_cond_reg_1 (node=0x1406092c0, data=<value 
temporarily unavailable, due to optimizations>) at 
../../gcc-4.2.1/gcc/flow.c:3192
#2  0x000000010034fa19 in splay_tree_foreach_helper (sp=0x140608e50, 
node=0x1406092c0, fn=0x1001bc530 <flush_reg_cond_reg_1>, data=0x7fff5fbfe4b0) 
at ../../gcc-4.2.1/libiberty/splay-tree.c:218
#3  0x00000001001bd484 in flush_reg_cond_reg [inlined] () at 
/some/path/to/somewhere/gcc-4.2.1/gcc/flow.c:3217
#4  0x00000001001bd484 in mark_regno_cond_dead [inlined] () at 
/some/path/to/somewhere/gcc-4.2.1/gcc/flow.c:3095
#5  0x00000001001bd484 in mark_set_1 (pbi=0x140608df0, code=<value temporarily 
unavailable, due to optimizations>, reg=0x140bfc760, cond=0x0, 
insn=0x140b2d5f0, flags=16) at ../../gcc-4.2.1/gcc/flow.c:2895
#6  0x00000001001bf8a4 in propagate_one_insn (pbi=0x140608df0, 
insn=0x140b2d5f0) at ../../gcc-4.2.1/gcc/flow.c:1864
#7  0x00000001001c009d in propagate_block (bb=0x140bfd680, live=<value 
temporarily unavailable, due to optimizations>, local_set=<value temporarily 
unavailable, due to optimizations>, cond_local_set=<value temporarily 
unavailable, due to optimizations>, flags=1085462000) at 
../../gcc-4.2.1/gcc/flow.c:2218
#8  0x00000001001c0ad3 in update_life_info (blocks=0x140601990, 
extent=UPDATE_LIFE_GLOBAL_RM_NOTES, prop_flags=25) at 
../../gcc-4.2.1/gcc/flow.c:1345
#9  0x00000001001c14b6 in update_life_info_in_dirty_blocks 
(extent=UPDATE_LIFE_GLOBAL_RM_NOTES, prop_flags=25) at 
../../gcc-4.2.1/gcc/flow.c:763
#10 0x00000001002095eb in if_convert (x_life_data_ok=<value temporarily 
unavailable, due to optimizations>) at ../../gcc-4.2.1/gcc/ifcvt.c:3922
#11 0x0000000100209722 in rest_of_handle_if_after_reload () at 
../../gcc-4.2.1/gcc/ifcvt.c:4041
#12 0x00000001002da597 in execute_one_pass (pass=0x10042a080) at 
../../gcc-4.2.1/gcc/passes.c:881
#13 0x00000001002da6f8 in execute_pass_list (pass=0x10042a080) at 
../../gcc-4.2.1/gcc/passes.c:932
#14 0x00000001002da70a in execute_pass_list (pass=0x10042b600) at 
../../gcc-4.2.1/gcc/passes.c:933
#15 0x00000001002da70a in execute_pass_list (pass=0x10042b5a0) at 
../../gcc-4.2.1/gcc/passes.c:933
#16 0x000000010007d5b2 in tree_rest_of_compilation (fndecl=0x140bec1c0) at 
../../gcc-4.2.1/gcc/tree-optimize.c:463
#17 0x000000010000a945 in c_expand_body (fndecl=0x140bec1c0) at 
../../gcc-4.2.1/gcc/c-decl.c:6836
#18 0x0000000100313663 in cgraph_expand_function (node=0x140bfa000) at 
../../gcc-4.2.1/gcc/cgraphunit.c:1244
#19 0x0000000100314c3e in cgraph_expand_all_functions [inlined] () at 
/some/path/to/somewhere/gcc-4.2.1/gcc/cgraphunit.c:1309
#20 0x0000000100314c3e in cgraph_optimize () at 
../../gcc-4.2.1/gcc/cgraphunit.c:1588
#21 0x000000010000d5c2 in c_write_global_declarations () at 
../../gcc-4.2.1/gcc/c-decl.c:7951
#22 0x00000001002b8058 in toplev_main (argc=<value temporarily unavailable, due 
to optimizations>, argv=<value temporarily unavailable, due to optimizations>) 
at ../../gcc-4.2.1/gcc/toplev.c:1046
#23 0x0000000100001604 in start ()


 So, I think it's not a GCC problem, but I do something wrong in my
back-end. What could I have done wrong? Register description?

Thanks in advance,
Boris

Reply via email to