https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80474
Bug ID: 80474
Summary: ipa-cp wrongly adding LO(symbol) twice
Product: gcc
Version: 6.3.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: jan.smets at nokia dot com
Target Milestone: ---
On MIPS, O32
GCC 6.3.1 (does not happen on GCC5, but there it's not similarly optimized by
ipa-cp)
I wasn't yet successful at producing a minimized testcase.
A function is called and one of the arguments is a function pointer.
On mips the symbol is loaded in two steps, the HI and the LO part.
The LO part is an increment and is happening twice, resulting in a bogus
pointer being passed.
409 INITEVENT (PP_MASK_QX, T01, OUTRESEG_DRAM_DATA_ECC_UNCORRECTABLE_0,
0, 1,
"OUTRESEG_DRAM_DATA_ECC_UNCORRE CTABLE_0", ERROR_EVENT,
&decay_ext_dram_unc_err, myFunce);
0x04431644 <+11384>: beqz t4,0x4431730 <InitEventNameTables+11620>
0x04431648 <+11388>: addiu s1,s1,-9260
t4 is zero, so branches to 0x4431730
# BLOCK 530 freq:156 seq:526
# PRED: 543 [69.5%]
$L599:
#(jump_insn 4608 4607 4691 (set (pc)
# (if_then_else (eq (reg:SI 12 $12 [orig:1564 _4488 ] [1564])
# (const_int 0 [0]))
# (label_ref 4678)
# (pc))) myfile.c:409 472 {*branch_equalitysi}
# (int_list:REG_BR_PROB 5000 (nil))
# -> 4678)
beq $12,$0,$L592 # 4608 *branch_equalitysi [length = 4]
#(insn 4691 4608 27788 (set (reg/f:SI 17 $17 [6100])
# (lo_sum:SI (reg/f:SI 17 $17 [6102])
# (symbol_ref:SI ("myFunce") [flags 0x3] <function_decl
0x7f8315a4ce00 myFunce>))) 300 {*lowsi}
# (expr_list:REG_EQUAL (symbol_ref:SI ("myFunce") [flags 0x3]
<function_decl 0x7f8315a4ce00 myFunce>)
# (nil)))
addiu $17,$17,%lo(myFunce) # 4691 *lowsi [length = 4]
s1 is now 0x442dbd4 , which is myFunce()
7737 0x04431730 <+11620>: bnez t2,0x4439a0c <InitEventNameTables+45120>
7738 0x04431734 <+11624>: addiu s1,s1,-9260
t2 is 0x2000, so branches to 0x4439a0c and changes s1 from 0x442dbd4 (correct)
to 0x442b7a8 (incorrect)
# BLOCK 545 freq:78 seq:541
# PRED: 530 [50.0%]
$L592:
#(jump_insn 4680 4679 15195 (set (pc)
# (if_then_else (ne (reg:SI 10 $10 [orig:456 prephitmp_915 ] [456])
# (const_int 0 [0]))
# (label_ref 15192)
# (pc))) myfile.c:409 472 {*branch_equalitysi}
# (int_list:REG_BR_PROB 7002 (nil))
# -> 15192)
bne $10,$0,$L601 # 4680 *branch_equalitysi [length = 4]
#(insn/s 15195 4680 4681 (set (reg/f:SI 17 $17 [6100])
# (lo_sum:SI (reg/f:SI 17 $17 [6102])
# (symbol_ref:SI ("myFunce") [flags 0x3] <function_decl
0x7f8315a4ce00 myFunce>))) 300 {*lowsi}
# (expr_list:REG_EQUAL (symbol_ref:SI ("myFunce") [flags 0x3]
<function_decl 0x7f8315a4ce00 myFunce>)
# (nil)))
addiu $17,$17,%lo(myFunce) # 15195 *lowsi [length = 4]