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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren