Olivier Maury <Olivier_maury@xxxxxxxxxx> writes: > I was wondering, is the following assembly code correct: > c94: e8 fc ff ff ff call c95 > <load_param_def_given+0x1d1> > c99: 84 c0 test %al,%al > c9b: dd 45 d0 fldl -0x30(%ebp) > c9e: dd 45 d8 fldl -0x28(%ebp) > ca1: da c9 fcmove %st(1),%st > ca3: dd d9 fstp %st(1) > ca5: dd 5d d0 fstpl -0x30(%ebp) > ca8: 89 f8 mov %edi,%eax > > This code is some optimized assembly code extracted from the object > file using objdump. My concern here is that I have a test instruction > without the corresponding jump ! The test instruction is setting the flags for the fcmove instruction. > That piece of assembly comes from a code that look like: > if (my_function(param1, &out_param)) > value = out_param; > > with : > out_param a double value that is not assigned with a default value > and > char my_function(long param1, double *out) > { > char ret = 0; > ... do some stuff ... > if (some_property) > { > ... do some stuff ... > *out = a_value_computed; > ret = 1; > } > .... > return ret; > } > > And taking that optimized code in a debugger it crash with a FPE from > time to time because even if the my_function returns 0 it seems to do > the assignement (value = out_param) with an unitialized out_param > value ! > > What do you think ? Am I doing something wrong or is it a gcc bug ? It's pretty hard to say anything about an incomplete example. However, fcmove is a conditional move, so the code will only do the move if the value returned is non-zero. I don't see anything wrong in what you have shown us. Ian