Alberto Barbaro via llvm-dev
2019-Jul-27 09:09 UTC
[llvm-dev] Efficient way to identify an instruction
Hi all, I would like to understand if there is an efficient way to identify the instruction that "created" a specific variable. For example, define i32 @main() #0 { %1 = alloca i32, align 4 %2 = alloca %struct._IO_FILE*, align 8 %3 = alloca [40 x i8], align 16 store i32 0, i32* %1, align 4 %4 = call %struct._IO_FILE* @fopen(i8* getelementptr inbounds ([51 x i8], [51 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i32 0, i32 0)) store %struct._IO_FILE* %4, %struct._IO_FILE** %2, align 8 %5 = getelementptr inbounds [40 x i8], [40 x i8]* %3, i32 0, i32 0 %6 = load %struct._IO_FILE*, %struct._IO_FILE** %2, align 8 %7 = call i64 @fread(i8* %5, i64 2, i64 1, %struct._IO_FILE* %6) %8 = load %struct._IO_FILE*, %struct._IO_FILE** %2, align 8 %9 = call i32 @fclose(%struct._IO_FILE* %8) %10 = getelementptr inbounds [40 x i8], [40 x i8]* %3, i64 0, i64 0 %11 = load i8, i8* %10, align 16 *%12 = sext i8 %11 to i32* %13 = icmp eq i32 %12, 66 br i1 %13, label %14, label %25 } Having the reference I to the instruction in bold.Can i efficiently know that the variable %11 was "created" by the %3 = alloca [40 x i8], align 16. I understand that the word "created" is not the most appropriate... Any suggestion? Thanks -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190727/e9e17265/attachment.html>
Tim Northover via llvm-dev
2019-Jul-27 10:53 UTC
[llvm-dev] Efficient way to identify an instruction
Hi Alberto, On Sat, 27 Jul 2019 at 10:09, Alberto Barbaro via llvm-dev <llvm-dev at lists.llvm.org> wrote:> Having the reference I to the instruction in bold.Can i efficiently know that the variable %11 was "created" by the %3 = alloca [40 x i8], align 16.Yes, I.getOperand(0) *is* the AllocaInst in this case. So for example isa<AllocaInst>(I.getOperand(0)) will return true. And if you care about more details you can dyn_cast<AllocaInst> it and check any other properties you want. Cheers. Tim.
Alberto Barbaro via llvm-dev
2019-Jul-28 06:21 UTC
[llvm-dev] Efficient way to identify an instruction
Hi Tim, as always thanks for your help. Unfortunately I made a mistake in my email but apart from that I still have problems. Il giorno sab 27 lug 2019 alle ore 11:53 Tim Northover < t.p.northover at gmail.com> ha scritto:> Hi Alberto, > > On Sat, 27 Jul 2019 at 10:09, Alberto Barbaro via llvm-dev > <llvm-dev at lists.llvm.org> wrote: > > Having the reference I to the instruction in bold.Can i efficiently know > that the variable %11 was "created" by the %3 = alloca [40 x i8], align 16. > > Yes, I.getOperand(0) *is* the AllocaInst in this case. So for example > isa<AllocaInst>(I.getOperand(0)) will return true. And if you care > about more details you can dyn_cast<AllocaInst> it and check any other > properties you want. > >I would like to use the approach you described considering I to be a reference to the icmp instruction ( %13 = icmp eq i32 %12, 66 ). From what I understood i should do something like: Instruction* source; if(source = dyn_cast<AllocaInst>(I.getOperand(0))) { cout << "Alloca Inst" << endl; I.dump(); getchar(); } I thought I.getOperand(0) was a reference to the instruction that have created %12. What am I missing?> Cheers. > > Tim. >Thanks again Alberto -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190728/d762cc5c/attachment.html>