ঠিক পিএইচআই নির্দেশাবলী কী করে এবং কীভাবে এটি এলএলভিএম এ ব্যবহার করে


91

এলএলভিএমের বেশ অদ্ভুত ব্যাখ্যা সহ ফাই নির্দেশনা রয়েছে:

'ফাই' নির্দেশটি এসএসএ গ্রাফটিতে the নোডটি কার্যকারিতা উপস্থাপনের জন্য প্রয়োগ করা হয়।

সাধারণত এটি শাখা বাস্তবায়নের জন্য ব্যবহৃত হয়। যদি আমি সঠিকভাবে বুঝতে পারি তবে নির্ভরতা বিশ্লেষণ সম্ভব করে তোলা দরকার এবং কিছু ক্ষেত্রে এটি অপ্রয়োজনীয় লোড এড়াতে সহায়তা করতে পারে। তবে এটি ঠিক কী করে তা এখনও বোঝা শক্ত।

ক্যালিডোস্কোপের উদাহরণ এটি ifকেস জন্য মোটামুটি সুন্দরভাবে ব্যাখ্যা করে । তবে এটি পরিষ্কার কিভাবে মত লজিক্যাল অপারেশন বাস্তবায়ন না &&এবং|| । আমি যদি অনলাইনে llvm সংকলকটিতে নিম্নলিখিতটি লিখি :

void main1(bool r, bool y) {
    bool l = y || r;
}

শেষ বেশ কয়েকটি লাইন আমাকে সম্পূর্ণ বিভ্রান্ত করেছে:

; <label>:10                                      ; preds = %7, %0
%11 = phi i1 [ true, %0 ], [ %9, %7 ]
%12 = zext i1 %11 to i8

দেখে মনে হচ্ছে ফাই নোড একটি ফলাফল তৈরি করে যা ব্যবহার করা যেতে পারে। এবং আমি ছাপে ছিলাম যে ফাই নোড কেবলমাত্র কোন পাথ থেকে মানগুলি আসবে তা নির্ধারণ করে।

কেউ কোনও ফি নোড কী তা ব্যাখ্যা করতে পারেন এবং কীভাবে এটি প্রয়োগ ||করবেন?


4
phiনোড কম্পাইলার সমস্যা একটি সমাধান "স্ট্যাটিক একক নিয়োগ" ফর্ম মধ্যে আইআর রূপান্তর হয়। সমাধানটি আরও ভালভাবে বোঝার জন্য আমি সমস্যাটি আরও ভালভাবে বোঝার পরামর্শ দেব। সুতরাং আমি আপনাকে আপ করব " কেন phiনোড "।
ব্রজ পান্ড্য

উত্তর:


77

একটি ফাই নোড হ'ল একটি নির্দেশ যা বর্তমান ব্লকের পূর্বসূরীর উপর নির্ভর করে একটি মান নির্বাচন করতে ব্যবহৃত হয় ( এখানে দেখুন সম্পূর্ণ শ্রেণিবদ্ধতা দেখতে দেখুন - এটি মান হিসাবেও ব্যবহৃত হয়, এটি যে শ্রেণীর থেকে উত্তরাধিকার সূত্রে প্রাপ্ত সেগুলির মধ্যে একটি)।

এলএলভিএম কোডের এসএসএ (স্ট্যাটিক সিঙ্গল অ্যাসাইনমেন্ট) স্টাইলের কাঠামোর কারণে পিআইএ নোডগুলি প্রয়োজনীয় - উদাহরণস্বরূপ, নিম্নলিখিত সি ++ ফাংশন

void m(bool r, bool y){
    bool l = y || r ;
}

নিম্নলিখিত আইআর তে অনুবাদ হয়: (এর মাধ্যমে তৈরি clang -c -emit-llvm file.c -o out.bc- এবং তারপরে দেখা হবে llvm-dis)

define void @_Z1mbb(i1 zeroext %r, i1 zeroext %y) nounwind {
entry:
  %r.addr = alloca i8, align 1
  %y.addr = alloca i8, align 1
  %l = alloca i8, align 1
  %frombool = zext i1 %r to i8
  store i8 %frombool, i8* %r.addr, align 1
  %frombool1 = zext i1 %y to i8
  store i8 %frombool1, i8* %y.addr, align 1
  %0 = load i8* %y.addr, align 1
  %tobool = trunc i8 %0 to i1
  br i1 %tobool, label %lor.end, label %lor.rhs

lor.rhs:                                          ; preds = %entry
  %1 = load i8* %r.addr, align 1
  %tobool2 = trunc i8 %1 to i1
  br label %lor.end

lor.end:                                          ; preds = %lor.rhs, %entry
  %2 = phi i1 [ true, %entry ], [ %tobool2, %lor.rhs ]
  %frombool3 = zext i1 %2 to i8
  store i8 %frombool3, i8* %l, align 1
  ret void
}

