如何获得指向 BitCast 指令的指针(?)?

How to obtain a pointer(?) to a BitCast instruction?

假设我有一个简单的 IR,如下所示:

%1 = alloca i8*, align 8
%2 = bitcast i8* %1 to i8*
%3 = load i8*, i8** %1, align 8

所以我试图用指令 %2 = bitcast i8* %1 to i8* 替换 %3 = load i8*, %1, align 8%1 的使用。我了解如何使用 replaceUsesWithIf API 进行替换,但问题是在使用 API 之后,我得到以下

%3 = load i8*, i8* %2, align 8

这是不正确的,因为我 load 来自的 type 应该是 i8** 而不是 i8*

因此,我认为我需要获得一个指向BitCast指令的指针。我相信一种方法是创建一个新的 BitCast 指令 %2 = bitcast i8* %1 to i8* 指令 i8** type?

这是我的尝试:

for (auto &Inst : BB) {
        if (auto bitcast_I = dyn_cast<BitCastInst>(&Inst)) {
           /* %2 = bitcast i8* %1 to i8* will be matched */
            
           Value *bitcast_v = bitcastI->getOperand(0);
           BitCastInst *newBitcast = new BitCastInst(bitcast_v, 
                       PointerType::get(IntegerType::get(context, 8), 0), "newBit", bitcast_I);
        }

不幸的是,我上面的尝试并没有产生正确的代码,但同时,我也不太确定这是否正确,所以我想问一下这种方法是否有意义。

提前谢谢你,

您的值有不同的类型,%1 是 i8**,%2 是 i8*,因此您不能将一个替换为另一个。如果你想让你的负载使用 %2 中的位广播,那么你将需要删除负载并构建一个新的 LoadInst。