Eine Array-Zuweisung wie y[j] = x in der fraglichen Zeile 13 wird auf eine Store-Anweisung abgebildet, die mit einer Basisadresse y und einem Offset j adressiert wird und den Wert x dort abspeichert. Insofern wird x und j gelesen und es wird das Array y beschrieben (bei der Write-Menge sieht man y als das Gesamt-Array an statt der Basisadresse).
Man kann im 3-Adresscode nicht y[i] = y[j] schreiben, da man sonst auch y[i] = x[j] schreiben könnte und hier hat man es mit 4 Variablen zu tun. Also muss man hier eine temporäre Variable einführen und tmp = y[j]; y[i] = tmp; schreiben.
Das goto 16 in Zeile 15 ist redundant, da ohnehin als nächstes zur Zeile 16 gesprungen wird. Die Anweisung kommt daher, dass der MiniC-Compiler die if-Anweisungen mit einer then-Anweisung und einer else-Anweisung ausbaut und in diesem Fall wurde die else-Anweisung "nothing" ergänzt. Normalerweise muss man am Ende der then-Anweisung über den Code der else-Anweisung springen, die hier aber gar keinen Code hinterlässt. Daher hier die goto-Anweisung nicht nötig, aber auch nicht falsch. Das könnte man im Code-Generator optimieren, wenn man will, aber goto-Anweisungen sind im Gegensatz zu bedingten Sprüngen nicht besonders teuer.