Γιώργος Δημητρίου Ενότητα 3 η : Ενδιάμεση Αναπαράσταση / SSA
Ενδιάμεση Αναπαράσταση (IR) Η ενδιάμεση αναπαράσταση αποθηκεύει τη συγκεντρωμένη πληροφορία από την ανάλυση ενός προγράμματος Από την ενδιάμεση αναπαράσταση ξεκινάει η παραγωγή τελικού κώδικα Σημαντικός στόχος του σχεδιαστή ενός μεταγλωττιστή αποτελεί η ανεξαρτητοποίηση του εμπρόσθιου από το οπίσθιο τμήμα με τη βοήθεια μιας ισχυρής αλλά ευέλικτης ενδιάμεσης αναπαράστασης
Μορφές IR Γραμμικές αναπαραστάσεις Πλησιέστερα στον τελικό κώδικα Δύσκολες για βελτιστοποίηση Αναπαραστάσεις γραφημάτων Πλησιέστερα στον αρχικό κώδικα Πιο ευέλικτες για βελτιστοποίηση SSA Ουσιαστικά γραμμική αναπαράσταση Καλή για βελτιστοποίηση
Παράδειγμα Αρχικός κώδικας: if (x>y) a=a+3; else a=a-2; b=a; Τετράδες: 1: <=,x,y,5 2: +,a,3,$1 3: :=,$1,-,a 4: jump,-,-,7 5: -,a,2,$2 6: :=,$2,-,a 7: :=,a,-,b x AST: if > = y a a stmt = + a 3 a b - = 2 a SSA: if (x>y) a1:=a+3 else a2:=a-2 a3:=φ(a1,a2) b:=a3
Εισαγωγή στη Μορφή SSA Ένα πρόγραμμα βρίσκεται σε μορφή SSA (Static Single-Assignment), εάν και μόνο εάν: Κάθε μεταβλητή ορίζεται στατικά ακριβώς μία φορά, και Κάθε χρήση μεταβλητής ακολουθεί πάντα τον ορισμό της
Γιατί SSA; Αποτελεί μια κοινή βάση για την επίλυση πολλών κλασικών προβλημάτων ανάλυσης ροής δεδομένων Ενσωματώνει ροή ελέγχου και ροή δεδομένων στην ίδια δομή Η μορφή SSA κατασκευάζεται και συντηρείται εύκολα Πολλοί αλγόριθμοι ανάλυσης ροής δεδομένων έχουν χαμηλότερη πολυπλοκότητα με SSA από ό,τι με AST
Στατικός Ορισμός Μεταβλητών Κάθε μεταβλητή έχει μόνο έναν ορισμό (δηλαδή ανάθεση τιμής) στον κώδικα Ο ορισμός αυτός μπορεί να βρίσκεται σε βρόχο, κι έτσι να εκτελείται πολλές φορές Άρα στην ουσία μια μεταβλητή ορίζεται δυναμικά πολλές φορές
Ορισμοί και Μονοπάτια Ελέγχου Κάθε μεταβλητή πρέπει να έχει ένα μοναδικό ορισμό σε κάθε σημείο χρήσης της (reaching definition) Όταν δύο μονοπάτια συναντώνται, εισάγεται μια ειδική συνάρτηση φ(), η οποία συνδέει τους διαφορετικούς ορισμούς μιας μεταβλητής στον ένα μοναδικό ορισμό που απαιτεί η μορφή SSA
Παράδειγμα: CFG a = a = = a+5 a = = a+5 Πολλαπλοί Ορισμοί Χρήσης = a+5 Stanford University
Παράδειγμα: Μορφή SSA a 1 = a 3 = = a 1 +5 a 2 = = a 2 +5 a 4 = φ(a 1,a 3 ) = a 4 +5 Μοναδικός Ορισμός Χρήσης Stanford University
Συναρτήσεις φ() Ένα όρισμα μιας συνάρτησης φ() αποτελεί τον ορισμό χρήσης από το αντίστοιχο μονοπάτι Η σειρά των ορισμάτων μιας συνάρτησης φ() είναι σημαντική για να ξέρουμε από ποιο μονοπάτι προέρχεται ο ορισμός Στην ουσία μια συνάρτηση φ() επιλέγει ένα από τα ορίσματά της, ανάλογα με το μονοπάτι που οδήγησε σε αυτήν
Αποδοτικότητα της Μορφής SSA Use-Def chains: Πολλές χρήσεις (uses) προς πολλούς ορισμούς (defs) a = a = a = Κόστος αναπαράστασης Δυσκολία διαχείρισης a a a Peking University
Αποδοτικότητα της Μορφής SSA Το πλήθος των ακμών μειώθηκε από 9 σε 6 Η συνάρτηση φ() απότελεί ορισμό (def) και τα ορίσματά της απότελούν χρήσεις (uses) Πολλές χρήσεις προς έναν ορισμό Κάθε ορισμός είναι α- ποκλειστικός για όλες τις χρήσεις του a = a = a = a = φ a,a,a) a a a Peking University
Μετονομασία Τιμών Η αναπαράσταση των ακμών usedef δεν είναι πια απαραίτητη a 1 = a 2 = a 4 = φ a 1,a 2,a 3 ) a 3 = a 4 a 4 a 4 Peking University
Μορφή SSA και Σημεία Σύγκλισης Ροής Ελέγχου Είναι αυτός ο κώδικας σε μορφή SSA; Όχι, υπάρχουν δύο ορισμοί για τη χρήση του a στο μπλοκ B4 (στα μπλοκ B1 και B3) Πώς μετατρέπεται ο κώδικας σε μορφή SSA; B3 B1 B2 b M[x] a 0 a b if b<4 Δημιουργούμε δύο εκδοχές για το a, μία στο B1 και μία στο B3 B4 c a + b Peking University
Μορφή SSA και Σημεία Σύγκλισης Ροής Ελέγχου Ποια εκδοχή του a χρησιμοποιούμε τώρα στο μπλοκ B4; B1 b M[x] a1 0 Εισάγουμε τη συνάρτηση φ() η οποία κατά κάποιον τρόπο ξέρει από ποιο μονοπάτι φτάσαμε στο μπλοκ B4: B3 B2 a2 b if b<4 φ a2, a1 = a2, αν φτάσαμε από το Β3 a1, αν φτάσαμε από το Β2 B4 c a? + b Peking University
Μορφή SSA και Σημεία Σύγκλισης Ροής Ελέγχου Ποια εκδοχή του a χρησιμοποιούμε τώρα στο μπλοκ B4; B1 b M[x] a1 0 Εισάγουμε τη συνάρτηση φ() η οποία κατά κάποιον τρόπο ξέρει από ποιο μονοπάτι φτάσαμε στο μπλοκ B4: B3 B2 a2 b if b<4 φ a2, a1 = a2, αν φτάσαμε από το Β3 a1, αν φτάσαμε από το Β2 B4 a3 φ(a2,a1) c a3 + b Peking University
Παράδειγμα Βρόχου a 0 b a+1 c c+b a b*2 if a < N return Σημείωση: Μόνο τα a και c έχουν χρήση στο σώμα του βρόχου πριν το νέο ορισμό τους. Το b ορίζεται εκ νέου στην αρχή του σώματος του βρόχου! a1 0 a3 (a1,a2) b1 (b0,b2) c2 (c0,c1) b2 a3+1 c1 c2+b2 a2 b2*2 if a2 < N return Peking University Η φ(b0,b2) δε χρειάζεται, αφού δεν υπάρχει χρήση του b0. Όμως η φάση εισαγωγής των συναρτήσεων φ() αυτό δεν το γνωρίζει. Άχρηστες συναρτήσεις αφαιρούνται από τη φάση απαλοιφής άχρηστου κώδικα.
Υλοποίηση Συναρτήσεων φ() Πώς υλοποιούμε μια συνάρτηση φ() που γνωρίζει ποιο μονοπάτι ελέγχου ακολουθείται; Απάντηση 1: Δεν την υλοποιούμε!! Η συνάρτηση φ() χρησιμοποιείται μόνο για να συνδέσει χρήσεις με ορισμούς κατά τη φάση της βελτιστοποίησης, αλλά δεν υλοποιείται. Απάντηση 2: Αν πρέπει να εκτελέσουμε μια συνάρτηση φ(), μπορούμε να την υλοποιήσουμε με εισαγωγή εντολών MOVE σε όλα τα μονοπάτια.
Εισαγωγή Συναρτήσεων φ() Μπορούμε να εισάγουμε μια συνάρτηση φ() για κάθε μεταβλητή σε κάθε σημείο σύγκλισης του γράφου ροής ελέγχου (CFG). Αλλά αυτό δεν είναι και η καλύτερη ιδέα. Ποια θα πρέπει να είναι τα κριτήριά μας για να εισάγουμε μια συνάρτηση φ() για κάποια μεταβλητή a σε κάποιον κόμβο z του CFG; Διαισθητικά, θα πρέπει να εισάγουμε μια συνάρτηση φ() εάν υπάρχουν δύο ορισμοί της μεταβλητής a που φτάνουν στον κόμβο z μέσα από διαφορετικά μονοπάτια.
Η Απλοϊκή Μέθοδος Απλή εισαγωγή μιας συνάρτησης φ() σε κάθε σημείο σύγκλισης του CFG Αλλά αυτό δεν είναι αποδοτικό εισάγουμε υπερβολικά πολλές άχρηστες συναρτήσεις φ()! Ποιος είναι καλός αλγόριθμος εισαγωγής μόνο των χρήσιμων συναρτήσεων φ();
Κριτήριο Σύγκλισης Μονοπατιών Εισαγωγή μιας συνάρτησης φ() για μια μεταβλητή a σε κάποιον κόμβο z, εάν είναι αληθείς όλες οι παρακάτω συνθήκες: 1. Υπάρχει μπλοκ x όπου ορίζεται η μεταβλητή a 2. Υπάρχει και άλλο μπλοκ y x που ορίζει την a 3. Υπάρχει μη κενό μονοπάτι Pxz από το x στο z 4. Υπάρχει μη κενό μονοπάτι Pyz από το y στο z 5. Τα μονοπάτια Pxz και Pyz δεν έχουν κοινούς κόμβους πέρα από τον z 6. Ο κόμβος z δεν εμφανίζεται και στα δύο μονοπάτια Pxz και Pyz πριν το τέλος τους, αλλά μπορεί να εμφανίζεται σε ένα από τα δύο. Ο κόμβος έναρξης θεωρείται ότι περιέχει ορισμό για κάθε μεταβλητή.
Επαναληπτικό Κριτήριο Σύγκλισης Μονοπατιών Εφόσον μια συνάρτηση φ() αποτελεί και αυτή ορισμό της μεταβλητής a, το κριτήριο σύγκλισης θα πρέπει να εφαρμόζεται επαναληπτικά: όσο υπάρχουν κόμβοι x, y, z που ικανοποιούν τις συνθήκες 1-6 και ο z δεν περιέχει συνάρτηση φ() για τη μεταβλητή a επανάλαβε εισαγωγή a (a, a,, a) στον κόμβο z Ο αλγόριθμος είναι υπερβολικά ακριβός, εφόσον απαιτεί την εξέταση κάθε τριάδας κόμβων x, y, z και κάθε μονοπατιού από τον x στον y. Μπορούμε καλύτερα;
Η Ιδέα των Συνόρων Κυριαρχίας Διαισθητικά: bb1 a bbn Μπλοκ κυριαρχούμενα από το bb1 a Σύνορο μεταξύ κυριαρχίας και μη-κυριαρχίας (Σύνορο Κυριαρχίας) Peking University
Σύνορα Κυριαρχίας (Dominance Frontiers) Το σύνορο κυριαρχίας DF(x) ενός κόμβου x είναι το σύνολο όλων των κόμβων z τέτοιων ώστε το x κυριαρχεί κάποιον πρόγονο του z, χωρίς αυστηρή κυριαρχία του z. Εάν το x κυριαρχεί το y και x y, τότε λέμε ότι το x κυριαρχεί αυστηρά το y
Υπολογισμός του Συνόρου Κυριαρχίας Διαισθητικά: Ποιο είναι το σύνορο κυριαρχίας του κόμβου 5; 1. Εύρεση περιοχής κυριαρχίας του κόμβου 5: {5, 6, 7, 8} 1 2 9 5 2. Εύρεση προορισμών των ακμών που φεύγουν από την περιοχή κυριαρχίας του κόμβου 5 Προορισμοί που αποτελούν το σύνορο κυριαρχίας του κόμβου 5: DF(5) = { 4, 5, 12, 13} 3 4 6 7 10 11 8 12 13 Peking University Γιατί ο κόμβος 5 βρίσκεται στο DF(5);
Αλγόριθμος Μετατροπής σε SSA Σε γενικές γραμμές, η μετατροπή ενός κώδικα σε μορφή SSA γίνεται σε τρία βήματα: Βήμα 1. Ξεκινώντας από το CFG, βρίσκουμε τα σύνορα κυριαρχίας όλων των κόμβων. Βήμα 2. Χρησιμοποιώντας τα σύνορα κυριαρχίας, καθορίζουμε τις θέσεις όπου θα εισαχθούν συναρτήσεις φ() για κάθε μεταβλητή του προγράμματος. Βήμα 3. Μετονομάζουμε τις μεταβλητές, αντικαθιστώντας κάθε αναφορά μιας μεταβλητής V με την κατάλληλη δεικτοδοτούμενη αναφορά μιας νέας μεταβλητής V i
Γράφος Ροής Ελέγχου (Control Flow Graph) CFG = (V, E), όπου V οι κόμβοι και Ε οι ακμές Το σύνολο V περιέχει και τους ειδικούς κόμβους START και END: Κάθε κόμβος είναι προσβάσιμος από τον κόμβο START Ο κόμβος END είναι προσβάσιμος από κάθε κόμβο του CFG. Ο κόμβος START δεν έχει προγόνους Ο κόμβος END δεν έχει απογόνους
Δέντρο Κυριαρχίας (Dominator Tree) Αν ο κόμβος X υπάρχει σε κάθε μονοπάτι μεταξύ START και Y, τότε ο X κυριαρχεί τονy. Η σχέση κυριαρχίας είναι ανακλαστική και μεταβατική. idom(y): άμεσος κυρίαρχος τουy Δέντρο Κυριαρχίας Ο κόμβος START αποτελεί τη ρίζα Κάθε κόμβος Υ εκτός του START έχει γονέα τον κόμβο idom(y)
Παράδειγμα Δέντρου Κυριαρχίας START START a b c d CFG END DT Stanford University
Παράδειγμα Δέντρου Κυριαρχίας START a a START b c d CFG END DT Stanford University
Παράδειγμα Δέντρου Κυριαρχίας START a a START b c b c d CFG END DT Stanford University
Παράδειγμα Δέντρου Κυριαρχίας START a a START b c b c d d CFG END DT Stanford University
Παράδειγμα Δέντρου Κυριαρχίας START a a START END b c b c d d CFG END DT Stanford University
Παράδειγμα Συνόρων Κυριαρχίας START a a START END b c b c d DT d DF(c) =? CFG END DF(a) =? Stanford University
Παράδειγμα Συνόρων Κυριαρχίας START a a START END b c b c d DT d DF(c) = {d} CFG END DF(a) =? Stanford University
Παράδειγμα Συνόρων Κυριαρχίας START START a a END b c b c d DT d DF(c) = {d} CFG END DF(a) = {END} Stanford University
Υπολογισμός Συνόρων Κυριαρχίας Σύνορο κυριαρχίας DF(X) του κόμβου X Σχέση 1: DF(X) ={Y P Pred(Y): X dom P and X!sdomY } Σχέση 2: DF(X) = DF local (X) Z Παιδιά(X) DF up (Z) DF local (X) = {Y Παιδιά(X) X!sdomY} = {Y Παιδιά(X) idom(y) X} DF up (Z) = {Y DF(Z) idom(z)!sdomy}
Υπολογισμός Συνόρων Κυριαρχίας Γιατί οι προηγούμενες σχέσεις 1 και 2 είναι ισοδύναμες; Είναι εύκολο να πάμε από τη σχέση 1 στη σχέση 2. Άρα πρέπει να δείξουμε ότι η σχέση 2 βρίσκει κάθε κόμβο του DF(X). Έστω Y DF(X) και U->Y ακμή τέτοια, ώστε ο Χ κυριαρχεί τον U αλλά δεν κυριαρχεί αυστηρά τονy. Αν U = X, τότεy DF local (X) Αν U X, τότε υπάρχει μονοπάτι μεταξύ Χ και U στο Δέντρο Κυριαρχίας κάτι που σημαίνει ότι υπάρχει παιδί Ζ του Χ το οποίο να κυριαρχεί τον U. Ο Z δεν κυριαρχεί αυστηρά τον Υ, επειδή ο Χ δεν κυριαρχεί αυστηρά τονy. ΆραY DF up (Z).
Συναρτήσεις φ() και Σύνορο Κυριαρχίας Διαισθητικά καταλαβαίνουμε ότι η σχέση Y DF(X) σημαίνει: ΟY έχει πολλαπλούς προγόνους Ο X κυριαρχεί κάποιον από αυτούς, έστω τον U, οπότε ο U κληρονομεί όλες τις σχέσεις του κόμβου X Οι ορισμοί χρήσης του Υ προέρχονται από τον U και άλλους προγόνους Άρα ο Y είναι ακριβώς μια θέση όπου πρέπει να μπει συνάρτηση φ()
Εισαγωγή Συναρτήσεων φ() Αλγόριθμος: Για κάθε μεταβλητή V Βάλε σε μια λίστα εργασίας W όλους τους κόμβους με ανάθεση στη V Όσο υπάρχει X στη λίστα W επανάλαβε Για κάθε κόμβοy στο DF(X) κάνε Εάν δεν υπάρχει φ() στονy τότε Πρόσθεσε (V = φ (V,,V)) στονy Εάν οy δεν έχει ξανασυναντηθεί, βάλτον στη λίστα W.
Μετονομασία Μεταβλητών Αναδρομικά για κάθε μεταβλητή, ξεκινώντας με τον κόμβο START, χρησιμοποιώντας στοίβα Για τον κόμβο X Για κάθε ανάθεση (V = ) του X Μετονόμασε τις χρήσεις της μεταβλητής V με το όνομα στην κορυφή της στοίβας Βάλε το νέο όνομα V i στη στοίβα i = i + 1 Μετονόμασε τα ορίσματα της συνάρτησης φ() μέσω των ακμών του CFG Εφάρμοσε αναδρομικά για όλα τα παιδιά του Χ στο δέντρο κυριαρχίας Για κάθε ανάθεση (V = ) του X Βγάλε το V i από τη στοίβα
Παραγωγή Κώδικα από SSA Απλοϊκή λύση: Μια συνάρτηση φ() με k ορίσματα, που βρίσκεται στην αρχή ενός κόμβου Χ, μπορεί να αντικατασταθεί α- πό k απλές αναθέσεις, στο τέλος κάθε πατρικού κόμβου του Χ στο CFG. Πρόβλημα αποδοτικότητας κώδικα;
Παραγωγή Κώδικα από SSA Επιλογή 1: χρωματισμός Υπολόγισε τις διάρκειες ζωής των μεταβλητών και δώσε ένα μοναδικό όνομα μεταβλητής για κάθε διάρκεια ζωής Όπως κάνουμε στη δέσμευση καταχωρητών! Επιλογή 2: απλή διαγραφή όλων των συναρτήσεων φ() Οι βελτιστοποιήσεις με βάση τη μορφή SSA πρέπει να μη δημιουργούν επικαλυπτόμενες διάρκειες ζωής
Απαλοιφή Άχρηστου Κώδικα Για ποιο λόγο ένας κώδικας είναι άχρηστος; Ανάθεση χωρίς επόμενη χρήση Μέθοδος απαλοιφής άχρηστου κώδικα Σημείωσε όλες τις εντολές ως άχρηστες Σημείωσε κάποιες εντολές ως χρήσιμες (ζωντανές) με βάση κάποια κριτήρια Έτσι όμως δημιουργείς και άλλες χρήσιμες εντολές Πραγματικά άχρηστος κώδικας είναι εκείνος που έμεινε σημειωμένος ως άχρηστος Peking University
Παράδειγμα Χρήσης SSA Διαισθητική απαλοιφή άχρηστου κώδικα (dead code elimination) Εφόσον για κάθε μεταβλητή υπάρχει μόνο ένας ορισμός, αν η λίστα χρήσεων της μεταβλητής είναι κενή, τότε ο ορισμός είναι άχρηστος Όταν μια εντολή v x op y απαλείφεται επειδή δεν υπάρχει χρήση της v, τότε η εντολή πρέπει να απαλειφτεί και από τις χρήσεις των x και y, κάτι που μπορεί να αχρηστεύσει και τους ορισμούς αυτών των μεταβλητών, κοκ
Παράδειγμα Χρήσης SSA Διαισθητική διάδοση σταθερής τιμής (constant propagation) Αν υπάρχει εντολή v c, όπου c είναι σταθερά, τότε όλες οι χρήσεις της v μπορούν να αντικατασταθούν με c Μια εντολή της μορφής v φ(c1, c2,, cn) όπου όλα τα ci είναι ταυτόσημα μπορεί να απλοποιηθεί σε v c. Χρησιμοποιώντας αλγόριθμο με λίστα εργασίας σε ένα πρόγραμμα που βρίσκεται σε μορφή SSA, υλοποιούμε διάδοση σταθεράς σε γραμμικό χρόνο
Παράδειγμα i=1; j=1; k=0; while(k<100) { if(j<20) { j=i; k=k+1; } else { j=k; k=k+2; } } return j; } B5 B3 j i k k+1 B7 B2 B1 if j<20 i 1 j 1 k 0 if k<100 j k k k+2 return j B6 B4 Peking University
Παράδειγμα i=1; j=1; k=0; while(k<100) { if(j<20) { j=i; k=k+1; } else { j=k; k=k+2; } } return j; } B5 B3 j i k3 k+1 B7 B1 B2 if j<20 i 1 j 1 k1 0 if k<100 return j j k k5 k+2 B6 B4
Παράδειγμα i=1; j=1; k=0; while(k<100) { if(j<20) { j=i; k=k+1; } else { j=k; k=k+2; } } return j; } B5 j i k3 k+1 B7 B3 B1 B2 if j<20 i 1 j 1 k1 0 if k<100 return j j k k5 k+2 k4 (k3,k5) B6 B4
Παράδειγμα i=1; j=1; k=0; while(k<100) { if(j<20) { j=i; k=k+1; } else { j=k; k=k+2; } } return j; } B5 j i k3 k+1 B7 B3 B2 B1 if j<20 i 1 j 1 k1 0 k2 (k4,k1) if k<100 return j j k k5 k+2 k4 (k3,k5) B6 B4
Παράδειγμα i=1; j=1; k=0; while(k<100) { if(j<20) { j=i; k=k+1; } else { j=k; k=k+2; } } return j; } B5 j i k3 k2+1 B7 B3 B2 B1 if j<20 i 1 j 1 k1 0 k2 (k4,k1) if k2<100 return j j k2 k5 k2+2 k4 (k3,k5) B6 B4
Παράδειγμα i=1; j=1; k=0; while(k<100) { if(j<20) { j=i; k=k+1; } else { j=k; k=k+2; } } return j; } B5 j3 i1 k3 k2+1 B7 B3 B2 if j2<20 B1 j4 (j3,j5) k4 (k3,k5) i1 1 j1 1 k1 0 j2 (j4,j1) k2 (k4,k1) if k2<100 return j2 j5 k2 k5 k2+2 B6 B4
Διάδοση Σταθεράς B1 i1 1 j1 1 k1 0 B1 i1 1 j1 1 k1 0 B2 j2 (j4,j1) k2 (k4,k1) if k2<100 B2 j2 (j4, 1) k2 (k4,0) if k2<100 B3 if j2<20 return j2 B4 B3 if j2<20 return j2 B4 B5 j3 i1 k3 k2+1 j5 k2 k5 k2+2 B6 B5 j3 1 k3 k2+1 j5 k2 k5 k2+2 B6 B7 j4 (j3,j5) k4 (k3,k5) B7 j4 (j3,j5) k4 (k3,k5)
Απαλοιφή Άχρηστου Κώδικα B1 i1 1 j1 1 k1 0 B2 j2 (j4, 1) k2 (k4,0) if k2<100 B2 j2 (j4,1) k2 (k4,0) if k2<100 B3 if j2<20 return j2 B4 B3 if j2<20 return j2 B4 B5 j3 1 k3 k2+1 j5 k2 k5 k2+2 B6 B5 j3 1 k3 k2+1 j5 k2 k5 k2+2 B6 B7 j4 (j3,j5) k4 (k3,k5) B7 j4 (j3,j5) k4 (k3,k5)
Συνέχεια B2 j2 (j4,1) k2 (k4,0) if k2<100 B2 j2 (j4,1) k2 (k4,0) if k2<100 B3 if j2<20 return j2 B4 B3 if j2<20 return j2 B4 B5 j3 1 k3 k2+1 j5 k2 k5 k2+2 B6 B5 j3 1 k3 k2+1 j5 k2 k5 k2+2 B6 B7 j4 (j3,j5) k4 (k3,k5) B7 j4 (1,j5) k4 (k3,k5)
Κι Άλλη Βελτιστοποίηση B5 k3 k2+1 B7 B3 B2 if j2<20 j4 (1,j5) k4 (k3,k5) j2 (j4,1) k2 (k4,0) if k2<100 return j2 j5 k2 k5 k2+2 B6 B4 Μπορούμε να δούμε ότι το μπλοκ Β6 δεν εκτελείται ποτέ! Πώς μπορούμε να το καταλάβουμε αυτό και να απλοποιήσουμε τον κώδικα; Χρησιμοποιώντας τη διάδοση σταθεράς υπό συνθήκη, η οποία βρίσκει ότι το j2 δεν αλλάζει τιμή και έτσι επιτρέπει περαιτέρω απαλοιφή άχρηστου κώδικα
Περαιτέρω Απαλοιφή Άχρηστου Κώδικα B2 j2 (j4,1) k2 (k4,0) if k2<100 B2 j2 (j4,1) k2 (k4,0) if k2<100 B3 if j2<20 return j2 B4 return j2 B4 k3 k2+1 j5 k2 k5 k2+2 B6 B5 k3 k2+1 B7 j4 (1,j5) k4 (k3,k5) B7 j4 (1) k4 (k3)
Απαλοιφή Συναρτήσεων φ B2 j2 (j4,1) k2 (k4,0) if k2<100 B2 j2 (j4,1) k2 (k4,0) if k2<100 return B4 j2 B4 return j2 B4 B5 k3 k2+1 B5 k3 k2+1 B7 j4 (1) k4 (k3) B7 j4 1 k4 k3
Διάδοση Σταθεράς και Αντιγράφου B2 j2 (j4,1) k2 (k4,0) if k2<100 B2 j2 (1,1) k2 (k3,0) if k2<100 return j2 B4 return j2 B4 B5 k3 k2+1 B5 k3 k2+1 B7 j4 1 k4 k3 B7 j4 1 k4 k3
Κι Άλλος Άχρηστος Κώδικας B2 j2 (1,1) k2 (k3,0) if k2<100 B2 j2 (1,1) k2 (k3,0) if k2<100 return j2 B4 return j2 B4 B5 k3 k2+1 B5 k3 k2+1 B7 j4 1 k4 k3
Κι Άλλη Απλοποίηση Συνάρτησης φ B2 j2 (1,1) k2 (k3,0) if k2<100 B2 j2 1 k2 (k3,0) if k2<100 return j2 B4 return j2 B4 B5 k3 k2+1 B5 k3 k2+1
Κι Άλλη Διάδοση Σταθεράς B2 j2 1 k2 (k3,0) if k2<100 B2 j2 1 k2 (k3,0) if k2<100 return j2 B4 return 1 B4 B5 k3 k2+1 B5 k3 k2+1
Τελικός Κώδικας! B2 j2 1 k2 (k3,0) if k2<100 return 1 B4 return 1 B4 B5 k3 k2+1