public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/19154] New: miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values
@ 2004-12-25 20:21 schlie at comcast dot net
  2004-12-25 20:22 ` [Bug c/19154] " schlie at comcast dot net
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: schlie at comcast dot net @ 2004-12-25 20:21 UTC (permalink / raw)
  To: gcc-bugs

/* miss-optimization of (x & pow2C) conditionals returning bool equivalent values.

   Conditional expressions returning/assigning bool equivalent values tend to
   produce less efficient generic code than those returning arbitrary values;
   GCC 3.3.3 produces the more effecient form of the results consistently. */

int main (void){

volatile char c;
volatile int i;
volatile long l;


/* char tests */

c = (c & (1 << 3)); // ok: ((char)c & C).


c = (c & (1 << 3)) ? 3 : 5; // ok: if((char)c & C) -> avr's bit-test&skip.

c = (c & (1 << 3)) ? 1 : 0; // poor: if((char)c & C) -> if(((int)c >> C') & 1), w/unnessisary (int)c 
promotion.


if (c & (1 << 3)) // ok: if((char)c & C) -> avr's bit-test&skip.
     c = 3;
else c = 5;

if (c & (1 << 3)) // ok: if((char)c & C) -> avr's bit-test&skip.
     c = 1;
else c = 0;


/* int tests */

i = i & (1 << 11); // ok: ((int)i & C)


i = (i & (1 << 11)) ? 3 : 5; // ok: if((int)i & C) -> avr's bit-test&skip.

i = (i & (1 << 11)) ? 1 : 0; // poor: if((int)i & C) -> if(((int)i >> C') & 1).


if (i & (1 << 11)) // ok: if((int)i & C) -> avr's bit-test&skip.
     i = 3;
else i = 5;
  
if (i & (1 << 11)) // poor: if((int)i & C) -> avr's bit-test&skip, but w/ineffecient return value.
     i = 1;
else i = 0;



/* long tests */

l = (l & ((long)1 << 27)); // ok: ((long)l & C)


l = (l & ((long)1 << 27)) ? 3 : 5; // ok: if((long)l & C) -> avr's bit-test&skip.

l = (l & ((long)1 << 27)) ? 1 : 0; // poor: if((long)l & C) -> if(((long)l >> C') & 1).


if (l & ((long)1 << 27)) // ok: if((long)l & C) -> avr's bit-test&skip.
     l = 3;
else l = 5;

if (l & ((long)1 << 27)) // poor: if((long)l & C) -> avr's bit-test&skip, but w/ineffecient return value.
     l = 1;
else l = 0;


return 0;

}

Produces:

int main (void){
  c6:	c8 ef       	ldi	r28, 0xF8	; 248
  c8:	d0 e1       	ldi	r29, 0x10	; 16
  ca:	de bf       	out	0x3e, r29	; 62
  cc:	cd bf       	out	0x3d, r28	; 61

volatile char c;
volatile int i;
volatile long l;


/* char tests */

c = (c & (1 << 3)); // ok: ((char)c & C).
  ce:	89 81       	ldd	r24, Y+1	; 0x01
  d0:	88 70       	andi	r24, 0x08	; 8
  d2:	89 83       	std	Y+1, r24	; 0x01


c = (c & (1 << 3)) ? 3 : 5; // ok: if((char)c & C) -> avr's bit-test&skip.
  d4:	89 81       	ldd	r24, Y+1	; 0x01
  d6:	83 ff       	sbrs	r24, 3
  d8:	02 c0       	rjmp	.+4      	; 0xde <main+0x18>
  da:	83 e0       	ldi	r24, 0x03	; 3
  dc:	01 c0       	rjmp	.+2      	; 0xe0 <main+0x1a>
  de:	85 e0       	ldi	r24, 0x05	; 5
  e0:	89 83       	std	Y+1, r24	; 0x01

c = (c & (1 << 3)) ? 1 : 0; // poor: if((char)c & C) -> if(((int)c >> C') & 1), w/unnessisary (int)c 
promotion.
  e2:	89 81       	ldd	r24, Y+1	; 0x01
  e4:	99 27       	eor	r25, r25
  e6:	43 e0       	ldi	r20, 0x03	; 3
  e8:	96 95       	lsr	r25
  ea:	87 95       	ror	r24
  ec:	4a 95       	dec	r20
  ee:	e1 f7       	brne	.-8      	; 0xe8 <main+0x22>
  f0:	81 70       	andi	r24, 0x01	; 1
  f2:	89 83       	std	Y+1, r24	; 0x01


if (c & (1 << 3)) // ok: if((char)c & C) -> avr's bit-test&skip.
  f4:	89 81       	ldd	r24, Y+1	; 0x01
  f6:	83 ff       	sbrs	r24, 3
  f8:	02 c0       	rjmp	.+4      	; 0xfe <main+0x38>
     c = 3;
  fa:	83 e0       	ldi	r24, 0x03	; 3
  fc:	01 c0       	rjmp	.+2      	; 0x100 <main+0x3a>
else c = 5;
  fe:	85 e0       	ldi	r24, 0x05	; 5
 100:	89 83       	std	Y+1, r24	; 0x01

if (c & (1 << 3)) // ok: if((char)c & C) -> avr's bit-test&skip.
 102:	89 81       	ldd	r24, Y+1	; 0x01
 104:	83 ff       	sbrs	r24, 3
 106:	03 c0       	rjmp	.+6      	; 0x10e <main+0x48>
     c = 1;
 108:	81 e0       	ldi	r24, 0x01	; 1
 10a:	89 83       	std	Y+1, r24	; 0x01
 10c:	01 c0       	rjmp	.+2      	; 0x110 <main+0x4a>
else c = 0;
 10e:	19 82       	std	Y+1, r1	; 0x01


/* int tests */

i = i & (1 << 11); // ok: ((int)i & C)
 110:	8a 81       	ldd	r24, Y+2	; 0x02
 112:	9b 81       	ldd	r25, Y+3	; 0x03
 114:	80 70       	andi	r24, 0x00	; 0
 116:	98 70       	andi	r25, 0x08	; 8
 118:	8a 83       	std	Y+2, r24	; 0x02
 11a:	9b 83       	std	Y+3, r25	; 0x03


i = (i & (1 << 11)) ? 3 : 5; // ok: if((int)i & C) -> avr's bit-test&skip.
 11c:	8a 81       	ldd	r24, Y+2	; 0x02
 11e:	9b 81       	ldd	r25, Y+3	; 0x03
 120:	93 ff       	sbrs	r25, 3
 122:	03 c0       	rjmp	.+6      	; 0x12a <main+0x64>
 124:	83 e0       	ldi	r24, 0x03	; 3
 126:	90 e0       	ldi	r25, 0x00	; 0
 128:	02 c0       	rjmp	.+4      	; 0x12e <main+0x68>
 12a:	85 e0       	ldi	r24, 0x05	; 5
 12c:	90 e0       	ldi	r25, 0x00	; 0
 12e:	8a 83       	std	Y+2, r24	; 0x02
 130:	9b 83       	std	Y+3, r25	; 0x03

i = (i & (1 << 11)) ? 1 : 0; // poor: if((int)i & C) -> if(((int)i >> C') & 1).
 132:	8a 81       	ldd	r24, Y+2	; 0x02
 134:	9b 81       	ldd	r25, Y+3	; 0x03
 136:	89 2f       	mov	r24, r25
 138:	99 27       	eor	r25, r25
 13a:	86 95       	lsr	r24
 13c:	86 95       	lsr	r24
 13e:	86 95       	lsr	r24
 140:	81 70       	andi	r24, 0x01	; 1
 142:	90 70       	andi	r25, 0x00	; 0
 144:	8a 83       	std	Y+2, r24	; 0x02
 146:	9b 83       	std	Y+3, r25	; 0x03


if (i & (1 << 11)) // ok: if((int)i & C) -> avr's bit-test&skip.
 148:	8a 81       	ldd	r24, Y+2	; 0x02
 14a:	9b 81       	ldd	r25, Y+3	; 0x03
 14c:	93 ff       	sbrs	r25, 3
 14e:	03 c0       	rjmp	.+6      	; 0x156 <main+0x90>
     i = 3;
 150:	83 e0       	ldi	r24, 0x03	; 3
 152:	90 e0       	ldi	r25, 0x00	; 0
 154:	02 c0       	rjmp	.+4      	; 0x15a <main+0x94>
else i = 5;
 156:	85 e0       	ldi	r24, 0x05	; 5
 158:	90 e0       	ldi	r25, 0x00	; 0
 15a:	8a 83       	std	Y+2, r24	; 0x02
 15c:	9b 83       	std	Y+3, r25	; 0x03
  
if (i & (1 << 11)) // poor: if((int)i & C) -> avr's bit-test&skip, but w/ineffecient return value.
 15e:	8a 81       	ldd	r24, Y+2	; 0x02
 160:	9b 81       	ldd	r25, Y+3	; 0x03
 162:	9c 01       	movw	r18, r24
 164:	20 70       	andi	r18, 0x00	; 0
 166:	38 70       	andi	r19, 0x08	; 8
 168:	93 ff       	sbrs	r25, 3
 16a:	05 c0       	rjmp	.+10     	; 0x176 <main+0xb0>
     i = 1;
 16c:	81 e0       	ldi	r24, 0x01	; 1
 16e:	90 e0       	ldi	r25, 0x00	; 0
 170:	8a 83       	std	Y+2, r24	; 0x02
 172:	9b 83       	std	Y+3, r25	; 0x03
 174:	02 c0       	rjmp	.+4      	; 0x17a <main+0xb4>
else i = 0;
 176:	2a 83       	std	Y+2, r18	; 0x02
 178:	3b 83       	std	Y+3, r19	; 0x03



/* long tests */

l = (l & ((long)1 << 27)); // ok: ((long)l & C)
 17a:	8c 81       	ldd	r24, Y+4	; 0x04
 17c:	9d 81       	ldd	r25, Y+5	; 0x05
 17e:	ae 81       	ldd	r26, Y+6	; 0x06
 180:	bf 81       	ldd	r27, Y+7	; 0x07
 182:	80 70       	andi	r24, 0x00	; 0
 184:	90 70       	andi	r25, 0x00	; 0
 186:	a0 70       	andi	r26, 0x00	; 0
 188:	b8 70       	andi	r27, 0x08	; 8
 18a:	8c 83       	std	Y+4, r24	; 0x04
 18c:	9d 83       	std	Y+5, r25	; 0x05
 18e:	ae 83       	std	Y+6, r26	; 0x06
 190:	bf 83       	std	Y+7, r27	; 0x07


l = (l & ((long)1 << 27)) ? 3 : 5; // ok: if((long)l & C) -> avr's bit-test&skip.
 192:	8c 81       	ldd	r24, Y+4	; 0x04
 194:	9d 81       	ldd	r25, Y+5	; 0x05
 196:	ae 81       	ldd	r26, Y+6	; 0x06
 198:	bf 81       	ldd	r27, Y+7	; 0x07
 19a:	b3 ff       	sbrs	r27, 3
 19c:	05 c0       	rjmp	.+10     	; 0x1a8 <main+0xe2>
 19e:	83 e0       	ldi	r24, 0x03	; 3
 1a0:	90 e0       	ldi	r25, 0x00	; 0
 1a2:	a0 e0       	ldi	r26, 0x00	; 0
 1a4:	b0 e0       	ldi	r27, 0x00	; 0
 1a6:	04 c0       	rjmp	.+8      	; 0x1b0 <main+0xea>
 1a8:	85 e0       	ldi	r24, 0x05	; 5
 1aa:	90 e0       	ldi	r25, 0x00	; 0
 1ac:	a0 e0       	ldi	r26, 0x00	; 0
 1ae:	b0 e0       	ldi	r27, 0x00	; 0
 1b0:	8c 83       	std	Y+4, r24	; 0x04
 1b2:	9d 83       	std	Y+5, r25	; 0x05
 1b4:	ae 83       	std	Y+6, r26	; 0x06
 1b6:	bf 83       	std	Y+7, r27	; 0x07

l = (l & ((long)1 << 27)) ? 1 : 0; // poor: if((long)l & C) -> if(((long)l >> C') & 1).
 1b8:	8c 81       	ldd	r24, Y+4	; 0x04
 1ba:	9d 81       	ldd	r25, Y+5	; 0x05
 1bc:	ae 81       	ldd	r26, Y+6	; 0x06
 1be:	bf 81       	ldd	r27, Y+7	; 0x07
 1c0:	2b e1       	ldi	r18, 0x1B	; 27
 1c2:	b6 95       	lsr	r27
 1c4:	a7 95       	ror	r26
 1c6:	97 95       	ror	r25
 1c8:	87 95       	ror	r24
 1ca:	2a 95       	dec	r18
 1cc:	d1 f7       	brne	.-12     	; 0x1c2 <main+0xfc>
 1ce:	aa 27       	eor	r26, r26
 1d0:	97 fd       	sbrc	r25, 7
 1d2:	a0 95       	com	r26
 1d4:	ba 2f       	mov	r27, r26
 1d6:	81 70       	andi	r24, 0x01	; 1
 1d8:	90 70       	andi	r25, 0x00	; 0
 1da:	a0 70       	andi	r26, 0x00	; 0
 1dc:	b0 70       	andi	r27, 0x00	; 0
 1de:	8c 83       	std	Y+4, r24	; 0x04
 1e0:	9d 83       	std	Y+5, r25	; 0x05
 1e2:	ae 83       	std	Y+6, r26	; 0x06
 1e4:	bf 83       	std	Y+7, r27	; 0x07


if (l & ((long)1 << 27)) // ok: if((long)l & C) -> avr's bit-test&skip.
 1e6:	8c 81       	ldd	r24, Y+4	; 0x04
 1e8:	9d 81       	ldd	r25, Y+5	; 0x05
 1ea:	ae 81       	ldd	r26, Y+6	; 0x06
 1ec:	bf 81       	ldd	r27, Y+7	; 0x07
 1ee:	b3 ff       	sbrs	r27, 3
 1f0:	05 c0       	rjmp	.+10     	; 0x1fc <main+0x136>
     l = 3;
 1f2:	83 e0       	ldi	r24, 0x03	; 3
 1f4:	90 e0       	ldi	r25, 0x00	; 0
 1f6:	a0 e0       	ldi	r26, 0x00	; 0
 1f8:	b0 e0       	ldi	r27, 0x00	; 0
 1fa:	04 c0       	rjmp	.+8      	; 0x204 <main+0x13e>
else l = 5;
 1fc:	85 e0       	ldi	r24, 0x05	; 5
 1fe:	90 e0       	ldi	r25, 0x00	; 0
 200:	a0 e0       	ldi	r26, 0x00	; 0
 202:	b0 e0       	ldi	r27, 0x00	; 0
 204:	8c 83       	std	Y+4, r24	; 0x04
 206:	9d 83       	std	Y+5, r25	; 0x05
 208:	ae 83       	std	Y+6, r26	; 0x06
 20a:	bf 83       	std	Y+7, r27	; 0x07

if (l & ((long)1 << 27)) // poor: if((long)l & C) -> avr's bit-test&skip, but w/ineffecient return value.
 20c:	8c 81       	ldd	r24, Y+4	; 0x04
 20e:	9d 81       	ldd	r25, Y+5	; 0x05
 210:	ae 81       	ldd	r26, Y+6	; 0x06
 212:	bf 81       	ldd	r27, Y+7	; 0x07
 214:	9c 01       	movw	r18, r24
 216:	ad 01       	movw	r20, r26
 218:	20 70       	andi	r18, 0x00	; 0
 21a:	30 70       	andi	r19, 0x00	; 0
 21c:	40 70       	andi	r20, 0x00	; 0
 21e:	58 70       	andi	r21, 0x08	; 8
 220:	b3 ff       	sbrs	r27, 3
 222:	09 c0       	rjmp	.+18     	; 0x236 <main+0x170>
     l = 1;
 224:	81 e0       	ldi	r24, 0x01	; 1
 226:	90 e0       	ldi	r25, 0x00	; 0
 228:	a0 e0       	ldi	r26, 0x00	; 0
 22a:	b0 e0       	ldi	r27, 0x00	; 0
 22c:	8c 83       	std	Y+4, r24	; 0x04
 22e:	9d 83       	std	Y+5, r25	; 0x05
 230:	ae 83       	std	Y+6, r26	; 0x06
 232:	bf 83       	std	Y+7, r27	; 0x07
 234:	04 c0       	rjmp	.+8      	; 0x23e <main+0x178>
else l = 0;
 236:	2c 83       	std	Y+4, r18	; 0x04
 238:	3d 83       	std	Y+5, r19	; 0x05
 23a:	4e 83       	std	Y+6, r20	; 0x06
 23c:	5f 83       	std	Y+7, r21	; 0x07


return 0;

}

-- 
           Summary: miss-optimization of (x & pow2C) avr conditionals
                    returning bool equivalent values
           Product: gcc
           Version: 4.0.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: schlie at comcast dot net
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: avr-unknown-none
  GCC host triplet: powerpc-apple-darwin7.7.0
GCC target triplet: powerpc-apple-darwin7.7.0


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19154


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug c/19154] miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values
  2004-12-25 20:21 [Bug c/19154] New: miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values schlie at comcast dot net
@ 2004-12-25 20:22 ` schlie at comcast dot net
  2004-12-25 20:34 ` [Bug middle-end/19154] " pinskia at gcc dot gnu dot org
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: schlie at comcast dot net @ 2004-12-25 20:22 UTC (permalink / raw)
  To: gcc-bugs



-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
  GCC build triplet|avr-unknown-none            |powerpc-apple-darwin7.7.0
 GCC target triplet|powerpc-apple-darwin7.7.0   |avr-unknown-none


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19154


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug middle-end/19154] miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values
  2004-12-25 20:21 [Bug c/19154] New: miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values schlie at comcast dot net
  2004-12-25 20:22 ` [Bug c/19154] " schlie at comcast dot net
