Combining LLVM IR
In this recipe, you will learn about instruction combining in LLVM. By instruction combining, we mean replacing a sequence of instructions with more efficient instructions that produce the same result in fewer machine cycles. In this recipe, we will see how we can make modifications in the LLVM code to combine certain instructions.
Getting started
To test our implementation, we will write test code that we will use to verify that our implementation is working properly to combine instructions:
define i32 @test19(i32 %x, i32 %y, i32 %z) { %xor1 = xor i32 %y, %z %or = or i32 %x, %xor1 %xor2 = xor i32 %x, %z %xor3 = xor i32 %xor2, %y %res = xor i32 %or, %xor3 ret i32 %res }
How to do it…
Open the
lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
file.In the
InstCombiner::visitXor(BinaryOperator
&I)
function, go to theif
condition—if
(Op0I
&&
Op1I)
—and add this:if (match(Op0I, m_Or(m_Xor(m_Value(B), m_Value(C)), m_Value(A))) && match(Op1I, m_Xor...