Forum: Compiler & IDEs GCC schmiert ab wenn Optimierung an.


von Christoph L. (clechner)


Lesenswert?

Hallo,

an sich ist es ja eher ein schlechtes Zeichen, wenn der avr-gcc (Version 
4.1.2 übrigens) RTL-Zeugs ausspuckt, aber was heißt das denn jetzt:

avr-gcc -mmcu=atmega128 -Wall -Os -c -g -Wa,-a,-ad,-a=trig.lst trig.c
trig.c: In function 'sincos90':
trig.c:89: error: unable to find a register to spill in class 
'POINTER_REGS'
trig.c:89: error: this is the insn:
(insn 41 39 42 4 trig.c:70 (set (reg:SI 59 [ D.1371 ])
        (mem/s:SI (post_inc:HI (reg/f:HI 48 [ ivtmp.65 ])) [2 arctan_tbl 
S4 A8])) 14 {*movsi} (nil)
    (expr_list:REG_INC (reg/f:HI 48 [ ivtmp.65 ])
        (nil)))
trig.c:89: confused by earlier errors, bailing out

Ich versteht zwar davon jetzt nicht viel, aber schaut so aus, als wie 
wenn er bei einem Speicherzugriff kein Register mehr frei hat. Wenn ich 
einen der Unter-Funktionsaufrufe auskommentiere, dann tritt der Fehler 
nicht mehr auf. (Natürlich funktioniert dann mein Programm auch nicht 
mehr)

Am Anfang der Funktion werden 18 Register mit push gesichert. Die Zeile, 
die er nicht will besteht aus einem Speicherzugriff um einen int32_t aus 
dem SRAM zu laden und einer 32Bit Multiplikation (mit Aufruf einer 
Funktion)

Ohne -Os tritt es nicht auf, aber weil der Code einwandfrei 
funktioniert, will ich ihn natürlich jetzt noch optimieren.

MfG
- C. Lechner

von yalu (Gast)


Lesenswert?

Da wird es nicht viele geben, die diese Fehlermeldung interpretieren
können.

Deswegen die Frage:

Taucht das Problem auch bei 4.2.1 auf?

Wenn ein Stück von deinem Programm postest, in dem der Fehler
reproduzierbar auftritt, probier ich's gerne für dich aus.

von Christoph L. (clechner)


Lesenswert?

@yulu:
Danke für das Angebot. Mit avr-gcc 4.2.1 gehts zwar, aber ich komme nach 
einer weiteren Optimierung ohne die den Fehler auslösende Anweisung aus.

Das Problem war glaube ich mal die Multiplikation, denn da ruft er lt. 
Listing intern die Funktion __mulsi3 auf, die braucht natürlich 
Argumente. Mittlerweile hab ich die Multiplikation nämlich durch eine 
Fallunterscheidung ersetzt, da ich nur mit -1 und +1 multipliziere, da 
macht er halt ggf. das Zweierkomplement drauf und fertich.

von yalu (Gast)


Lesenswert?

Das sind die wahrhaft intelligenten Optimierungsfähigkeiten des GCC:

Den Programmier durch dubiose Fehlermeldungen so zu verwirren, dass er
schließlich seinen Code selbst optimiert :D :D :D

von Andreas K. (a-k)


Lesenswert?

Diese Fehlermeldung ist GCCs sprechendere Version von "internal compiler 
error E54321, please consult support". Sprechend für den Autor, nicht 
den Nutzer, und nur für den Autor gedacht.

Manche diese Fehler sind in Bugzilla dokumentiert.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Such mal in GCC's Bugzilla, ob der Fehler schon berichtet ist.  Suche
ggf. auch in den bereits geschlossenen Bugs (advanced search, auf
Target AVR einschränken), kann ja sein, dass er in der aktuellen
Version bereits behoben ist.

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.