@ 2004-12-25 20:34 ` pinskia at gcc dot gnu dot org
  2004-12-25 20:53 ` pinskia at gcc dot gnu dot org
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2004-12-25 20:34 UTC (permalink / raw)
  To: gcc-bugs



-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|normal                      |minor
          Component|c                           |middle-end
  GCC build triplet|powerpc-apple-darwin7.7.0   |
   GCC host triplet|powerpc-apple-darwin7.7.0   |
           Keywords|                            |missed-optimization


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19154


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug middle-end/19154] miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values
  2004-12-25 20:21 [Bug c/19154] New: miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values schlie at comcast dot net
  2004-12-25 20:22 ` [Bug c/19154] " schlie at comcast dot net
  2004-12-25 20:34 ` [Bug middle-end/19154] " pinskia at gcc dot gnu dot org
@ 2004-12-25 20:53 ` pinskia at gcc dot gnu dot org
  2004-12-25 20:57 ` pinskia at gcc dot gnu dot org
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2004-12-25 20:53 UTC (permalink / raw)
  To: gcc-bugs


------- Additional Comments From pinskia at gcc dot gnu dot org  2004-12-25 20:53 -------
I think the issue here is rtx_cost for avr sucks and does not give a good accurate cost matrix.

-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19154


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug middle-end/19154] miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values
  2004-12-25 20:21 [Bug c/19154] New: miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values schlie at comcast dot net
                   ` (2 preceding siblings ...)
  2004-12-25 20:53 ` pinskia at gcc dot gnu dot org
