Forum: Compiler & IDEs WinCC Outputgrößen bei Optimierung


von Tobias H. (taranis)


Lesenswert?

Hallo zusammen,

gestern abend (spät) viel mir auf, dass sich die Outputgrößen irgendwie 
nicht so verhalten wie ich es erwartet hätte, nämlich so:
- Ohne Optimierung: Output: 7,05kB
- mit -O/-O1 : 7,15kB
- mit -O2 : 7,64kB
- mit -O3: 7,75kB
- mit -Os: 7,63kB

Was ich nicht verstehe, ist, dass -Os so einen großen Output liefert, 
gerade im Vergleich zum nicht auf Größe optimierten Code.
Zum Anderen frag ich mich natürlich, schreib ich so miesen Code, dass er 
sich nicht optimieren lässt, oder mach ich was beim Kompilieren falsch?
Als Optionen hab ich nur das Target, -Wall und eine Optimierungsstufe. 
Und im Debug-Modus noch -g (erzeugt Debugger Symbole).

Grüße
Tobi

von Tobias H. (taranis)


Lesenswert?

Gerade gemerkt, dass ich im Debug-Modus kompiliert habe.
Im Releasemodus ändern sich aber nur die Zahlen um rund 3kB und die 
Reihenfolge der Outputgrößen wäre dann
-O/O1 (4,11kB)
-O2 (4,15kB)
-Os (4,16kB)
-O3 (4,22kB)
-ohne (4,37kB)

Immerhin ist der unoptimierte Output jetzt der Größte. Aber ich versteh 
immer noch nicht, warum die Größenoptimierung größeren Output erzeugt 
als die Geschwindigkeitsoptimierung. Das läuft doch dem Ziel zu wieder 
und macht -Os doch eigentlich (zumindest in dem Fall hier) überflüssig.

von Peter D. (peda)


Lesenswert?

Versuch mal zusätzlich:

-fno-inline-small-functions


Peter

von Tobias H. (taranis)


Lesenswert?

Danke schön für den Tipp, jetzt mach die Option -Os auch Sinn, in menem 
Verständnis.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> Versuch mal zusätzlich:
>
> -fno-inline-small-functions

hmmm, ich dachte das wäre längst in gcc? Sind nur ein paar Zeilen das.

FYI:
1
Index: avr-protos.h
2
===================================================================
3
--- avr-protos.h        (Revision 160067)
4
+++ avr-protos.h        (Arbeitskopie)
5
@@ -23,6 +23,8 @@
6
7
 extern int function_arg_regno_p (int r);
8
 extern void avr_override_options (void);
9
+extern void avr_optimization_options (int,int);
10
 extern void avr_cpu_cpp_builtins (struct cpp_reader * pfile);
11
 extern int avr_ret_register (void);
12
 extern bool class_likely_spilled_p (int c);
13
Index: avr.c
14
===================================================================
15
--- avr.c       (Revision 160067)
16
+++ avr.c       (Arbeitskopie)
17
@@ -223,6 +223,20 @@ avr_override_options (void)
18
   init_machine_status = avr_init_machine_status;
19
 }
20
21
+/* Implement `OPTIMIZATION_OPTIONS' */
22
+/* Give some reasonable optimization defaults for AVR.
23
+   These can still be overwritten by command line arguments */
24
+
25
+void
26
+avr_optimization_options (int level ATTRIBUTE_UNUSED, int size)
27
+{
28
+  if (size)
29
+    {
30
+      set_param_value ("max-inline-insns-single", 3);
31
+      set_param_value ("max-inline-insns-auto", 3);
32
+    }
33
+}
34
+
35
 /*  return register class from register number.  */
36
37
 static const enum reg_class reg_class_tab[]={
38
Index: avr.h
39
===================================================================
40
--- avr.h       (Revision 160067)
41
+++ avr.h       (Arbeitskopie)
42
@@ -125,6 +125,7 @@ extern GTY(()) section *progmem_section;
43
 #define TARGET_VERSION fprintf (stderr, " (GNU assembler syntax)");
44
45
 #define OVERRIDE_OPTIONS avr_override_options ()
46
+#define OPTIMIZATION_OPTIONS(OPTIMIZE,OPTIMIZE_SIZE) avr_optimization_options (OPTIMIZE,OPTIMIZE_SIZE)
47
48
 #define CAN_DEBUG_WITHOUT_FP

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.