mikrocontroller.net

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


Autor: Christoph Lechner (clechner)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph Lechner (clechner)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.