Fehler in cfg2ssa

Wilson
Mausschubser
Mausschubser
Beiträge: 47
Registriert: 20. Sep 2011 15:24

Fehler in cfg2ssa

Beitrag von Wilson »

Hallo zusammen!

Ich habe es anscheinend hingekriegt cfg2ssa kaputt zu machen. :mrgreen: Und zwar mit dieser etwas längeren Folge von Aufrufen: (drawing3.btm ist aus den Beispielen auf der Webseite)

Code: Alles auswählen

read drawing3.btm
check
ast2cfg
cfg2ssa
live
briggs
cfg2ssa
reach
licm
dce
live
briggs
cp
cp
cfg2ssa
dumpcfg test2/
live
briggs
codegen
write
Hier schreit dann codegen auf:
java.lang.RuntimeException: Operand '@t100269' was never defined in instruction: @t100683 = @t100269; # load variable instruction
Und tatsächlich: Vor dem letzten cfg2ssa gibt es eine Definition für @t100269 in bb#9:
davor.pdf
(87.68 KiB) 73-mal heruntergeladen
Aber nach dem Aufruf von cfg2ssa wurde die Variable in der Definition umbenannt, nicht jedoch in der Verwendung:
ssa.pdf
(91.23 KiB) 71-mal heruntergeladen

Julian Oppermann
Mausschubser
Mausschubser
Beiträge: 88
Registriert: 3. Mai 2013 19:32

Re: Fehler in cfg2ssa

Beitrag von Julian Oppermann »

Ja, interessant. Mir scheint im "Davor"-Dump in 32::7 die Zuweisung @t100269 = @t100269 verdächtig zu sein. Könnten Sie die bitte mal eliminieren und schauen, ob es dann geht?

Wilson
Mausschubser
Mausschubser
Beiträge: 47
Registriert: 20. Sep 2011 15:24

Re: Fehler in cfg2ssa

Beitrag von Wilson »

Das ist tatsächlich die Ursache des Fehlers, ohne die Zeile funktioniert alles perfekt.

Ein Minimalbeispiel für den Fehler ist:

Code: Alles auswählen

class Main {
	void main() {
		int x = 0;
		x=x;
		return;
	}
}
und dann einfach mit

Code: Alles auswählen

read cfg2ssaerror.btm
check
ast2cfg
cfg2ssa
live
briggs
codegen
write
aufrufen.

Die Anweisung entstand durch Copy Propagation, ich nehme an da stand vorher in etwa sowas:

Code: Alles auswählen

x = 42;
y = x;
x = y;

Wilson
Mausschubser
Mausschubser
Beiträge: 47
Registriert: 20. Sep 2011 15:24

Re: Fehler in cfg2ssa

Beitrag von Wilson »

Ich hab noch einen :mrgreen:

Code: Alles auswählen

class Main {
	TextIO io = new TextIO();
	void main() {
		int y=0;
		if (3<10) {
			
			io.putInt(y);
			return;
	
		}
	}
}
Ja ich bin böse und schreibe returns in ifs. :twisted: Die semantische Analyse beschwert sich jedenfalls nicht.

EDIT: Der nicht SSA Cfg ist auch schon ein bisschen kaputt seh ich grad... Dann ist es halt ein Fehler in ast2cfg
Dateianhänge
danach.pdf
(50.96 KiB) 55-mal heruntergeladen
davor.pdf
(47.42 KiB) 59-mal heruntergeladen

Wilson
Mausschubser
Mausschubser
Beiträge: 47
Registriert: 20. Sep 2011 15:24

Re: Fehler in cfg2ssa

Beitrag von Wilson »

Aller guten Dinge sind 3 :mrgreen:

Der hier ist besonders böse weil er nicht zu einem Compile-Error führt, sondern einem den Code zerschießt.

Code: Alles auswählen

class Main{
	TextIO io = new TextIO();
	int x;
	void main() {
		x = 42;
		writeX(4);
		io.putInt(x);
		return;
	}
	void writeX(int a) {
		x = a;
		return;
	}
}
Damit der Fehler auftritt muss man einfach nur zwei mal nach SSA und wieder zurück:

Code: Alles auswählen

read enderwiggin.btm
check
ast2cfg

cfg2ssa
live
briggs

cfg2ssa
live
briggs

codegen
write
Der Fehler passiert nach dem Aufruf von writeX, und zwar wird hier der geänderte Wert nicht mehr aus der globalen Variable gelesen. Normalerweise werden bei der Konvertierung nach SSA ja LoadVarInsts eingefügt mit "read-back for field xyz" als Kommentar. Das geschieht hier nicht, und die alte read-back-Anweisung wird auf eine lokale Variable umgebogen... Damit kriegt die main nix vom geänderten x mit und gibt den alten Wert aus.

EDIT: x soll nur einmal deklariert werden
Dateianhänge
davor.pdf
(54.22 KiB) 51-mal heruntergeladen
danach.pdf
(55.23 KiB) 54-mal heruntergeladen
Zuletzt geändert von Wilson am 9. Aug 2013 16:17, insgesamt 1-mal geändert.

Julian Oppermann
Mausschubser
Mausschubser
Beiträge: 88
Registriert: 3. Mai 2013 19:32

Re: Fehler in cfg2ssa

Beitrag von Julian Oppermann »

Danke für die Bug-Reports!

Sie haben Recht, im zweiten Beispiel hätte die semantische Analyse entdecken müssen, dass das Programm kein valides Bantam ist. Ich vermute, dass die darauffolgenden Phasen bestimmte Annahmen u.a. über die Struktur des CFG treffen, die dann hier verletzt wurden und zur kaputten Codeerzeugung führten.

Ist es im dritten Beispiel essentiell, dass das Feld x zweimal deklariert wird?

Wilson
Mausschubser
Mausschubser
Beiträge: 47
Registriert: 20. Sep 2011 15:24

Re: Fehler in cfg2ssa

Beitrag von Wilson »

Zum dritten Beispiel: ganz im Gegenteil, da habe ich beim zusammenkopieren geschludert. X soll nur ein mal deklariert werden.

Antworten

Zurück zu „Archiv“