GCC schmiert ab wenn Optimierung an.

OP #668014
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
Gast #668028
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.
OP #668045
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.