On Fri, Oct 10, 2008 at 10:40 AM, Dave Korn <[EMAIL PROTECTED]> wrote:
> Ian Lance Taylor wrote on 10 October 2008 15:53:
>
>> "Omar Torres" <[EMAIL PROTECTED]> writes:
>>
>>>  The problem is that both, the quotient and reminder, registers are
>>> getting marked with a REG_UNUSED note:
>>>
>>>  (insn 12 11 17 (parallel [
>>>             (set (reg:SI 1 %r3 [33])
>>>                 (div:SI (reg:SI 1 %r3 [30])
>>>                     (reg:SI 5 %iph [orig:31 current ] [31])))
>>>             (set (reg:SI 5 %iph [34])
>>>                 (mod:SI (reg:SI 1 %r3 [30])
>>>                     (reg:SI 5 %iph [orig:31 current ] [31])))
>>>         ]) 56 {*divmodsi4} (insn_list:REG_DEP_TRUE 10
>>> (insn_list:REG_DEP_TRUE 11 (nil)))
>>>     (expr_list:REG_UNUSED (reg:SI 5 %iph [34])
>>>         (expr_list:REG_UNUSED (reg:QI 2 %r2)
>>>             (expr_list:REG_UNUSED (reg:QI 1 %r3)
>>>                 (nil)))))
>>>
>>> Any suggestions on how I might be able to work around this?
>>
>> This makes it sounds like the whole insn is useless.  I wonder why it
>> hasn't simply been deleted?
>
>  Is it not unusual that the insn sets r1 in SImode, but the note says it is
> unused in QImode?  Does that mean only the lowest byte is unused?
>
>    cheers,
>      DaveK
> --
> Can't think of a witty .sigline today....
>
>

 Hi, thanks for the comments.

 A closer look revealed that this insn is not deleted because it is
needed to (partially) set (reg:SI 33).
 But, as Dave suggested, only the lower part of the quotient is used
afterwards. Below is the src code and the corresponding basic block.

 I suspect that a workaround will be to look not only for the presence
of the REG_UNUSED note, but check check the reg's mode as well, to
successfully determine whether the quotient or remainder  is needed in
divmodsi4.

 Do you agree this will be a practical approach, or is it fundamentally flawed?

Thanks,
-Omar


(machine's word size is 8-bits)

int Resistance (int volt, int current)
{
        return ((long) volt<<10)/current;
}

;; basic block 2, loop depth 0, count 0
;; prev block 0, next block 1
;; pred:       ENTRY [100.0%]  (fallthru)
;; succ:       EXIT [100.0%]  (fallthru)
;; Registers live at start:  1 [%r3] 2 [%r2] 3 [%r1] 4 [%r0] 11 [%i2h]
13 [%i3h] 16 [%ap_hi] 18 [%fp_hi]
(note 6 2 3 2 [bb 2] NOTE_INSN_BASIC_BLOCK)
(insn 3 6 4 2 (set (reg/v:HI 26 [ volt ])
        (reg:HI 1 %r3 [ volt ])) 1 {movhi} (nil)
    (nil))
(insn 4 3 5 2 (set (reg/v:HI 27 [ current ])
        (reg:HI 3 %r1 [ current ])) 1 {movhi} (nil)
    (nil))
(note 5 4 8 2 NOTE_INSN_FUNCTION_BEG)
(insn 8 5 9 2 (set (reg:SI 29 [ volt ])
        (sign_extend:SI (reg/v:HI 26 [ volt ]))) 149 {extendhisi2} (nil)
    (nil))
(insn 9 8 10 2 (set (reg:SI 1 %r3)
        (ashift:SI (reg:SI 29 [ volt ])
            (const_int 10 [0xa]))) 71 {*ashlsi3} (nil)
    (nil))
(insn 10 9 11 2 (set (reg:SI 30)
        (reg:SI 1 %r3)) 2 {movsi} (nil)
    (expr_list:REG_EQUAL (ashift:SI (reg:SI 29 [ volt ])
            (const_int 10 [0xa]))
        (nil)))
(insn 11 10 12 2 (set (reg:SI 31 [ current ])
        (sign_extend:SI (reg/v:HI 27 [ current ]))) 149 {extendhisi2} (nil)
    (nil))
(insn 12 11 17 2 (parallel [
            (set (reg:SI 33)
                (div:SI (reg:SI 30)
                    (reg:SI 31 [ current ])))
            (set (reg:SI 34)
                (mod:SI (reg:SI 30)
                    (reg:SI 31 [ current ])))
        ]) 56 {*divmodsi4} (nil)
    (nil))
(note 17 12 20 2 NOTE_INSN_FUNCTION_END)
(insn 20 17 26 2 (set (reg/i:HI 1 %r3 [ <result> ])
        (subreg:HI (reg:SI 33) 2)) 1 {movhi} (insn_list:REG_DEP_TRUE 12 (nil))
    (expr_list:REG_DEAD (reg:SI 33)
        (nil)))
(insn 26 20 0 2 (use (reg/i:HI 1 %r3 [ <result> ])) -1
(insn_list:REG_DEP_TRUE 20 (nil))
    (nil))
;; Registers live at end:  1 [%r3] 2 [%r2] 11 [%i2h] 13 [%i3h] 16
[%ap_hi] 18 [%fp_hi]

Reply via email to