سؤال

أنا أعمل على مترجم لآلة كومة (على وجه التحديد سيل) لقد حظيت الشفرة في رسم بياني للكتل الأساسية. من هنا أتطلع إلى تطبيق SSA. إلى الأساليب، لكنها لا تسير على ما يرام. كانت محاولتي الأولى (أثناء العمل مع قائمة مسطحة، بدلا من الرسم البياني) هي التكرار فوق الرمز والحفاظ على كومة من معرفات SSA (أي أهداف التخصيص)، مما دفعها عندما أقوم بإنتاج مهمة، ظهرت لهم متى يتم استخدامها. يعمل هذا على ما يرام على كتلة أساسية واحدة، لكنني ببساطة لا يمكنني معرفة كيفية التعامل مع وظائف الإنتاج.

تتمثل هذه الفكرة في إلقاء وضع مكدس إلى معرفات SSA، ثم انظر إلى ما لا يزال على المكدس عندما تتقارب مسارات التعليمات البرمجية، ولكن هذا لا يبدو وكأنه الطريقة الصحيحة (TM) من فعل الأشياء.

هل هناك خوارزمية بسيطة لتتبع التلاعب المكدس عبر مسارات التعليمات البرمجية المتعددة وتحديد الاصطدامات عند تربى؟

هل كانت مفيدة؟

المحلول

تحتاج إلى إلقاء نظرة على المتعدد مجموعة من معرفات SSA متقارق على عقدة (كتلة أساسية). احتفظ بنية الكتلة الأساسية المتوسطة، بهذه الطريقة يمكنك بسهولة استخدام (مثل الاستعلام) كافة المعرفات في كتلة.

لست متأكدا مما تعنيه بالاصطدام، لكنني أفترض أنك تريد حل شيء مثل

 if (bExp)                  if (bExp)
   x := 1                    x1 := 1
 else            SSA:       else
   x := 2                    x2 := 2
 y := x;                    y := Phi(x1,x2)

وهذا هو، تريد فاي في هذا المكان. أدرك أنه لا يوجد فاي في التعليمات البرمجية القابلة للتنفيذ! باستخدام المعلومات التي y إما (تعتمد) على x1 أو x2، يمكنك إعادة كتابة هذا في الخطوة التالية. على سبيل المثال، في تمثيل تركز على الذاكرة، يخبرك PHI (X1، X2) بأن x1 و x2 يجب أن يكون اسمي مستعارين لنفس موقع الذاكرة، أي أن ذي. فاي فقط العلاقات المعلومات معا.

if (bExp)
  stackframe[y_index] = 1     (y_index being some offset)
else
  stackframe[y_index] = 2
nop

آمل أن يساعد هذا قليلا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top