@ 2004-12-25 20:57 ` pinskia at gcc dot gnu dot org
  2004-12-25 21:39 ` schlie at comcast dot net
  2004-12-25 21:57 ` schlie at comcast dot net
  5 siblings, 0 replies; 7+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2004-12-25 20:57 UTC (permalink / raw)
  To: gcc-bugs


------- Additional Comments From pinskia at gcc dot gnu dot org  2004-12-25 20:57 -------
Take:
char g(char c)
{
return (c & (1 << 3)) != 0;
}

(insn 8 4 30 (set (reg:HI 24 r24 [orig:44 c ] [44])
        (sign_extend:HI (reg:QI 24 r24 [ c ]))) 81 {extendqihi2} (nil)
    (nil))

(insn 30 8 11 (parallel [
            (set (reg:HI 24 r24 [orig:44 c ] [44])
                (lshiftrt:HI (reg:HI 24 r24 [orig:44 c ] [44])
                    (const_int 3 [0x3])))
            (clobber (reg:QI 19 r19))
        ]) 70 {*lshrhi3_const} (nil)
    (expr_list:REG_UNUSED (reg:QI 19 r19)
        (expr_list:REG_UNUSED (reg:QI 25 r25)
            (nil))))

(insn 11 30 12 (set (reg:HI 24 r24 [46])
        (sign_extend:HI (reg:QI 24 r24 [47]))) 81 {extendqihi2} (insn_list:REG_DEP_TRUE 10 (nil))
    (nil))
(insn 19 16 25 (parallel [
            (set (reg/i:HI 24 r24 [ <result> ])
                (and:HI (reg:HI 24 r24 [46])
                    (const_int 1 [0x1])))
            (clobber (scratch:QI))
        ]) 47 {andhi3} (insn_list:REG_DEP_TRUE 11 (nil))
    (expr_list:REG_UNUSED (scratch:QI)
        (nil)))


Which looks good if the rtl matches up one to one per instruction but since avr is not like that we get a 
werid interaction.

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever Confirmed|                            |1
   Last reconfirmed|0000-00-00 00:00:00         |2004-12-25 20:57:17
               date|                            |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19154


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug middle-end/19154] miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values
  2004-12-25 20:21 [Bug c/19154] New: miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values schlie at comcast dot net
                   ` (3 preceding siblings ...)
  2004-12-25 20:57 ` pinskia at gcc dot gnu dot org
@ 2004-12-25 21:39 ` schlie at comcast dot net
  2004-12-25 21:57 ` schlie at comcast dot net
  5 siblings, 0 replies; 7+ messages in thread
From: schlie at comcast dot net @ 2004-12-25 21:39 UTC (permalink / raw)
  To: gcc-bugs


------- Additional Comments From schlie at comcast dot net  2004-12-25 21:39 -------
Subject: Re:  miss-optimization of (x & pow2C) avr
 conditionals returning bool equivalent values

> I think the issue here is rtx_cost for avr sucks and does not give a good
> accurate cost matrix.

I considered that, and sure it doesn't help; but the form of the conditional
presented for code generation is actually different in otherwise identical
expressions, therefore implying that it's presumed that:

 if ((x >> C') & 1) 1 else 0;  => ((x >> C') & 1)

Is more efficient than:

 if ((x >> C') & 1) 1 else 0; => if (x & C) 1 else 0;

Which is target specific, and should not be presumed, as for targets which
support bit-test&branch:

 if (x & C) 1 else 0; => bit-test&branch x log2C; return 0; return 1;

Is significantly more efficient than a (multi-bit-shift & 1).

(therefore it doesn't seem proper for such return value dependant
assumptions to be made in a target neutral way)





-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19154


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug middle-end/19154] miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values
  2004-12-25 20:21 [Bug c/19154] New: miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values schlie at comcast dot net
                   ` (4 preceding siblings ...)
  2004-12-25 21:39 ` schlie at comcast dot net
@ 2004-12-25 21:57 ` schlie at comcast dot net
  5 siblings, 0 replies; 7+ messages in thread
