/ / LLVM перетворення константи у значення - opencl, llvm, gpgpu, llvm-ir

LLVM, перетворюючи константу у значення - opencl, llvm, gpgpu, llvm-ir

Я використовую власний пропуск LLVM, де, якщо я зіткнувся з магазином де компілятор перетворює значення на Константу; напр. є явний магазин:

X[gidx] = 10;

Тоді LLVM згенерує цю помилку:

aoc: ../../../Instructions.cpp:1056: void llvm::StoreInst::AssertOK(): Assertion `getOperand(0)->getType() == cast<PointerType>(getOperand(1)->getType())->getElementType() && "Ptr must be a pointer to Val type!"" failed.

Порядок успадкування має вигляд:Значення <-User <-Constant, тому це не повинно бути проблемою, але воно є. Використання приведення до ConstantInt або ConstantFP не впливає на цю помилку. Тож я спробував таке роздуте рішення:

Value *new_value;
if(isa<ConstantInt>(old_value) || isa<ConstantFP>(old_value)){
Instruction *allocInst = builder.CreateAlloca(old_value->getType());
builder.CreateStore(old_value, allocInst);
new_value = builder.CreateLoad(allocResultInst);
}

Однак це рішення створює власні помилки реєстру, коли задіяні різні типи, тому я хотів би цього уникати.

Хтось знає, як перетворити константу у величину? Це повинна бути проста проблема, яку я "не бачу. Я розробляю на ядрах Ubuntu 12.04, LLVM 3, AMD gpu, OpenCL.

Дякуємо заздалегідь.

EDIT:

Оригінальний код, який видає першу помилку в списку:

builder.CreateStore(old_value, store_addr);

EDIT2:

Це old_value оголошено як Значення * old_value = current_instruction-> getOperand (0);

Отже, я захоплюю значення, яке слід зберегти, в даному випадку "10" з першого рядка коду.

Відповіді:

0 для відповіді № 1

Ви не надали код, який спричинив цеперше твердження, але його формулювання досить чітке: ви намагаєтеся створити сховище, де операнд значення та операнд покажчика не узгоджуються щодо своїх типів. Для запитання було б корисно, якщо ви ввели код, який спричинив цю помилку.

Вашим другим, так званим "роздутим" рішенням є правильно спосіб зберігання old_value у стек, а потім завантажте його знову. Ви пишете:

Однак це рішення створює власні помилки реєстру, коли задіяні різні типи

Ці "помилки реєстрації" є реальний питання, яке ви повинні вирішувати.

У будь-якому випадку, вся передумова "перетворення константи у величину" є хибною - як ви правильно помітили, усі константи є значення.Немає сенсу зберігати значення в стеку з єдиною метою завантаження його знову, і справді стандартний прохід LLVM "mem2reg" повністю видалить таку послідовність, замінюючи всі використання навантаження початковим значенням.