2017-01-28 2 views
0

Ich erzeuge Code mit einem benutzerdefinierten RISCV-Backend für llvm. Wenn ich ohne Optimierung (-O0) kompiliere, ist das Programm funktionsfähig. Wenn ich mit Optimierung (-O2) kompiliere, wird keines der temporären Register (Anrufer gespeichert) nach Aufrufen neu geladen. Der optimierte Code scheint eine gute Registerzuordnung zu haben, aber er tut Dinge wie das Laden eines temporären Registers mit der Adresse eines Klasseninitialisierers und dann den Aufruf des Initialisierers mehrere Male, ohne das Register neu zu laden. llvm Anrufer gespeichert Register nicht nach Funktionsaufruf neu geladen

load t1 %(foo) 
jal t1 
... 
jal t1 
... 
jal t1 

Die .bc Datei sieht im Grunde die gleichen wie diese Pseudo-Code, richtig die aktiven Bereiche (lifetime.start und lifetime.end) erklärt, alle Funktionsaufrufe zu überspannen.

Ich denke, die Strategie des Registerzuweisers ist es, zuerst die gespeicherten Register des Aufrufers zu verwenden, also glaube ich nicht, dass dies ein Problem ist, meine Register falsch zu deklarieren. In den älteren Registerzuordnern sehe ich, wo loadRegFromStackSlot() - oder assignVirt2StackSlot() - Funktionen verwendet werden, um die Register, die neu geladen werden müssen, nachdem sie geplottert wurden, auszugeben. Aber im gierigen Register-Allokator sehe ich keinen offensichtlichen Ort, an dem dies auftritt, also weiß ich nicht, wie ich debuggen soll, was mein Backend möglicherweise vermisst.

Vielleicht muss ich dem Codegenerator einen weiteren Durchlauf oder einen anderen Durchlauf hinzufügen. Vielleicht habe ich etwas falsch mit meinen Registererklärungen, aber ich glaube nicht. Jeder Einblick würde geschätzt werden.

Antwort

0

Wenn Sie riscv/riscv-llvm von GitHub verwenden, müssen Sie möglicherweise das folgende Fix greifen. Ich sah ähnliche Probleme ohne es.

https://github.com/riscv/riscv-llvm/commit/ce8ac4e3ed8956a37bf330ee4a431c6fdfabac37

Das folgende Problem Bericht zeigt ähnliche Probleme und eine der Antworten zeigt auf die obige Änderung:

https://github.com/riscv/riscv-llvm/issues/32

+0

Dank Mike, Sie richtig sind. Ich habe mir gedacht, dass sich diese Änderungen Ende letzter Woche selbst geändert haben - auf die harte Tour! – bvenables

Verwandte Themen