This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Need help with PR71976 combine.c::get_last_value returns a wrong result


On Mon, Jul 25, 2016 at 02:28:28PM +0200, Georg-Johann Lay wrote:
> (insn 43 31 44 2 (set (reg:QI 18 r18)
>         (const_int 0 [0])) bug-combin.c:29 56 {movqi_insn}
>      (nil))

> (insn 51 50 52 2 (set (reg:QI 16 r16)
>         (const_int 40 [0x28])) bug-combin.c:29 56 {movqi_insn}
>      (nil))
> (insn 52 51 61 2 (set (reg:DI 18 r18)
>         (ashiftrt:DI (reg:DI 18 r18)
>             (reg:QI 16 r16))) bug-combin.c:29 1417 {ashrdi3_insn}
>      (expr_list:REG_DEAD (reg:QI 16 r16)
>         (nil)))

>       /* An arithmetic right shift of a quantity known to be -1 or 0
> 	 is a no-op.  */
>       if (code == ASHIFTRT
> 	  && (num_sign_bit_copies (varop, shift_mode)
> 	      == GET_MODE_PRECISION (shift_mode)))
> 	{
> 	  count = 0;
> 	  break;
> 	}
> 
> num_sign_bit_copies() eventually calls 
> combine.c::reg_num_sign_bit_copies_for_combine()
> 
> which returns const0_rtx because reg 18 is set in insn 43 to const0_rtx.  
> Total outcome is that the right shift of reg:DI 18 is transformed to a 
> no-op move and cancelled out in the remainder.

Why does num_sign_bit_copies return something bigger than 8?

> IIUC get_last_value should return 0 in this case?
> 
>   /* If we don't have a value, or if it isn't for this basic block and
>      it's either a hard register, set more than once, or it's a live
>      at the beginning of the function, return 0.

We do have a value, and it is for this bb.


Segher


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]