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]