我正在使用自定義LLVM傳遞,其中如果遇到 的商店,其中編譯器將該值轉換爲常量;例如有一個明確的店: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.
繼承順序都按:值< - 用戶<的常數,所以這不應該是一個問題,但它是。在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內核。
提前致謝。
編輯:
產生列出的第一個錯誤的原代碼只是:
builder.CreateStore(old_value, store_addr);
EDIT2:
這OLD_VALUE被聲明爲 值* OLD_VALUE = current_instruction-> getOperand( 0);
所以我抓住要存儲的值,在這種情況下,從第一個代碼行中選擇「10」。
「產生列出的第一個錯誤的原始代碼很簡單」 - 您能否提供更大的片段,包括如何創建'old_value'和'new_value'? – Oak