[Bug c/18617] New: missed volatile variable optimizations

schlie at comcast dot net gcc-bugzilla@gcc.gnu.org
Mon Nov 22 23:48:00 GMT 2004


The below program and resulting code demonstrates:

- volatile variables are needlessly initilized through a temporary, rather than being initialized directly.
- volatile variable function arguments aren't passed direclty, but needlessly use an 
intermediate temporary variable.
- normal variable function arguments with a volatile variable target seems to inhibits the recognition of 
word-wide move's for normal variable argument passing, which are recognized otherwise

main.c

int main (void) {

            long lx, ly = 3;
   volatile long lv = 5;
   
            long long llx, lly = 6;
   volatile long long llv = 7;
	
   lv = lx * ly;
   lv = lv * lv;
   
   llv = llx * lly;
   llv = llv * llv;
   
   return lx + ly + llx + lly;
}

main.lst

   1               		.file	"main.c"
   2               		.arch atmega64
   3               	__SREG__ = 0x3f
   4               	__SP_H__ = 0x3e
   5               	__SP_L__ = 0x3d
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  12               		.text
  13               	.Ltext0:
  37               	.global	main
  39               	main:
   1:main.c        **** int main (void) {
  41               	.LM1:
  42               	/* prologue: frame size=32 */
  43 0000 C0E0      		ldi r28,lo8(__stack - 32)
  44 0002 D0E0      		ldi r29,hi8(__stack - 32)
  45 0004 DEBF      		out __SP_H__,r29
  46 0006 CDBF      		out __SP_L__,r28
  47               	/* prologue end (size=4) */
  48 0008 198A      		std Y+17,__zero_reg__
  49 000a 1A8A      		std Y+18,__zero_reg__
   2:main.c        **** 
   3:main.c        ****             long lx, ly = 3;
   4:main.c        ****    volatile long lv = 5;
  51               	.LM2:
  52 000c 85E0      		ldi r24,lo8(5)
  53 000e 90E0      		ldi r25,hi8(5)
  54 0010 A0E0      		ldi r26,hlo8(5)
  55 0012 B0E0      		ldi r27,hhi8(5)
  56 0014 8983      		std Y+1,r24
  57 0016 9A83      		std Y+2,r25
  58 0018 AB83      		std Y+3,r26
  59 001a BC83      		std Y+4,r27
   5:main.c        ****    
   6:main.c        ****             long long llx, lly = 6;
  61               	.LM3:
  62 001c 26E0      		ldi r18,lo8(6)
  63 001e 298F      		std Y+25,r18
  64 0020 1A8E      		std Y+26,__zero_reg__
   7:main.c        ****    volatile long long llv = 7;
  66               	.LM4:
  67 0022 87E0      		ldi r24,lo8(7)
  68 0024 8D83      		std Y+5,r24
  69 0026 1E82      		std Y+6,__zero_reg__
  70 0028 1F82      		std Y+7,__zero_reg__
  71 002a 1886      		std Y+8,__zero_reg__
  72 002c 1986      		std Y+9,__zero_reg__
  73 002e 1A86      		std Y+10,__zero_reg__
  74 0030 1B86      		std Y+11,__zero_reg__
  75 0032 1C86      		std Y+12,__zero_reg__
   8:main.c        **** 	
   9:main.c        ****    lv = lx * ly;
  77               	.LM5:
  78 0034 6D85      		ldd r22,Y+13
  79 0036 7E85      		ldd r23,Y+14
  80 0038 8F85      		ldd r24,Y+15
  81 003a 9889      		ldd r25,Y+16
  82 003c 23E0      		ldi r18,lo8(3)
  83 003e 30E0      		ldi r19,hi8(3)
  84 0040 40E0      		ldi r20,hlo8(3)
  85 0042 50E0      		ldi r21,hhi8(3)
  86 0044 0E94 0000 		call __mulsi3
  87 0048 DC01      		movw r26,r24
  88 004a CB01      		movw r24,r22
  89 004c 8983      		std Y+1,r24
  90 004e 9A83      		std Y+2,r25
  91 0050 AB83      		std Y+3,r26
  92 0052 BC83      		std Y+4,r27
  10:main.c        ****    lv = lv * lv;
  94               	.LM6:
  95 0054 8981      		ldd r24,Y+1
  96 0056 9A81      		ldd r25,Y+2
  97 0058 AB81      		ldd r26,Y+3
  98 005a BC81      		ldd r27,Y+4
  99 005c 2981      		ldd r18,Y+1
 100 005e 3A81      		ldd r19,Y+2
 101 0060 4B81      		ldd r20,Y+3
 102 0062 5C81      		ldd r21,Y+4
 103 0064 BC01      		movw r22,r24
 104 0066 CD01      		movw r24,r26
 105 0068 0E94 0000 		call __mulsi3
 106 006c DC01      		movw r26,r24
 107 006e CB01      		movw r24,r22
 108 0070 8983      		std Y+1,r24
 109 0072 9A83      		std Y+2,r25
 110 0074 AB83      		std Y+3,r26
 111 0076 BC83      		std Y+4,r27
  11:main.c        ****    
  12:main.c        ****    llv = llx * lly;
 113               	.LM7:
 114 0078 A98C      		ldd r10,Y+25
 115 007a BA8C      		ldd r11,Y+26
 116 007c CB2C      		mov r12,r11
 117 007e DB2C      		mov r13,r11
 118 0080 EB2C      		mov r14,r11
 119 0082 FB2C      		mov r15,r11
 120 0084 0B2D      		mov r16,r11
 121 0086 1B2D      		mov r17,r11
 122 0088 2B2D      		mov r18,r11
 123 008a 3B2D      		mov r19,r11
 124 008c 4B2D      		mov r20,r11
 125 008e 5B2D      		mov r21,r11
 126 0090 6B2D      		mov r22,r11
 127 0092 7B2D      		mov r23,r11
 128 0094 8B2D      		mov r24,r11
 129 0096 9B2D      		mov r25,r11
 130 0098 0E94 0000 		call __muldi3
 131 009c 2D83      		std Y+5,r18
 132 009e 3E83      		std Y+6,r19
 133 00a0 4F83      		std Y+7,r20
 134 00a2 5887      		std Y+8,r21
 135 00a4 6987      		std Y+9,r22
 136 00a6 7A87      		std Y+10,r23
 137 00a8 8B87      		std Y+11,r24
 138 00aa 9C87      		std Y+12,r25
  13:main.c        ****    llv = llv * llv;
 140               	.LM8:
 141 00ac 2D80      		ldd r2,Y+5
 142 00ae 3E80      		ldd r3,Y+6
 143 00b0 4F80      		ldd r4,Y+7
 144 00b2 5884      		ldd r5,Y+8
 145 00b4 6984      		ldd r6,Y+9
 146 00b6 7A84      		ldd r7,Y+10
 147 00b8 8B84      		ldd r8,Y+11
 148 00ba 9C84      		ldd r9,Y+12
 149 00bc 2D81      		ldd r18,Y+5
 150 00be 3E81      		ldd r19,Y+6
 151 00c0 4F81      		ldd r20,Y+7
 152 00c2 5885      		ldd r21,Y+8
 153 00c4 6985      		ldd r22,Y+9
 154 00c6 7A85      		ldd r23,Y+10
 155 00c8 8B85      		ldd r24,Y+11
 156 00ca 9C85      		ldd r25,Y+12
 157 00cc A22E      		mov r10,r18
 158 00ce B32E      		mov r11,r19
 159 00d0 C42E      		mov r12,r20
 160 00d2 D52E      		mov r13,r21
 161 00d4 E62E      		mov r14,r22
 162 00d6 F72E      		mov r15,r23
 163 00d8 082F      		mov r16,r24
 164 00da 192F      		mov r17,r25
 165 00dc 222D      		mov r18,r2
 166 00de 332D      		mov r19,r3
 167 00e0 442D      		mov r20,r4
 168 00e2 552D      		mov r21,r5
 169 00e4 662D      		mov r22,r6
 170 00e6 772D      		mov r23,r7
 171 00e8 882D      		mov r24,r8
 172 00ea 992D      		mov r25,r9
 173 00ec 0E94 0000 		call __muldi3
 174 00f0 2D83      		std Y+5,r18
 175 00f2 3E83      		std Y+6,r19
 176 00f4 4F83      		std Y+7,r20
 177 00f6 5887      		std Y+8,r21
 178 00f8 6987      		std Y+9,r22
 179 00fa 7A87      		std Y+10,r23
 180 00fc 8B87      		std Y+11,r24
 181 00fe 9C87      		std Y+12,r25
  14:main.c        ****    
  15:main.c        ****    return lx + ly + llx + lly;
 183               	.LM9:
 184 0100 8D85      		ldd r24,Y+13
 185 0102 9E85      		ldd r25,Y+14
 186 0104 0396      		adiw r24,3
 187 0106 2989      		ldd r18,Y+17
 188 0108 3A89      		ldd r19,Y+18
 189 010a 820F      		add r24,r18
 190 010c 931F      		adc r25,r19
  16:main.c        **** }
 192               	.LM10:
 193 010e 298D      		ldd r18,Y+25
 194 0110 3A8D      		ldd r19,Y+26
 195 0112 820F      		add r24,r18
 196 0114 931F      		adc r25,r19
 197               	/* epilogue: frame size=32 */
 198 0116 0C94 0000 		jmp exit
 199               	/* epilogue end (size=2) */
 200               	/* function main size 141 (135) */
 209               	.Lscope0:
 211               		.text
 213               	Letext:
 214               	/* File "main.c": code  141 = 0x008d ( 135), prologues   4, epilogues   2 */
DEFINED SYMBOLS
                            *ABS*:00000000 main.c
                            *ABS*:0000003f __SREG__
                            *ABS*:0000003e __SP_H__
                            *ABS*:0000003d __SP_L__
                            *ABS*:00000000 __tmp_reg__
                            *ABS*:00000001 __zero_reg__
/var/tmp//ccNIsAYP.s:39     .text:00000000 main
/var/tmp//ccNIsAYP.s:213    .text:0000011a Letext

UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
__stack
__mulsi3
__muldi3
exit

-- 
           Summary: missed volatile variable optimizations
           Product: gcc
           Version: 3.4.3
            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 host triplet: ppc
GCC target triplet: avr


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



More information about the Gcc-bugs mailing list