insn seqs: s1:
__builtin_set_float_convert_mode(0); r1 = __builtin_load(a1, a2); r2 = __builtin_float_convert(r1); __builtin_store(a3, r2); __builtin_set_float_convert_mode(0); s2: __builtin_set_float_convert_mode(1); r1 = __builtin_load(a1, a2); r2 = __builtin_float_convert(r1); __builtin_store(a3, r2); __builtin_set_float_convert_mode(0); the diference of s1 and s2 only is "__builtin_set_float_convert_mode" from beginning, the s1 mode is set 0, but s2 mode is set 1. From optimization 'fwprop', the s2 insn seqs is deleted as dead code with compiler option ‘-O3', is it gcc bug ? builtin patten of __builtin_set_float_convert_mode: (define_insn "target_fcvtmode" [(set (reg:SI FCVTMODE_REGNUM) (unspec_volatile:SI [(match_operand:SI 0 "operand" "rK")] UNSPECV_FCVTMODE))] "" "fcvtmode\t%1" ) builtin patten of __builtin_set_float_convert_mode: (define_insn "target_fcvt" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:SF 1 "register_operand" "f")] UNSPEC_FCVT)) (use (reg:SI FCVTMODE_REGNUM))] "" "fcvt\t%0,%1" ) As far as i know, __builtin_set_float_convert_mode depend on 'FCVTMODE_REGNUM' which is from __builtin_set_float_convert_mode, it's not dead code. or something wrong in my pattens ? Anyone could give me some hints ? Thanks Jojo