如何获得指向 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。
假设我有一个简单的 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。