Я використовую власний пропуск 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" повністю видалить таку послідовність, замінюючи всі використання навантаження початковим значенням.