https://gcc.gnu.org/bugzilla/show_bug.cgi?id=22326
--- Comment #17 from luoxhu at gcc dot gnu.org --- (In reply to rsand...@gcc.gnu.org from comment #16) > > 2) mad2.c > > > > float foo (double x, float y, float z) > > { > > return ( y * fabs (x) + z ); > > } > > > > > > mad2.c.098t.cunrolli: > > > > foo (double x, float y, float z) > > { > > double _1; > > double _2; > > double _3; > > double _4; > > double _5; > > float _9; > > > > <bb 2> [local count: 1073741824]: > > _1 = (double) y_6(D); > > _2 = ABS_EXPR <x_7(D)>; > > _3 = _1 * _2; > > _4 = (double) z_8(D); > > _5 = _3 + _4; > > _9 = (float) _5; > > return _9; > > > > } > > > > mad2.c.099t.backprop: > > > > [USE] _9 in return _9; > > [USE] _5 in _9 = (float) _5; > > _5: convert from float to double not important > > [DEF] Recording new information for _5 = _3 + _4; > > _5: convert from float to double not important > > [USE] _4 in _5 = _3 + _4; > > _4: convert from float to double not important > > [DEF] Recording new information for _4 = (double) z_8(D); > > _4: convert from float to double not important > > [USE] _3 in _5 = _3 + _4; > > _3: convert from float to double not important > > [DEF] Recording new information for _3 = _1 * _2; > > _3: convert from float to double not important > > [USE] _2 in _3 = _1 * _2; > > _2: convert from float to double not important > > [DEF] Recording new information for _2 = ABS_EXPR <x_7(D)>; > > _2: convert from float to double not important > > [USE] _1 in _3 = _1 * _2; > > _1: convert from float to double not important > > [DEF] Recording new information for _1 = (double) y_6(D); > > _1: convert from float to double not important > > > > Deleting _4 = (double) z_8(D); > > Deleting _1 = (double) y_6(D); > > > > > > EMERGENCY DUMP: > > > > __attribute__((noinline)) > > foo (double x, float y, float z) > > { > > double _2; > > double _3; > > double _5; > > float _9; > > > > <bb 2> [local count: 1073741824]: > > _2 = ABS_EXPR <x_7(D)>; > > _3 = _2 * y_6(D); > > _5 = _3 + z_8(D); > > _9 = (float) _5; > > return _9; > > > > } > Maybe I'm misunderstanding the point, but isn't this > just an issue with the way that the results of the > analysis are applied to the IL, rather than a problem > in the analysis itself? Yes, the optimize operations on Gimple is a bit uncertain. Do you mean add convert from double to float at proper place like below to avoid ICE caused by type mismatch ICE in verify_ssa? Which one will be better, and whether it is correct for all kind of math operations like pow/exp, etc under fast-math? If so, no cancelling is needed again as Richi mentioned? 1) convert before ABS_EXPR: foo (double x, float y, float z) { float _9; float _11; float _12; float _13; float _14; <bb 2> [local count: 1073741824]: _11 = (float) x_6(D); _12 = ABS_EXPR <_11>; _13 = y_7(D) * _12; _14 = z_8(D) + _13; _9 = _14; return _9; } foo: .LFB0: .cfi_startproc frsp 0,1 fabs 0,0 fmadds 1,2,0,3 blr 2) OR convert after ABS_EXPR: foo (double x, float y, float z) { double _1; float _9; float _11; float _12; float _13; <bb 2> [local count: 1073741824]: _1 = ABS_EXPR <x_6(D)>; _11 = (float) _1; _12 = y_7(D) * _11; _13 = z_8(D) + _12; _9 = _13; return _9; } foo: .LFB0: .cfi_startproc fabs 0,1 frsp 0,0 fmadds 1,2,0,3 blr