From: schlie at comcast dot net @ 2004-12-25 21:57 UTC (permalink / raw)
  To: gcc-bugs


------- Additional Comments From schlie at comcast dot net  2004-12-25 21:56 -------
Subject: Re:  miss-optimization of (x & pow2C) avr
 conditionals returning bool equivalent values

I apologize, I'm confused, what are you comparing to what?

(are you using 4.0, which to my knowledge only builds with my
recent proposed patches, unless the problem was fixed otherwise?)

- to my understanding, (x & C) should never result in ((x >> C') & 1)
  presented to the backend, as it's purely a target specific optimization.


> From: pinskia at gcc dot gnu dot org <gcc-bugzilla@gcc.gnu.org>
> ------- Additional Comments From pinskia at gcc dot gnu dot org  2004-12-25
> 20:57 -------
> Take:
> char g(char c)
> {
> return (c & (1 << 3)) != 0;
> }
> 
> (insn 8 4 30 (set (reg:HI 24 r24 [orig:44 c ] [44])
>         (sign_extend:HI (reg:QI 24 r24 [ c ]))) 81 {extendqihi2} (nil)
>     (nil))
> 
> (insn 30 8 11 (parallel [
>             (set (reg:HI 24 r24 [orig:44 c ] [44])
>                 (lshiftrt:HI (reg:HI 24 r24 [orig:44 c ] [44])
>                     (const_int 3 [0x3])))
>             (clobber (reg:QI 19 r19))
>         ]) 70 {*lshrhi3_const} (nil)
>     (expr_list:REG_UNUSED (reg:QI 19 r19)
>         (expr_list:REG_UNUSED (reg:QI 25 r25)
>             (nil))))
> 
> (insn 11 30 12 (set (reg:HI 24 r24 [46])
>         (sign_extend:HI (reg:QI 24 r24 [47]))) 81 {extendqihi2}
> (insn_list:REG_DEP_TRUE 10 (nil))
>     (nil))
> (insn 19 16 25 (parallel [
>             (set (reg/i:HI 24 r24 [ <result> ])
>                 (and:HI (reg:HI 24 r24 [46])
>                     (const_int 1 [0x1])))
>             (clobber (scratch:QI))
>         ]) 47 {andhi3} (insn_list:REG_DEP_TRUE 11 (nil))
>     (expr_list:REG_UNUSED (scratch:QI)
>         (nil)))
> 
> 
> Which looks good if the rtl matches up one to one per instruction but since
> avr is not like that we get a
> werid interaction.
> 
> -- 
>            What    |Removed                     |Added
> ----------------------------------------------------------------------------
>              Status|UNCONFIRMED                 |NEW
>      Ever Confirmed|                            |1
>    Last reconfirmed|0000-00-00 00:00:00         |2004-12-25 20:57:17
>                date|                            |
> 
> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19154
> 
> ------- You are receiving this mail because: -------
> You reported the bug, or are watching the reporter.




-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19154


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2004-12-25 21:57 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-12-25 20:21 [Bug c/19154] New: miss-optimization of (x & pow2C) avr conditionals returning bool equivalent values schlie at comcast dot net
2004-12-25 20:22 ` [Bug c/19154] " schlie at comcast dot net
2004-12-25 20:34 ` [Bug middle-end/19154] " pinskia at gcc dot gnu dot org
2004-12-25 20:53 ` pinskia at gcc dot gnu dot org
2004-12-25 20:57 ` pinskia at gcc dot gnu dot org
2004-12-25 21:39 ` schlie at comcast dot net
2004-12-25 21:57 ` schlie at comcast dot net

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).