تحلیل مستعار
تحلیل مستعار مجموعه‌ای از روش‌هایی است که تعیین می‌کند که آیا دو اشاره گر به شیء یکسانی در حافظه اشاره می‌کنند یا نه. الگوریتم‌های مختلفی برای تحلیل مستعار و راه‌های زیادی برای دسته‌بندی آن‌ها وجود دارد که عبارت است از: الگوریتم غیرحساس به جریان، الگوریتم حساس به متن و الگوریتم غیر حساس به متن، الگوریتم حساس به میدان و الگوریتم غیر حساس به میدان، مبتنی بر متحدسازی و مبتنی بر زیرمجموعه و غیره. در صورتی که دو اشاره‌گر به یک مکان اشاره کنند به آن‌ها مستعار می‌گویند. در نتیجه هر دو متغیری که می‌توانند مقادیرشان را از دو مقدار رسمی مجزا بگیرند نیز مستعار خواهند بود. در ابتدا تحلیل‌گرهای مستعار به یک جستار با کلماتی مثل: must, may و no جواب می‌دادند که نشان می‌داد که دو اشاره‌گر همیشه به یک شیء یکسان اشاره می‌کنند یا نه. وجود متغیرهای مستعار عملیات بهینه‌سازی را سخت‌تر می‌کنند زیرا نمی‌توانیم تشخیص دهیم که این کدام متغیر تغییر کرده‌است.
کلاس تحلیل مستعار یک رابط(interface) تعریف می‌کند که پیاده‌سازی های مختلفی از تحلیل مستعار باید آن را پشتیبانی کنند. این کلاس دو enum مهم به نام‌های AliasResult و ModRefResult دارد که به ترتیب نتیجهٔ یک جستار مستعار یا یک جستار mod/ref را نشان می‌دهند. رابط AliasAnalysis اطلاعات حافظه را به روش‌های مختلف نمایش می‌دهد. به خصوص شی‌های حافظه به عنوان آدرس شروع و اندازه، و فراخوانی توابع به صورت دستور یک فراخوانی واقعی که فراخوانی را انجام می‌دهند نشان داده می‌شوند. علاوه بر این رابط AliasAnalysis چند روش کمک‌کننده که به شما امکان گرفتن اطلاعات mod/ref را برای دستور دلخواه را می‌دهد. در در همهٔ رابط‌های AliasAnalysis باید در جستارهای شامل مقدارهای چندگانه، مقدارهایی که ثابت نیستند باید در همان تابع تعریف شوند. به‌طور کلی تحلیل مستعار تعیین می‌کند که آیا ارجاع به حافظه به قسمت یکسانی اشاره می‌کند یا نه. در نتیجه این اجازه به کامپایلر داده می‌شود که مشخص کند که متغیرهای برنامه توسط یک بخش از برنامه عوض می‌شوند یا خیر. برای مثال قطعه کد زیر را در نطر بگیرید:
سه حالت مستعار برای این کد وجود دارد:
در صورتی که مستعار نباشند آنگاه i برابر ۴ خواهد شد. اگر حالت دوم پیش بیاید i برابر ۵ می‌شود، چون p.foo + 3 = q.foo + 3. در هر دو حالت می‌توانیم بهینه‌سازی را روی آن‌ها اجرا کنیم. از طرفی، اگر نمی‌دانیم که این دو متغیر مستعار هستند یا نه نمی‌توان بهینه‌سازی را انجام داد و کل برنامه باید اجرا شود تا نتیجه به دست آید. در صورتی که وضعیت مستعار بودن دو ارجاع به حافظه نامشخص باشد می‌گوییم رابطهٔ may_alias دارند.
نوشتن یک تحلیل مستعار برای LLVM کار نسبتاً ساده‌ای است. پیاده‌سازی‌های مختلفی وجو دارد که می‌توان از آن‌ها استفاده کرد. در اولین مرحله باید مشخص کنیم چه نوع LLVM pass ای برای استفاده در تحلیل مستعار نیاز داریم. همانند سایر تحلیل‌ها و تبدیل ها، پاسخ باید از نوع مسئله‌ای که می‌خواهیم حل کنیم واضح باشد:
در تحلیل مستعار حافظهٔ برنامه را به کلاس‌های مستعار تقسیم می‌کنیم. کلاس‌های مستعار مجموعه‌های مجزایی از محل‌های حافظه هستند که نمی‌توانند مستعار هم دیگر باشند. در اینجا فرض می‌شود که بهینه‌سازی روی نمایش سطح پایین برنامه اتفاق می‌افتد. چون برنامه‌ای که کامپایل می‌شود اعمال دودویی، پرش‌ها، حرکت بین ثبات‌ها، حرکت بین ثبات‌ها و حافظه، انشعاب و فراخوانی و برگرداندن توابع را انجام می‌دهد.
اگر زبانی که کامپایل می‌شود از نظر نوع امن باشد، بررسی‌کننده نوع(type checker) درست کار می‌کند و برنامه قادر به ایجاد اشاره گرهای اشاره‌کننده به متغیرهای محلی نیست. حال بهینه‌سازی‌های مفیدی می‌توان انجام داد. حالت‌های مختلفی وجود دارد که می‌دانیم دو محل از حافظه باید در کلاس‌های مستعار مختلفی باشند: وقتی تحلیل مستعار برای برنامه اجرا می‌شود هر عمل بارگذاری و ذخیره در حافظه باید با کلاسش برچسب‌گذاری شود. آنگاه اگر محل‌های formula_1 و formula_2 از حافظه را با کلاس‌های formula_3 و formula_4 در نظر بگیریم اگر formula_5 آنگاه formula_1 و formula_2 با هم may-alias خواهند بود و اگر formula_8 مستعار یکدیگر نخواهند بود.
تحلیل مستعار مبتنی بر جریان را بر خلاف تحلیل مستعار مبتنی بر نوع می‌توان در برنامه‌های یک زبان با ارجاعات و تغییر نوع استفاده کرد. این نوع از تحلیل را می‌توان به جای تحلیل مبتنی بر نوع مکمل استفاده کرد. در این تحلیل کلاس‌های مستعار برای هر تخصیص از حافظه و برای هر متغیر محلی و سراسری که آدرس آن استفاده می‌شود، ایجاد می‌شود. ارجاعات به حافظه ممکن است به بیش از یک مقدار در طول زمان اشاره کنن و در نتیجه در بیش از یک کلاس مستعار باشند و این بدان معناست که هر تخصیص حافظه یک مجموعه از کلاس‌ها به جای یک کلاس مستعار دارد.