我有在C代碼以下循環:確定數組索引
int f[10],b[10],k=0;
for(int i = 0; i < 10; i++)
{
k = b[i+3]*f[i+2]; //please ignore the out of bound problem
}
我想確定數組b具有3步幅和f已在上面的代碼遞增的2因素。
生成LLVM組件(對於含循環塊):
;<label>:12
%13 = load i32* %i, align 4
%14 = icmp slt i32 %13, 10
br i1 %14, label %15, label %30
;<label>:15 ;preds=%12
%16 = load i32* %i, align 4
%17 = add nsw i32 %16,**3** // this is the increment value
%18 = sext i32 %17 to i64
**%19 = getelementptr inbounds [10 x i32]* %b, i32 0, i64 % 18**
%20 = load i32* % 19, align 4
%21 = load i32* %i, align 4
%22 = add nsw i32 %21,**2** // this is the increment value
%23 = sext i32 %22 to i64
**%24 = getelementptr invounds[10xi32]* %f, i32 0, i64 %23**
%25 = load i32* %24, align 4
%26 = mul nsw i32 %20, %25
store i32 %26, i32* %k, align 4
br label %27
;<label>:27
%28 = load i32* %l, align 4
%29 = add nsw i32 %28,1
store i32 %29, i32* %i, align 4
br label %12
現在在我的LoopPass,我使用下面的代碼:
Value *f = gep->getOperand(3);
if(dyn_cast<llvm::ConstantInt>(f))
{
errs()<<(dyn_cast<llvm::ConstantInt>(f))->getValue();
// the output should be 3 and 2 respectively
}
但我沒有得到任何東西作爲輸出。我在這裏做錯了什麼?
如果使用術語步幅,我本來期望'I + 3'是'i * 3'(同樣,'i + 2' - >'i * 2') – CAFxX
另外,生成的IR看起來沒有任何循環。 – CAFxX
@CAFxX現在我已經包含了整個裝配循環。此外,我已經改變步伐增加因素。 – krammer