Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70...
Transcript of Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70...
![Page 2: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/2.jpg)
What you will need for Assignment 1 …
• LLVM: How to write a pass that
analyzes and transforms(optimizes) Intermediate
Representation (IR).
• C++ Fundamentals: Public Inheritance (Abstract Class, Dynamic Casting), Iterator, STL Data Structures
2
Prerequisite
![Page 3: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/3.jpg)
Three-Phase Design – From Source to Binary
3
Front End Passes Back End
LLVM IR LLVM IR
Object Code
Source Code
![Page 4: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/4.jpg)
Three-Phase Design – From Source to Binary
C/C++ Sourceint main()
{
return 0;
}
LLVM IR
define i32 @main() … {
ret i32 0
}
4
clang
![Page 5: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/5.jpg)
Example – IR Optimization
• Suppose that we are hoping to replace every 𝑥 × 2𝑁 statement in our code with 𝑥 ≪ 𝑁. How can we achieve this?
• Write a Pass that does the followings:
1. Analyzes whether there are statements of the form %𝒑 = 𝐦𝐮𝐥%𝒒, 𝟐𝑵
in our code or not, and where are those statements located.
2. Transforms those instructions with %𝒑 = 𝐬𝐡𝐥%𝒒,𝑵.
5
![Page 6: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/6.jpg)
IR Optimization
• The IR optimizations consist of many optimization passes.
• LLVM itself also has passes for analysis or transformations: https://llvm.org/docs/Passes.html
• In this assignment, we will be making use of the mem2reg pass.
• Please DON’T use the LLVM passes unless otherwise told to.
6
![Page 7: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/7.jpg)
Questions?
• Keywords:
• Intermediate Representation (IR)
• Optimization Pass
• Analysis & Transformation
7
![Page 8: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/8.jpg)
Analysis
8
![Page 9: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/9.jpg)
How to write an analysis pass?
• We need to understand the following three things:
•Program Structure: How is our program represented in LLVM?
• Iterators: How to traverse through such structures?
•Downcasting: How to retrieve more information from iterators?
•LLVM Pass Interface: Implement LLVM interface.
9
![Page 10: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/10.jpg)
Program Structure
• It is important that we understand how our programs are represented after being translated by the LLVM frontend clang:
10
![Page 11: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/11.jpg)
Program Structure
C/C++ Source• Source File
• Function
• Code Block
• Statement
LLVM IR• Module contains Functions and
Global Variables.
• Function contains Basic Blocks and Arguments.
• Basic Block contains a list of Instructions.
• Instruction is an Opcode plus vector of Operands.
11
![Page 12: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/12.jpg)
Program Structure
• A Simplified View (for Understanding ONLY):
typedef std::vector < Function > Module;
typedef std::vector < BasicBlock > Function;
typedef std::vector < Instruction > BasicBlock;
typedef std::vector < Operand > Instruction;
12
![Page 13: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/13.jpg)
How to iterate through the Structures?
• Iterators!
• Recall how you traverse through std::vectorstd::vector < unsigned > vec;
for (auto iter = vec.begin();
iter != vec.end(); ++iter)
{/* do something */}
13
![Page 14: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/14.jpg)
How to iterate through the Structures?
• Similarly, …Module M;
for (auto iter = M.begin();
iter != M.end(); ++iter)
{/* do something */}
14
![Page 15: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/15.jpg)
Downcasting – Getting More Details
• Suppose that we have an instruction, how can we know whether it is an unary instruction? a binary instruction? a call instruction? …
•Dynamic Casting!• Consider the statement UnaryInstruction * unary_inst =
dyn_cast < UnaryInstruction > (inst);
15
![Page 16: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/16.jpg)
LLVM Pass Interface
LLVM Interfaceclass ModulePass
{
bool runOnModule
(Module & M) = 0;
};
Implementationclass MyModulePass : public
ModulePass
{
bool runOnModule
(Module & M)
{
for (iter = …
}
};
16
![Page 17: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/17.jpg)
Questions?
• Keywords:
• Program Structure
• Iterators
• Downcasting
• LLVM Pass Interface
17
![Page 18: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/18.jpg)
Transformations
18
![Page 19: Introduction to LLVMpekhimenko/courses/cscd70-w18... · Introduction to LLVM Bojian Zheng CSCD70 Spring 2018 bojian@cs.toronto.edu 1File Size: 962KBPage Count: 19](https://reader036.fdocuments.in/reader036/viewer/2022062602/5eb8a6020cd0cd1f8510e0b0/html5/thumbnails/19.jpg)
Insert/Remove/Move/Replace Instructions
• Three Options
•Instruction class methods:
• insertBefore(), insertAfter(), moveBefore(), moveAfter(), eraseFromParent(), removeFromParent(), …
• Ask parent (BasicBlock) to do this:
• inst.getParent()->getInstList() .insert/erase/remove/…()
• Make use of BasicBlockUtils (defined in header
llvm/Transforms/Utils/BasicBlockUtils.h):
• ReplaceInstWithValue(), ReplaceInstwithInst()
19