LLVM: التعليمات لا تهيمن على جميع الاستخدامات

StackOverflow https://stackoverflow.com/questions/19832757

  •  24-07-2022
  •  | 
  •  

سؤال

أقوم بتقسيم جميع الكتل الأساسية مع الحد الأدنى لعدد التعليمات (عادة 3-5):

llvm::SplitBlock(BasicBlock, &*BasicBlockiter, Pass);

ومحاولة الحصول على ملف كائن من الأشعة تحت الحمراء

llc -filetype=obj 2.ll

حصلت على الأخطاء التالية:

Instruction does not dominate all uses!
  %1 = alloca i32
  %mul = load i32* %1
Instruction does not dominate all uses!
  %1 = alloca i32
  %99 = load i32* %1

و

While deleting: i32 %
Use still stuck around after Def is destroyed:  %var = alloca i32
Assertion failed: use_empty() && "Uses remain when a value is destroyed!"

و

error: expected instruction opcode
invoke.cont2:                                     ; preds = %main_block, %invoke
.cont

الأشعة تحت الحمراء:

  invoke.cont2:                                     ; preds = %main_block, %invoke.cont
  %call4 = invoke i32 @_ZStorSt13_Ios_OpenmodeS_(i32 8, i32 16)
          to label %invoke.cont3 unwind label %lpad1
  store i32 %call4, i32* %var4

أعتقد أنه بعد الانقسام ، توجد التعليمات في كتل أساسية مختلفة. إذا قمت بتقسيم الكتلة إلى تعليمات 10-15 ، كل شيء على ما يرام. كيف يمكنني التنبؤ/التحقق وتجنب هذه الأخطاء؟

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

المحلول

في الإصدار الأول ، كان لديك تعليمات بعد تعليمات Terminator ، والتي كانت غير صحيحة نظرًا لأن هذه التعليمات لم يتم تنفيذها مطلقًا.

في الإصدار الثاني (لم يرد ذكره هنا ، يرجى استخدام StackOverflow بدلاً من رسائل البريد الإلكتروني الخاصة ...) يستخدمون نسبة ٪ (في Inst store) قبل تحديده (٪ call = ...) ، لذلك من الواضح أن تعريفك لا يسبق كل شيء استخدم ... ولكن كما قلت ، يجب ألا يكون المتجر بعد الاستدعاء ، لأن الاستدعاء هو المنهي.

الحل هو وضع متجرك في الكتلة الأساسية التالية (يمكنك إنشاء واحدة جديدة):

%invoke.cont
  %call = invoke i8* @_ZNKSs5c_strEv(%"class.std::basic_string"* @loadedFile)
          to label %invoke.cont2_before unwind label %lpad1

invoke.cont2_before:                                     ; preds = %invoke.cont
  store i8* %call, i8** %reduced_var
  br label %invoke.cont2

invoke.cont2:                                     ; preds = %main_block, %invoke.cont2_before
  %call4 = invoke i32 @_ZStorSt13_Ios_OpenmodeS_(i32 8, i32 16)
          to label %invoke.cont3_before unwind label %lpad1

إلخ...

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