https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81357

--- Comment #10 from Qing Zhao <qing.zhao at oracle dot com> ---
the following is my conclusion on this bug based on previous discussion and
study, for this testing case:

  1. due to the fact that  "mov" and "uxtw" are the same instruction, the
assembly generated by -O1 and -O2 are exactly the same except 
     A. the order of the instructions (this is due to the instruction
scheduling applied in -O2). 
     B. the registers used in difference instructions. 

  2. I agree with Wilco's comments in comment 7:
"The compiler believes there are 2 distinct values so it uses 2 registers
irrespectively of the order"

i.e, for the testing case:

 1 unsigned long long d;
 2 unsigned int test1(unsigned int fParm)
 3 {
 4   d = fParm + 1;
 5   return fParm + 1;
 6 }

at line 4 and 5,  the result of fparm + 1 has two different usages:
        * one is at line 4,  convert to unsigned long long first,  and then
assign to the global d;
        * the other is at line 5, directly return as the return result of the
routine. 

the compiler has to use 2 different registers for these two different values. 

So, I think that the compiler does NOT do anything wrong for this testing case.
the additional "mov" or "uxtw" instruction that is claimed in comment 1
actually is necessary and should NOT be deleted. 

I think that this bug could be closed as not a bug.

Reply via email to