This repo implements an LLVM-based tool for automatic generation of Instruction Selection Patterns for GlobalISel. Patterns are generated from CoreDSL2 descriptions of instruction behavior.
Everything is tied into the LLVM build system. Generally:
- Clone the repo and
cd
into it. mkdir llvm/build && cd llvm/build
cmake ..
cmake --build .
Pattern Generation is implemented as an additional LLVM tool (pattern-gen
) within the LLVM tree. Run ./llvm/build/bin/pattern-gen core_descs/Example.core_desc
to generate a pattern for an example instruction.
CV_SUBINCACC {
encoding: 7'b0101000 :: 5'b00000 :: rs1[4:0] :: 3'b011 :: rd[4:0] :: 7'b0101011;
assembly: "{name(rd)}, {name(rs1)}";
behavior: {
if (rd != 0) {
X[rd] += X[rs1] - X[rs2] + 1;
}
}
}
define void @implCV_SUBINCACC(ptr noalias nocapture %rd, ptr nocapture readonly %rs1, ptr nocapture readonly %rs2, i32 %imm, i32 %imm2) local_unnamed_addr #0 {
%rs1.v = load i32, ptr %rs1, align 4
%rs2.v = load i32, ptr %rs2, align 4
%rd.v = load i32, ptr %rd, align 4
%1 = add i32 %rs1.v, 1
%2 = sub i32 %1, %rs2.v
%3 = add i32 %2, %rd.v
store i32 %3, ptr %rd, align 4
ret void
}
bb.1 (%ir-block.0):
liveins: $x10, $x11, $x12, $x13, $x14
%0:gprb(p0) = COPY $x10
%1:gprb(p0) = COPY $x11
%2:gprb(p0) = COPY $x12
%3:gprb(s32) = COPY $x13
%4:gprb(s32) = COPY $x14
%8:gprb(s32) = G_CONSTANT i32 1
%5:gprb(s32) = G_LOAD %1:gprb(p0) :: (load (s32) from %ir.rs1)
%6:gprb(s32) = G_LOAD %2:gprb(p0) :: (load (s32) from %ir.rs2)
%7:gprb(s32) = G_LOAD %0:gprb(p0) :: (load (s32) from %ir.rd)
%9:gprb(s32) = G_ADD %5:gprb, %8:gprb
%10:gprb(s32) = G_SUB %9:gprb, %6:gprb
%11:gprb(s32) = G_ADD %10:gprb, %7:gprb
G_STORE %11:gprb(s32), %0:gprb(p0) :: (store (s32) into %ir.rd)
PseudoRET
def : Pat<
(add (sub (add GPR:$rs1, (i32 1)), GPR:$rs2), GPR:$rd),
(CV_SUBINCACC_S_S_S_S GPR:$rd, GPR:$rs1, GPR:$rs2)>;