การพึ่งพาการควบคุม
การพึ่งพาการควบคุมคือสถานการณ์ที่คำสั่งในโปรแกรมจะทำงานก็ต่อเมื่อคำสั่งก่อนหน้าประเมินผลในลักษณะที่อนุญาตให้คำสั่งนั้นทำงานได้
คำสั่ง B มีการพึ่งพาการควบคุมจากคำสั่ง A ที่อยู่ก่อนหน้า หากผลลัพธ์ของคำสั่ง A เป็นตัวกำหนดว่าควรดำเนินการคำสั่ง B หรือไม่ ในตัวอย่างต่อไปนี้ คำสั่ง Bมีการพึ่งพาการควบคุมตามคำสั่ง. อย่างไรก็ตาม,ไม่ขึ้นอยู่กับเพราะจะถูกดำเนินการเสมอโดยไม่คำนึงถึงผลลัพธ์ของ.
S1. ถ้า (a == b) S2. a = a + b S3. b = a + b
โดยสัญชาตญาณแล้ว จะมีความสัมพันธ์เชิงควบคุมระหว่างข้อความสองข้อความ A และ B ถ้า
- B อาจถูกดำเนินการหลังจาก A
- ผลลัพธ์ของการดำเนินการ A จะเป็นตัวกำหนดว่า B จะถูกดำเนินการหรือไม่
ตัวอย่างทั่วไปคือ มีความสัมพันธ์เชิงควบคุมระหว่างส่วนเงื่อนไขของคำสั่ง if กับคำสั่งต่างๆ ในส่วนจริง/เท็จของคำสั่งนั้น
นิยามอย่างเป็นทางการของความขึ้นอยู่กับการควบคุมสามารถนำเสนอได้ดังนี้:
คำแถลงกล่าวกันว่าการควบคุมนั้นขึ้นอยู่กับข้อความอื่นก็ต่อเมื่อ
- มีเส้นทางอยู่จากถึงโดยที่ทุกข้อความ≠ภายในตามมาด้วยในแต่ละเส้นทางที่เป็นไปได้จนถึงจุดสิ้นสุดของโปรแกรมและ
- จะไม่จำเป็นต้องปฏิบัติตามเสมอไปกล่าวคือ มีเส้นทางการดำเนินการจากจนถึงจุดสิ้นสุดของโปรแกรมที่ไม่ดำเนินต่อไป.
เมื่อแสดงออกมาโดยใช้หลักการ (หลัง) การครอบงำ เงื่อนไขทั้งสองจะเทียบเท่ากันดังนี้
- โพสต์ครอบงำทั้งหมด
- ไม่ครอบงำภายหลัง
การสร้างความสัมพันธ์การควบคุม
การพึ่งพาการควบคุมโดยพื้นฐานแล้วคือขอบเขตการครอบงำในกราฟย้อนกลับของกราฟการไหลของการควบคุม (CFG) [ 1 ]ดังนั้น วิธีหนึ่งในการสร้างสิ่งเหล่านี้คือการสร้างขอบเขตการครอบงำภายหลังของ CFG แล้วกลับด้านเพื่อให้ได้กราฟการพึ่งพาการควบคุม
ต่อไปนี้เป็นรหัสเทียมสำหรับการสร้างขอบเขตหลังการครอบงำ:
สำหรับแต่ละ X ในการท่องต้นไม้แบบจากล่างขึ้นบนของต้นไม้หลังโดมิเนเตอร์ให้ทำดังนี้ : PostDominanceFrontier(X) ← ∅ สำหรับแต่ละ Y ∈ Predecessors(X) ให้ทำดังนี้: ถ้า immediatePostDominator(Y) ≠ X: แล้ว PostDominanceFrontier(X) ← PostDominanceFrontier(X) ∪ {Y} เสร็จสิ้นสำหรับแต่ละ Z ∈ Children(X) ให้ทำดังนี้ : สำหรับแต่ละ Y ∈ PostDominanceFrontier(Z) ให้ทำดังนี้ : ถ้า immediatePostDominator(Y) ≠ X: แล้ว PostDominanceFrontier(X) ← PostDominanceFrontier(X) ∪ {Y} เสร็จสิ้นเสร็จสิ้นเสร็จสิ้นในที่นี้ Children(X) คือเซตของโหนดใน CFG ที่ถูกครอบงำโดยX ทันที และ Predecessors(X) คือเซตของโหนดใน CFG ที่อยู่ก่อนหน้าX โดยตรง ใน CFG โปรดทราบว่าโหนดXจะถูกประมวลผลก็ต่อเมื่อโหนด Children ทั้งหมดได้รับการประมวลผลแล้วเท่านั้น เมื่อคำนวณแผนที่ขอบเขตการครอบงำแล้ว การย้อนกลับแผนที่นี้จะส่งผลให้ได้แผนที่จากโหนดใน CFG ไปยังโหนดที่มีการพึ่งพาการควบคุมต่อโหนดเหล่านั้น