তাহলে এখানে কী ঘটে? সি ++ কোডের বিপরীতে, যেখানে ভেরিয়েবল bool l0 বা 1 হতে পারে, এলএলভিএম আইআর-তে এটি একবার সংজ্ঞায়িত করতে হবে । যদি তাই হয় আমরা চেক %toboolসত্য, এবং তারপর তিড়িং লাফ lor.endবা lor.rhs

ইন lor.endপরিশেষে আমরা এর মূল্য আছে || অপারেটর. আমরা যদি এন্ট্রি ব্লক থেকে এসে পৌঁছেছি - তবে এটি ঠিক সত্য। অন্যথায়, এটির মান সমান %tobool2- এবং নীচের আইআর লাইন থেকে আমরা ঠিক এটি পাই:

%2 = phi i1 [ true, %entry ], [ %tobool2, %lor.rhs ]

6
টিএল; ডিআর ode নোড একটি ত্রৈমাসিক প্রকাশ। কেউ তর্ক করতে পারে যে এতে শর্ত নেই, তবে সত্যই, চূড়ান্ত কোডে রূপান্তর করার পরে, আপনি নির্ধারণ করতে পারবেন না যে কোনটি যুক্তি লাইভ, সুতরাং φ শর্তটিও থাকতে হবে।
হাই-এঞ্জেল

31

আপনার একেবারেই ফাই ব্যবহার করার দরকার নেই। অস্থায়ী ভেরিয়েবলগুলির গুচ্ছ তৈরি করুন। এলএলভিএম অপ্টিমাইজেশন পাসগুলি অস্থায়ী ভেরিয়েবলগুলি অপ্টিমাইজ করার যত্ন নেবে এবং স্বয়ংক্রিয়ভাবে এর জন্য ফাই নোড ব্যবহার করবে।

উদাহরণস্বরূপ, আপনি যদি এটি করতে চান:

x = 4;
if (something) x = x + 2;
print(x);

আপনি তার জন্য ফাই নোড ব্যবহার করতে পারেন (সিউডোকোডে):

  1. 4 থেকে x1 নির্ধারণ করুন
  2. যদি (! কিছু) শাখা 4
  3. x 1 থেকে 2 যোগ করে x2 গণনা করুন
  4. এক্স 1 এবং এক্স 2 থেকে এক্স 3 ফাই নির্ধারণ করুন
  5. এক্স 3 সহ কল ​​প্রিন্ট

তবে আপনি ফাই নোড ছাড়াই করতে পারেন (সিউডোকোডে):

  1. x নামক স্ট্যাকের স্থানীয় ভেরিয়েবল বরাদ্দ করুন
  2. টেম্প x1 মান 4 এ লোড করুন
  3. এক্স 1 থেকে এক্স স্টোর
  4. যদি (! কিছু) শাখা 8
  5. টেম্প এক্স 2 থেকে এক্স লোড করুন
  6. টেম্প x3 এ 4 দিয়ে x2 যুক্ত করুন
  7. এক্স 3 থেকে এক্স স্টোর
  8. টেম্প x4 থেকে এক্স লোড করুন
  9. এক্স 4 সহ কল ​​প্রিন্ট

Llvm সহ অপ্টিমাইজেশন পাস করে এই দ্বিতীয় কোডটি প্রথম কোডটিতে অনুকূলিত হবে।


4
আমি যা পড়েছি তা থেকে মনে হচ্ছে এখানে মনে রাখার জন্য কয়েকটি বিধিনিষেধ রয়েছে। mem2reg হ'ল প্রশ্নযুক্ত অপটিমাইজেশন পাস, এবং এর কয়েকটি সীমাবদ্ধতা রয়েছে যা ক্যালিডোস্কোপের উদাহরণে নির্দেশিত । দেখে মনে হচ্ছে সমস্যাটি হ্যান্ডেল করার জন্য এটি পছন্দসই উপায় এবং ক্ল্যাং দ্বারা ব্যবহৃত হয়।
ম্যাথু স্যান্ডার্স 16
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.