gpt4 book ai didi

c - 这个 LLVM IR 代码有什么问题

转载 作者:行者123 更新时间:2023-12-04 03:07:02 26 4
gpt4 key购买 nike

我有一个看起来像这样的 LLVM IR 代码。

  %8 = load i64* @tid, align 8
%arrayidx1 = getelementptr inbounds [16 x i32]* @h,
i32 0, i64 %8 ;<-- %8 works fine here
..............
%OldFuncCounter7 = load i64* getelementptr inbounds ([16 x i64]*
@EdgeProfCounters, i64 0, i64 %8) ;<-- error here, %8 not allowed
..............

在分配 arrayidx1 的行中,一切正常,但对于 OldFuncCounter7,LLVM 编译器提示说“函数本地名称的使用无效”。这是由于我使用的 %8。如果我用常数替换它,它工作正常。所以我的问题是,为什么 %8 可以与 arrayidx1 一起正常工作,但不能与 OldFuncCounter7 一起使用。这里发生了什么?

发生此错误的整个基本块如下所示
  %8 = load i64* @tid, align 8
%arrayidx1 = getelementptr inbounds [16 x i32]* @h, i32 0, i64 %8
store volatile i32 3, i32* %arrayidx1, align 4
%9 = load volatile i32* getelementptr inbounds ([16 x i32]* @h, i32 0, i64 0), align 4
%call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([10 x i8]* @.str, i32 0, i32 0), i32 %9)
%10 = load i64* @tid, align 8
store volatile i64 %10, i64* %clock, align 8
%call3 = call i32 @getpid() nounwind
%call4 = call i64 @pthread_self() nounwind readnone
%11 = load volatile i64* %clock, align 8
%call5 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([21 x i8]* @.str1, i32 0, i32 0), i32 %call3, i64 %call4, i64 %11)
store i64 0, i64* %oi, align 8
; Error here due to %8
%OldFuncCounter7 = load i64* getelementptr inbounds ([16 x i64]* @EdgeProfCounters, i64 0, i64 %8)
;
%NewFuncCounter8 = add i64 %OldFuncCounter7, 13
store volatile i64 %NewFuncCounter8, i64* getelementptr inbounds ([16 x i64]* @EdgeProfCounters, i64 0, i64 0)
br label %for.cond6

最佳答案

您正在使用 %8来自 constant expression ,但不是常数。您需要修复代码以执行 getelementptr常量表达式之外的指令:

%temp = getelementptr inbounds [16 x i64]* @EdgeProfCounters, i64 0, i64 %8
%OldFuncCounter7 = load i64* %temp

关于c - 这个 LLVM IR 代码有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9413376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com