Top Banner
LLVM DevMeeting November 2016 San Jose, CA Ahmed Bougacha Quentin Colombet Tim Northover Global Instruction Selection Status
211

GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Aug 17, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LLVM DevMeeting November 2016

San Jose, CA

Ahmed Bougacha Quentin Colombet Tim Northover

Global Instruction Selection Status

Page 2: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Initial Proposal: http://lists.llvm.org/pipermail/llvm-dev/2015-November/092566.html

Global ISel Recap

2015 RECAP

Page 3: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

SelectionDAGISelLLVM IR MachineInstr

Overview SelectionDAG

2015 RECAP

Page 4: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LLVM IR MachineInstr

Overview SelectionDAG

2015 RECAP

Page 5: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

SDNodeLLVM IR MachineInstrFastISel

SelectionDAGBuilder DAGCombiner

Legalize*

DAGCombiner

Select

Schedule

Overview SelectionDAG

2015 RECAP

Page 6: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Overview Global ISel

(G)MI Legalizer RegBank Select

Instruction SelectIRTranslatorLLVM IR MI

2015 RECAP

Page 7: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Overview Global ISel

(G)MI Legalizer RegBank Select

Instruction SelectIRTranslatorLLVM IR MI

GenericMachineInstr MachineInstr

2015 RECAP

Page 8: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

(G)MI Legalizer RegBank Select

Instruction SelectIRTranslatorLLVM IR MI

2015 RECAP

Page 9: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

IRTranslator

i1* %addr1, <2 x i32>* %addr2 %tmp0 = load i1, i1* %addr1

ret i64 %tmp5

define i64 @foo() {

%tmp1 = zext i1 %tmp0 to i64 %tmp2 = bitcast i64 %tmp1 to <2 x i32> %tmp3 = load <2 x i32>, <2 x i32>* %addr2 %tmp4 = or <2 x i32> %tmp2, %tmp3 %tmp5 = bitcast <2 x i32> %tmp4 to i64

}

(G)MILLVM IR

2015 RECAP

Page 10: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• LLVM IR to generic (G) MachineInstr

IRTranslator

i1* %addr1, <2 x i32>* %addr2 %tmp0 = load i1, i1* %addr1

ret i64 %tmp5

define i64 @foo() {

%tmp1 = zext i1 %tmp0 to i64 %tmp2 = bitcast i64 %tmp1 to <2 x i32> %tmp3 = load <2 x i32>, <2 x i32>* %addr2 %tmp4 = or <2 x i32> %tmp2, %tmp3 %tmp5 = bitcast <2 x i32> %tmp4 to i64

}

(G)MILLVM IR

2015 RECAP

Page 11: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• LLVM IR to generic (G) MachineInstr

%2( , ) = G_LOAD %0(_,p0)_ s1

IRTranslator

i1* %addr1, <2 x i32>* %addr2 %tmp0 = load i1, i1* %addr1

ret i64 %tmp5

define i64 @foo() {

%tmp1 = zext i1 %tmp0 to i64 %tmp2 = bitcast i64 %tmp1 to <2 x i32> %tmp3 = load <2 x i32>, <2 x i32>* %addr2 %tmp4 = or <2 x i32> %tmp2, %tmp3 %tmp5 = bitcast <2 x i32> %tmp4 to i64

}

(G)MILLVM IR

2015 RECAP

Page 12: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LLVM IR to generic (G) MachineInstr: G_ADD, G_PTRTOINT

• LLVM IR to generic (G) MachineInstr

%2( , ) = G_LOAD %0(_,p0)_ s1

IRTranslator

i1* %addr1, <2 x i32>* %addr2 %tmp0 = load i1, i1* %addr1

ret i64 %tmp5

define i64 @foo() {

%tmp1 = zext i1 %tmp0 to i64 %tmp2 = bitcast i64 %tmp1 to <2 x i32> %tmp3 = load <2 x i32>, <2 x i32>* %addr2 %tmp4 = or <2 x i32> %tmp2, %tmp3 %tmp5 = bitcast <2 x i32> %tmp4 to i64

}

(G)MILLVM IR

2015 RECAP

Page 13: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• LLVM IR to generic (G) MachineInstr• Virtual registers have a type

%2( , ) = G_LOAD %0(_,p0)_ s1

IRTranslator

i1* %addr1, <2 x i32>* %addr2 %tmp0 = load i1, i1* %addr1

ret i64 %tmp5

define i64 @foo() {

%tmp1 = zext i1 %tmp0 to i64 %tmp2 = bitcast i64 %tmp1 to <2 x i32> %tmp3 = load <2 x i32>, <2 x i32>* %addr2 %tmp4 = or <2 x i32> %tmp2, %tmp3 %tmp5 = bitcast <2 x i32> %tmp4 to i64

}

(G)MILLVM IR

2015 RECAP

Page 14: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Virtual registers have a type: LowLevelType (LLT): Replacement of EVT

• LLVM IR to generic (G) MachineInstr• Virtual registers have a type

%2( , ) = G_LOAD %0(_,p0)_ s1

IRTranslator

i1* %addr1, <2 x i32>* %addr2 %tmp0 = load i1, i1* %addr1

ret i64 %tmp5

define i64 @foo() {

%tmp1 = zext i1 %tmp0 to i64 %tmp2 = bitcast i64 %tmp1 to <2 x i32> %tmp3 = load <2 x i32>, <2 x i32>* %addr2 %tmp4 = or <2 x i32> %tmp2, %tmp3 %tmp5 = bitcast <2 x i32> %tmp4 to i64

}

(G)MILLVM IR

Scalar: s#bit s8, s32

Vector: <#lane x s#bit> <2 x s8>, <3 x s48>

Pointer: p#addrspace p0, p256

2015 RECAP

Page 15: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• LLVM IR to generic (G) MachineInstr• Virtual registers have a type• Virtual registers might not have a register class

%2( , ) = G_LOAD %0(_,p0)_ s1

IRTranslator

i1* %addr1, <2 x i32>* %addr2 %tmp0 = load i1, i1* %addr1

ret i64 %tmp5

define i64 @foo() {

%tmp1 = zext i1 %tmp0 to i64 %tmp2 = bitcast i64 %tmp1 to <2 x i32> %tmp3 = load <2 x i32>, <2 x i32>* %addr2 %tmp4 = or <2 x i32> %tmp2, %tmp3 %tmp5 = bitcast <2 x i32> %tmp4 to i64

}

(G)MILLVM IR

2015 RECAP

Page 16: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• LLVM IR to generic (G) MachineInstr• Virtual registers have a type• Virtual registers might not have a register class• ABI lowering

%2( , ) = G_LOAD %0(_,p0)

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

_ s1

IRTranslator

i1* %addr1, <2 x i32>* %addr2 %tmp0 = load i1, i1* %addr1

ret i64 %tmp5

define i64 @foo() {

%tmp1 = zext i1 %tmp0 to i64 %tmp2 = bitcast i64 %tmp1 to <2 x i32> %tmp3 = load <2 x i32>, <2 x i32>* %addr2 %tmp4 = or <2 x i32> %tmp2, %tmp3 %tmp5 = bitcast <2 x i32> %tmp4 to i64

}

(G)MILLVM IR

2015 RECAP

Page 17: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• LLVM IR to generic (G) MachineInstr• Virtual registers have a type• Virtual registers might not have a register class• ABI lowering

%2( , ) = G_LOAD %0(_,p0)

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

_ s1

%x0 = COPY %7(_,s64)RET_ReallyLR implicit %x0

IRTranslator

i1* %addr1, <2 x i32>* %addr2 %tmp0 = load i1, i1* %addr1

ret i64 %tmp5

define i64 @foo() {

%tmp1 = zext i1 %tmp0 to i64 %tmp2 = bitcast i64 %tmp1 to <2 x i32> %tmp3 = load <2 x i32>, <2 x i32>* %addr2 %tmp4 = or <2 x i32> %tmp2, %tmp3 %tmp5 = bitcast <2 x i32> %tmp4 to i64

}

(G)MILLVM IR

2015 RECAP

Page 18: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• LLVM IR to generic (G) MachineInstr• Virtual registers have a type• Virtual registers might not have a register class• ABI lowering

%2( , ) = G_LOAD %0(_,p0)

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

_ s1

%x0 = COPY %7(_,s64)RET_ReallyLR implicit %x0

IRTranslator

i1* %addr1, <2 x i32>* %addr2 %tmp0 = load i1, i1* %addr1

ret i64 %tmp5

define i64 @foo() {

%tmp1 = zext i1 %tmp0 to i64 %tmp2 = bitcast i64 %tmp1 to <2 x i32> %tmp3 = load <2 x i32>, <2 x i32>* %addr2 %tmp4 = or <2 x i32> %tmp2, %tmp3 %tmp5 = bitcast <2 x i32> %tmp4 to i64

}

(G)MILLVM IR

2015 RECAP

Page 19: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• LLVM IR to generic (G) MachineInstr• Virtual registers have a type• Virtual registers might not have a register class• ABI lowering

%2( , ) = G_LOAD %0(_,p0)

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

_ s1

>) = %3(_,s64) = G_ZEXT %2(_,s1)%4(_,<2 x s32 G_BITCAST %3(_,s64)%5(_,<2 x s32>) = G_LOAD %1(_,p0)%6(_,<2 x s32>) = G_OR %4, %5%7(_,s64) = G_BITCAST %6(_,<2 x s32>)%x0 = COPY %7(_,s64)RET_ReallyLR implicit %x0

IRTranslator

i1* %addr1, <2 x i32>* %addr2 %tmp0 = load i1, i1* %addr1

ret i64 %tmp5

define i64 @foo() {

%tmp1 = zext i1 %tmp0 to i64 %tmp2 = bitcast i64 %tmp1 to <2 x i32> %tmp3 = load <2 x i32>, <2 x i32>* %addr2 %tmp4 = or <2 x i32> %tmp2, %tmp3 %tmp5 = bitcast <2 x i32> %tmp4 to i64

}

(G)MILLVM IR

2015 RECAP

Page 20: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

(G)MI Legalizer RegBank Select

Instruction SelectIRTranslatorLLVM IR MI

2015 RECAP

Page 21: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

(G)MI Legalizer RegBank Select

Instruction SelectIRTranslatorLLVM IR MI

2015 RECAP

Page 22: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer%0(_,p0) = COPY %x0 %1(_,p0) = COPY %x1 %2(_,s1) = G_LOAD %0(_,p0) %3(_,s64) = G_ZEXT %2(_,s1) %4(_,<2 x s32>) = G_BITCAST %3(_,s64) %5(_,<2 x s32>) = G_LOAD %1(_,p0) %6(_,<2 x s32>) = G_OR %4, %5 %7(_,s64) = G_BITCAST %6(_,<2 x s32>) %x0 = COPY %7(_,s64) RET_ReallyLR implicit %x0

(G)MI

2015 RECAP

Page 23: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

Illegal (G)MachineInstr to legal (G)MachineInstr

%0(_,p0) = COPY %x0 %1(_,p0) = COPY %x1 %2(_,s1) = G_LOAD %0(_,p0) %3(_,s64) = G_ZEXT %2(_,s1) %4(_,<2 x s32>) = G_BITCAST %3(_,s64) %5(_,<2 x s32>) = G_LOAD %1(_,p0) %6(_,<2 x s32>) = G_OR %4, %5 %7(_,s64) = G_BITCAST %6(_,<2 x s32>) %x0 = COPY %7(_,s64) RET_ReallyLR implicit %x0

(G)MI

2015 RECAP

Page 24: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

Illegal (G)MachineInstr to legal (G)MachineInstr

%0(_,p0) = COPY %x0 %1(_,p0) = COPY %x1 %2(_,s1) = G_LOAD %0(_,p0) %3(_,s64) = G_ZEXT %2(_,s1) %4(_,<2 x s32>) = G_BITCAST %3(_,s64) %5(_,<2 x s32>) = G_LOAD %1(_,p0) %6(_,<2 x s32>) = G_OR %4, %5 %7(_,s64) = G_BITCAST %6(_,<2 x s32>) %x0 = COPY %7(_,s64) RET_ReallyLR implicit %x0

(G)MI

2015 RECAP

Page 25: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

Illegal (G)MachineInstr to legal (G)MachineInstr

%0(_,p0) = COPY %x0 %1(_,p0) = COPY %x1 %8(_,s8) = G_LOAD %0(_,p0) %2(_,s1) = G_TRUNC %8(_,s8) %3(_,s64) = G_ZEXT %2(_,s1) %4(_,<2 x s32>) = G_BITCAST %3(_,s64) %5(_,<2 x s32>) = G_LOAD %1(_,p0) %6(_,<2 x s32>) = G_OR %4, %5 %7(_,s64) = G_BITCAST %6(_,<2 x s32>) %x0 = COPY %7(_,s64) RET_ReallyLR implicit %x0

(G)MI

2015 RECAP

Page 26: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

Illegal (G)MachineInstr to legal (G)MachineInstr

%0(_,p0) = COPY %x0 %1(_,p0) = COPY %x1 %8(_,s8) = G_LOAD %0(_,p0) %2(_,s1) = G_TRUNC %8(_,s8) %3(_,s64) = G_ZEXT %2(_,s1) %4(_,<2 x s32>) = G_BITCAST %3(_,s64) %5(_,<2 x s32>) = G_LOAD %1(_,p0) %6(_,<2 x s32>) = G_OR %4, %5 %7(_,s64) = G_BITCAST %6(_,<2 x s32>) %x0 = COPY %7(_,s64) RET_ReallyLR implicit %x0

(G)MI

2015 RECAP

Page 27: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer(G)MILegalizer2

RegBank Select

Instruction SelectIRTranslatorLLVM IR MI

2015 RECAP

Page 28: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegBank SelectLegalizer(G)MILegalizer2

Instruction SelectIRTranslatorLLVM IR MIRegBank

Select

2015 RECAP

Page 29: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

%0(_,p0) = COPY %x0 %1(_,p0) = COPY %x1 %8(_,s8) = G_LOAD %0(_,p0) %2(_,s1) = G_TRUNC %8(_,s8) %3(_,s64) = G_ZEXT %2(_,s1) %4(_,<2 x s32>) = G_BITCAST %3(_,s64) %5(_,<2 x s32>) = G_LOAD %1(_,p0) %6(_,<2 x s32>) = G_OR %4, %5 %7(_,s64) = G_BITCAST %6(_,<2 x s32>) %x0 = COPY %7(_,s64) RET_ReallyLR implicit %x0

(G)MI

RegBankSelect 2015 RECAP

Page 30: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Assigns register banks

%0(_,p0) = COPY %x0 %1(_,p0) = COPY %x1 %8(_,s8) = G_LOAD %0(_,p0) %2(_,s1) = G_TRUNC %8(_,s8) %3(_,s64) = G_ZEXT %2(_,s1) %4(_,<2 x s32>) = G_BITCAST %3(_,s64) %5(_,<2 x s32>) = G_LOAD %1(_,p0) %6(_,<2 x s32>) = G_OR %4, %5 %7(_,s64) = G_BITCAST %6(_,<2 x s32>) %x0 = COPY %7(_,s64) RET_ReallyLR implicit %x0

(G)MI

RegBankSelect 2015 RECAP

Page 31: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Assigns register banks

%0(_,p0) = COPY %x0 %1(_,p0) = COPY %x1 %8(_,s8) = G_LOAD %0(_,p0) %2(_,s1) = G_TRUNC %8(_,s8) %3(_,s64) = G_ZEXT %2(_,s1) %4(_,<2 x s32>) = G_BITCAST %3(_,s64) %5(_,<2 x s32>) = G_LOAD %1(_,p0) %6(_,<2 x s32>) = G_OR %4, %5 %7(_,s64) = G_BITCAST %6(_,<2 x s32>) %x0 = COPY %7(_,s64) RET_ReallyLR implicit %x0

RegBankSelect 2015 RECAP

Page 32: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Assigns register banks

%0(_,p0) = COPY %x0 %1(_,p0) = COPY %x1 %8(_,s8) = G_LOAD %0(_,p0) %2(_,s1) = G_TRUNC %8(_,s8) %3(_,s64) = G_ZEXT %2(_,s1) %4(_,<2 x s32>) = G_BITCAST %3(_,s64) %5(_,<2 x s32>) = G_LOAD %1(_,p0) %6(_,<2 x s32>) = G_OR %4, %5 %7(_,s64) = G_BITCAST %6(_,<2 x s32>) %x0 = COPY %7(_,s64) RET_ReallyLR implicit %x0

RegBankSelect 2015 RECAP

Page 33: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Assigns register banks

%0(_,p0) = COPY %x0 %1(_,p0) = COPY %x1 %8(_,s8) = G_LOAD %0(_,p0) %2(_,s1) = G_TRUNC %8(_,s8) %3(_,s64) = G_ZEXT %2(_,s1) %4(_,<2 x s32>) = G_BITCAST %3(_,s64) %5(FPR,<2 x s32>) = G_LOAD %1(_,p0) %6(_,<2 x s32>) = G_OR %4, %5 %7(_,s64) = G_BITCAST %6(_,<2 x s32>) %x0 = COPY %7(_,s64) RET_ReallyLR implicit %x0

RegBankSelect 2015 RECAP

Page 34: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Assigns register banks

%0(GPR,p0) = COPY %x0 %1(GPR,p0) = COPY %x1 %8(GPR,s8) = G_LOAD %0(GPR,p0) %2(GPR,s1) = G_TRUNC %8(GPR,s8) %3(GPR,s64) = G_ZEXT %2(GPR,s1) %4(FPR,<2 x s32>) = G_BITCAST %3(GPR,s64) %5(FPR,<2 x s32>) = G_LOAD %1(GPR,p0) %6(FPR,<2 x s32>) = G_OR %4, %5 %7(GPR,s64) = G_BITCAST %6(FPR,<2 x s32>) %x0 = COPY %7(GPR,s64) RET_ReallyLR implicit %x0

RegBankSelect 2015 RECAP

Page 35: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Assigns register banks

%0(GPR,p0) = COPY %x0 %1(GPR,p0) = COPY %x1 %8(GPR,s8) = G_LOAD %0(GPR,p0) %2(GPR,s1) = G_TRUNC %8(GPR,s8) %3(GPR,s64) = G_ZEXT %2(GPR,s1) %4(FPR,<2 x s32>) = G_BITCAST %3(GPR,s64) %5(FPR,<2 x s32>) = G_LOAD %1(GPR,p0) %6(FPR,<2 x s32>) = G_OR %4, %5 %7(GPR,s64) = G_BITCAST %6(FPR,<2 x s32>) %x0 = COPY %7(GPR,s64) RET_ReallyLR implicit %x0

RegBankSelect 2015 RECAP

Page 36: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Assigns register banks

%0(GPR,p0) = COPY %x0 %1(GPR,p0) = COPY %x1 %8(GPR,s8) = G_LOAD %0(GPR,p0) %2(GPR,s1) = G_TRUNC %8(GPR,s8) %3(GPR,s64) = G_ZEXT %2(GPR,s1) %4(GPR,<2 x s32>) = G_BITCAST %3(GPR,s64) %5(GPR,<2 x s32>) = G_LOAD %1(GPR,p0) %6(GPR,<2 x s32>) = G_OR %4, %5 %7(GPR,s64) = G_BITCAST %6(GPR,<2 x s32>) %x0 = COPY %7(GPR,s64) RET_ReallyLR implicit %x0

RegBankSelect 2015 RECAP

Page 37: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Assigns register banks

%0(GPR,p0) = COPY %x0 %1(GPR,p0) = COPY %x1 %8(GPR,s8) = G_LOAD %0(GPR,p0) %2(GPR,s1) = G_TRUNC %8(GPR,s8) %3(GPR,s64) = G_ZEXT %2(GPR,s1) %4(GPR,<2 x s32>) = G_BITCAST %3(GPR,s64) %5(GPR,<2 x s32>) = G_LOAD %1(GPR,p0) %6(GPR,<2 x s32>) = G_OR %4, %5 %7(GPR,s64) = G_BITCAST %6(GPR,<2 x s32>) %x0 = COPY %7(GPR,s64) RET_ReallyLR implicit %x0

RegBankSelect

(G)MI

2015 RECAP

Page 38: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegBank Select (G)MILegalizer2

Instruction SelectIRTranslatorLLVM IR MIRegBank

Select

2015 RECAP

Page 39: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegBank Select (G)MILegalizer2

Instruction SelectIRTranslatorLLVM IR MIRegBank2

Select2

InstructionSelect

2015 RECAP

Page 40: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Generic MachineInstr to MachineInstr

%0(GPR,p0) = COPY %x0 %1(GPR,p0) = COPY %x1 %8(GPR,s8) = G_LOAD %0(GPR,p0) %2(GPR,s1) = G_TRUNC %8(GPR,s8) %3(GPR,s64) = G_ZEXT %2(GPR,s1) %4(FPR,<2 x s32>) = G_BITCAST %3(GPR,s64) %5(FPR,<2 x s32>) = G_LOAD %1(GPR,p0) %6(FPR,<2 x s32>) = G_OR %4, %5 %7(GPR,s64) = G_BITCAST %6(FPR,<2 x s32>) %x0 = COPY %7(GPR,s64) RET_ReallyLR implicit %x0

InstructionSelect

(G)MI

2015 RECAP

Page 41: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Instruction2

Select2

MI

Generic MachineInstr to MachineInstr

%0(GPR,p0) = COPY %x0 %1(GPR,p0) = COPY %x1 %8(GPR,s8) = G_LOAD %0(GPR,p0) %2(GPR,s1) = G_TRUNC %8(GPR,s8) %3(GPR,s64) = G_ZEXT %2(GPR,s1) %4(FPR,<2 x s32>) = G_BITCAST %3(GPR,s64) %5(FPR,<2 x s32>) = G_LOAD %1(GPR,p0) %6(FPR,<2 x s32>) = G_OR %4, %5 %7(GPR,s64) = G_BITCAST %6(FPR,<2 x s32>) %x0 = COPY %7(GPR,s64) RET_ReallyLR implicit %x0

InstructionSelect 2015 RECAP

Page 42: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Instruction2

Select2

MI

Generic MachineInstr to MachineInstr

%0(GPR,p0) = COPY %x0 %1(GPR,p0) = COPY %x1 %8 = LDRBBui %0, 0 %2(GPR,s1) = G_TRUNC %8(GPR,s8) %3(GPR,s64) = G_ZEXT %2(GPR,s1) %4(FPR,<2 x s32>) = G_BITCAST %3(GPR,s64) %5(FPR,<2 x s32>) = G_LOAD %1(GPR,p0) %6(FPR,<2 x s32>) = G_OR %4, %5 %7(GPR,s64) = G_BITCAST %6(FPR,<2 x s32>) %x0 = COPY %7(GPR,s64) RET_ReallyLR implicit %x0

InstructionSelect 2015 RECAP

Page 43: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Instruction2

Select2

MI

Generic MachineInstr to MachineInstr

%0 = COPY %x0 %1 = COPY %x1 %8 = LDRBBui %0, 0 %2 = COPY %8 %9 = SUBREG_TO_REG 0, %2, 15 %3 = UBFMXri %9, 0, 0 %4 = COPY %3 %5 = LDRDui %1, 0 %6 = ORRv8i8 %4, %5 %7 = COPY %6 %x0 = COPY %7 RET_ReallyLR implicit %x0

InstructionSelect 2015 RECAP

Page 44: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Instruction2

Select2

MI

Generic MachineInstr to MachineInstr

%0 = COPY %x0 %1 = COPY %x1 %8 = LDRBBui %0, 0 %2 = COPY %8 %9 = SUBREG_TO_REG 0, %2, 15 %3 = UBFMXri %9, 0, 0 %4 = COPY %3 %5 = LDRDui %1, 0 %6 = ORRv8i8 %4, %5 %7 = COPY %6 %x0 = COPY %7 RET_ReallyLR implicit %x0

InstructionSelect 2015 RECAP

Page 45: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Instruction2

Select2

MI

Generic MachineInstr to MachineInstr

%0 = COPY %x0 %1 = COPY %x1 %8 = LDRBBui %0, 0 %2 = COPY %8 %9 = SUBREG_TO_REG 0, %2, 15 %3 = UBFMXri %9, 0, 0 %4(FPR,<2 x s32>) = G_BITCAST %3(GPR,s64) %5(FPR,<2 x s32>) = G_LOAD %1(GPR,p0) %6(FPR,<2 x s32>) = G_OR %4, %5 %7(GPR,s64) = G_BITCAST %6(FPR,<2 x s32>) %x0 = COPY %7 RET_ReallyLR implicit %x0

InstructionSelect 2015 RECAP

Page 46: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Instruction2

Select2

MI

Generic MachineInstr to MachineInstr

%0 = COPY %x0 %1 = COPY %x1 %8 = LDRBBui %0, 0 %2 = COPY %8 %9 = SUBREG_TO_REG 0, %2, 15 %3 = UBFMXri %9, 0, 0 %4(GPR,<2 x s32>) = G_BITCAST %3(GPR,s64) %5(GPR,<2 x s32>) = G_LOAD %1(GPR,p0) %6(GPR,<2 x s32>) = G_OR %4, %5 %7(GPR,s64) = G_BITCAST %6(GPR,<2 x s32>) %x0 = COPY %7 RET_ReallyLR implicit %x0

InstructionSelect 2015 RECAP

Page 47: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Generic MachineInstr to MachineInstr

%0 = COPY %x0 %1 = COPY %x1 %8 = LDRBBui %0, 0 %2 = COPY %8 %9 = SUBREG_TO_REG 0, %2, 15 %3 = UBFMXri %9, 0, 0 %4 = COPY %3 %5 = LDRXui %1, 0 %6 = ORRXrr %4, %5 %7 = COPY %6 %x0 = COPY %7 RET_ReallyLR implicit %x0

InstructionSelect

MI

2015 RECAP

Page 48: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegBank SelectLegalizer2

Instruction SelectIRTranslatorLLVM IR MIInstructionSelect

2015 RECAP

Page 49: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegBank SelectLegalizer2

Instruction SelectIRTranslatorLLVM IR MIInstruction2

Select2

2015 RECAP

Page 50: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

MI

(G)MI

Legalizer

RegBank Select

Instruction Select

IRTranslator

LLVM IR

Global ISel Recap Initial Plan & Prototype Status

Page 51: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

1. Proof-of-concept ☑Perform the translation ☑Lower the ABI ☑Support simple instructions

MI

(G)MI

Legalizer

RegBank Select

Instruction Select

IRTranslator

LLVM IR

Global ISel Recap Initial Plan & Prototype Status

Page 52: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

1. Proof-of-concept ☑Perform the translation ☑Lower the ABI ☑Support simple instructions

2. Basic selector ☑Abort or fallback to SDAG on illegal ops ☑Selector patterns written in C++ ☑Simple bank selection

MI

(G)MI

Legalizer

RegBank Select

Instruction Select

IRTranslator

LLVM IR

Global ISel Recap Initial Plan & Prototype Status

Page 53: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

1. Proof-of-concept ☑Perform the translation ☑Lower the ABI ☑Support simple instructions

2. Basic selector ☑Abort or fallback to SDAG on illegal ops ☑Selector patterns written in C++ ☑Simple bank selection

3. Simple legalization ☑Scalar operations ☑Some vector operations

MI

(G)MI

Legalizer

RegBank Select

Instruction Select

IRTranslator

LLVM IR

Global ISel Recap Initial Plan & Prototype Status

Page 54: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Global ISel In Depth

Page 55: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Global ISel In Depth Testability

Page 56: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Testability

.MIR

.BC

.LL

SelectionDAGISel

Page 57: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Instruction Select

.MIR

IRTranslator

.BC

.LL

MI

LLVM IR

Legalizer

RegBank Select

Testability

.MIR

.BC

.LL

SelectionDAGISel

Page 58: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

RegBank Select

IRTranslator

.BC

.LL

Instruction Select

.MIR

Testability

.MIR

.BC

.LL

SelectionDAGISel

Page 59: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

.MIR

RegBank Select

Instruction Select

.MIR.MIR

.MIR

IRTranslator

.BC

.LL .MIR.MIR .MIR

Testability

.MIR

.BC

.LL

SelectionDAGISel

Each pass is individually testable

Page 60: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

.MIR

RegBank Select

Instruction Select

.MIR.MIR

.MIR

IRTranslator

.BC

.LL .MIR.MIR .MIR

Testability

.MIR

.BC

.LL

SelectionDAGISel

$ llc -run-pass <PassName>

Each pass is individually testable

Page 61: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

.MIR

RegBank Select

Instruction Select

.MIR.MIR

.MIR.MIR .MIR

Testability

Each pass is individually testable

Page 62: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

.MIR

Instruction Select

.MIR

RegBank Select

.MIR

.MIR.MIR .MIR

Testability

Each pass is individually testable

Page 63: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

.MIR

.MIR

Set of Transformations

Testability

Page 64: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

.MIR

.MIR

Set of Transformations

(G)MI0

Testability

Page 65: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer (G)MI1(G)MI0

.MIR

.MIR

(G)MI1Set of Transformations

Testability

Page 66: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer (G)MI2

.MIR

.MIR

Set of Transformations

(G)MI1

Testability

State expressed in the IR

Page 67: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer (G)MI2

.MIR

.MIR

Set of Transformations(G)MI1

Testability

State expressed in the IR

Page 68: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer (G)MIi

.MIR

.MIR

Set of Transformations

(G)MI2

Testability

State expressed in the IR

Page 69: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer (G)MIi

.MIR

.MIR

Set of Transformations(G)MI2

Testability

State expressed in the IR

Page 70: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

.MIR

.MIR

Set of Transformations

(G)MIi

Testability

State expressed in the IR

Page 71: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

.MIR

.MIR

Set of Transformations(G)MIiCrash!!

Testability

State expressed in the IR

Page 72: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer (G)MIi

.MIR

.MIR

Set of Transformations

Crash!!

Testability

State expressed in the IR

Page 73: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

.MIR

.MIR

Set of Transformations

(G)MIi

Testability

State expressed in the IR

Page 74: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

MI

RegBank Select

Instruction Select

IRTranslator

LLVM IR

Testability

Page 75: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

MI

RegBank Select

Instruction Select

IRTranslator

LLVM IR

MachineVerifier checks

Testability

• Verifier between each pass

Page 76: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

MI

RegBank Select

Instruction Select

IRTranslator

LLVM IR

MachineVerifier checks

Testability

• Verifier between each pass• Add more checks in the verifierTODO

Page 77: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Global ISel In Depth Passes

Page 78: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Global ISel In Depth Passes: IRTranslator

Page 79: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

IRTranslator

Page 80: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

IRTranslator

• IRTranslator: Target independent translation

IRTranslator

Page 81: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

IRTranslatorUses

• IRTranslator: Target independent translation• CallLowering: Provide hooks for ABI lowering

IRTranslator

CallLowering

Page 82: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

TARGET API

Page 83: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 84: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 85: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 86: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 87: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 88: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 89: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 90: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

lowerCall(Call, ResVReg, ArgVRegs[])

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 91: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

%x0 = COPY %0(_,p0)%x1 = COPY %1(_,p0)BL @bar, csr_aarch64_aapcs, implicit-defs...%2(_,s64) = COPY %x0

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

lowerCall(Call, ResVReg, ArgVRegs[])

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 92: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

%x0 = COPY %0(_,p0)%x1 = COPY %1(_,p0)BL @bar, csr_aarch64_aapcs, implicit-defs...%2(_,s64) = COPY %x0

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

lowerCall(Call, ResVReg, ArgVRegs[])

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 93: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

%x0 = COPY %0(_,p0)%x1 = COPY %1(_,p0)BL @bar, csr_aarch64_aapcs, implicit-defs...%2(_,s64) = COPY %x0

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

lowerCall(Call, ResVReg, ArgVRegs[])

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 94: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

%x0 = COPY %0(_,p0)%x1 = COPY %1(_,p0)BL @bar, csr_aarch64_aapcs, implicit-defs...%2(_,s64) = COPY %x0

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

lowerCall(Call, ResVReg, ArgVRegs[])

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 95: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

%x0 = COPY %0(_,p0)%x1 = COPY %1(_,p0)BL @bar, csr_aarch64_aapcs, implicit-defs...%2(_,s64) = COPY %x0

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

lowerCall(Call, ResVReg, ArgVRegs[])

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 96: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

%x0 = COPY %0(_,p0)%x1 = COPY %1(_,p0)BL @bar, csr_aarch64_aapcs, implicit-defs...%2(_,s64) = COPY %x0

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

lowerCall(Call, ResVReg, ArgVRegs[])

lowerReturn(Value, VReg)

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 97: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

%x0 = COPY %0(_,p0)%x1 = COPY %1(_,p0)BL @bar, csr_aarch64_aapcs, implicit-defs...%2(_,s64) = COPY %x0%x0 = COPY %2(_,s64)RET_ReallyLR implicit %x0

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

lowerCall(Call, ResVReg, ArgVRegs[])

lowerReturn(Value, VReg)

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 98: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

%x0 = COPY %0(_,p0)%x1 = COPY %1(_,p0)BL @bar, csr_aarch64_aapcs, implicit-defs...%2(_,s64) = COPY %x0%x0 = COPY %2(_,s64)RET_ReallyLR implicit %x0

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

lowerCall(Call, ResVReg, ArgVRegs[])

lowerReturn(Value, VReg)

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 99: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

%x0 = COPY %0(_,p0)%x1 = COPY %1(_,p0)BL @bar, csr_aarch64_aapcs, implicit-defs...%2(_,s64) = COPY %x0%x0 = COPY %2(_,s64)RET_ReallyLR implicit %x0

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

lowerCall(Call, ResVReg, ArgVRegs[])

lowerReturn(Value, VReg)

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 100: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

%x0 = COPY %0(_,p0)%x1 = COPY %1(_,p0)BL @bar, csr_aarch64_aapcs, implicit-defs...%2(_,s64) = COPY %x0%x0 = COPY %2(_,s64)RET_ReallyLR implicit %x0

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

lowerCall(Call, ResVReg, ArgVRegs[])

lowerReturn(Value, VReg)

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 101: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CallLowering

IRTranslator CallLowering

%x0 = COPY %0(_,p0)%x1 = COPY %1(_,p0)BL @bar, csr_aarch64_aapcs, implicit-defs...%2(_,s64) = COPY %x0%x0 = COPY %2(_,s64)RET_ReallyLR implicit %x0

@baz i1* %addr1, <2 x i32> *%addr2

ret i64 %res

define i64 () {

}

lowerFormalArguments(Function, VRegs[])

lowerCall(Call, ResVReg, ArgVRegs[])

lowerReturn(Value, VReg)

%0(_,p0) = COPY %x0%1(_,p0) = COPY %x1

%res = call i64 bar(i1* %addr1, <2 x i32> *%addr2)

TARGET API

Page 102: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

IRTranslator Aggregates

IN DEPTH

Page 103: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

IRTranslator Aggregates

%struct.AB = type { i32, i8 }

IN DEPTH

Page 104: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

IRTranslator Aggregates

%struct.AB = type { i32, i8 }

LLVM IR (Value) { i32 i8 }

IN DEPTH

Page 105: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

IRTranslator Aggregates

%struct.AB = type { i32, i8 }

LLVM IR (Value) { i32 i8 }

SelectionDAG (SDValues) i32 i8

IN DEPTH

Page 106: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

IRTranslator Aggregates

%struct.AB = type { i32, i8 }

LLVM IR (Value) { i32 i8 }

SelectionDAG (SDValues) i32 i8

GlobalISel (vreg) s64

IN DEPTH

Page 107: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

IRTranslator Aggregates

%struct.AB = type { i32, i8 }

LLVM IR (Value) { i32 i8 }

SelectionDAG (SDValues) i32 i8

GlobalISel (vreg) s64

• One scalar vreg for aggregate type

IN DEPTH

Page 108: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

IRTranslator Aggregates

%struct.AB = type { i32, i8 }

LLVM IR (Value) { i32 i8 }

SelectionDAG (SDValues) i32 i8

GlobalISel (vreg)

• One scalar vreg for aggregate type

IN DEPTH

Page 109: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

IRTranslator Aggregates

%struct.AB = type { i32, i8 }

LLVM IR (Value) { i32 i8 }

SelectionDAG (SDValues) i32 i8

GlobalISel (vreg)

• One scalar vreg for aggregate type

• Express that some bits are garbageTODO

IN DEPTH

Page 110: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

[...] %6(_,s64) = G_CONSTANT Cst

[...]

[...] %4(_,s64) = G_MUL %1, Cst

[...]

[...] %5(_,s64) = G_ADD %2, Cst

[...]

IRTranslator Constants

IN DEPTH

Page 111: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

[...] %6(_,s64) = G_CONSTANT Cst

[...]

[...] %4(_,s64) = G_MUL %1, Cst

[...]

[...] %5(_,s64) = G_ADD %2, Cst

[...]Cst Cst

IRTranslator Constants

IN DEPTH

Page 112: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CstCst[...]

%6(_,s64) = G_CONSTANT Cst [...]

[...] %4(_,s64) = G_MUL %1, Cst

[...]

[...] %5(_,s64) = G_ADD %2, Cst

[...]%6 %6

IRTranslator Constants

IN DEPTH

Page 113: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CstCst[...]

%6(_,s64) = G_CONSTANT Cst [...]

[...] %4(_,s64) = G_MUL %1, Cst

[...]

[...] %5(_,s64) = G_ADD %2, Cst

[...]%6 %6

• Constants in entry block

IRTranslator Constants

IN DEPTH

Page 114: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CstCst[...]

%6(_,s64) = G_CONSTANT Cst [...]

[...] %4(_,s64) = G_MUL %1, Cst

[...]

[...] %5(_,s64) = G_ADD %2, Cst

[...]%6 %6

• Constants in entry block• Investigate better constants placementTODO

IRTranslator Constants

IN DEPTH

Page 115: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

CstCst[...]

%6(_,s64) = G_CONSTANT Cst [...]

[...] %4(_,s64) = G_MUL %1, Cst

[...]

[...] %5(_,s64) = G_ADD %2, Cst

[...]%6 %6

• Constants in entry block • Investigate better constants placementTODO

IRTranslator Constants

IN DEPTH

Page 116: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Global ISel In Depth Passes: Legalizer

Page 117: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Legalizer

Page 118: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Legalizer Pass: Iterate and legalize

Legalizer

Legalizer

Page 119: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Legalizer Pass: Iterate and legalize

• LegalizerInfo: Drive the legalization process

LegalizerUses

Legalizer

LegalizerInfo

Page 120: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Legalizer Pass: Iterate and legalize

• LegalizerInfo: Drive the legalization process

• LegalizerHelper: Implement the common legalization actions (NarrowScalar, Widen, etc.)

Legalizer LegalizerHelperUses Uses

Legalizer

LegalizerInfo

Page 121: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

Legalizer LegalizerInfo

TARGET API

Page 122: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

TARGET API

Page 123: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

TARGET API

Page 124: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

TARGET API

Page 125: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

TARGET API

Page 126: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

TARGET API

Page 127: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

TARGET API

Page 128: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

TARGET API

Page 129: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

TARGET API

Page 130: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

TARGET API

Page 131: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

TARGET API

Page 132: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

TARGET API

Page 133: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

TARGET API

Page 134: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

TARGET API

Page 135: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

TARGET API

Page 136: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ...

%3(_,s1) = G_ICMP(eq) %2(_,s16), %2

TARGET API

Page 137: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ... %4(_,s32) = G_ZEXT %2(_,s16) %3(_,s1) = G_ICMP(eq) %4(_,s32), %4

TARGET API

Page 138: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

setAction({s1, 0, Legal}, G_ICMP) setAction({s32, 1, Legal}, G_ICMP) setAction({s16, 1, WidenScalar}, G_ICMP)

%0(_,s32) = ... %1(_,s1) = G_ICMP(eq) %0(_,s32), %0

%2(_,s16) = ... %4(_,s32) = G_ZEXT %2(_,s16) %3(_,s1) = G_ICMP(eq) %4(_,s32), %4

TARGET API

Page 139: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

IN DEPTH

Page 140: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

• Support non-power of 2 typesTODO

IN DEPTH

Page 141: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

LegalizerInfosetAction({Type, [OpIdx,] Action}, Opcode)

There are no illegal types, only illegal operations

Legalizer LegalizerInfo

• Support non-power of 2 types• Infer legality from TableGen

TODO

TODO

IN DEPTH

Page 142: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Global ISel In Depth Passes: RegBankSelect

Page 143: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegBankSelect

Page 144: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• RegBankSelect: Main pass

RegBankSelect

RegBankSelect

Page 145: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• RegBankSelect: Main pass• Perform top-down register bank assignments

RegBankSelect

RegBankSelect

Page 146: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• RegBankSelect: Main pass• Perform top-down register bank assignments• Support two modes: Fast and Greedy

RegBankSelect

RegBankSelect

Page 147: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• RegBankSelect: Main pass• Perform top-down register bank assignments• Support two modes: Fast and Greedy• Improve Greedy

RegBankSelect

TODO

RegBankSelect

Page 148: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• RegBankSelect: Main pass• Perform top-down register bank assignments• Support two modes: Fast and Greedy• Improve Greedy• Add a Global mode

RegBankSelect

TODO

TODO

RegBankSelect

Page 149: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• RegBankSelect: Main pass• Perform top-down register bank assignments• Support two modes: Fast and Greedy• Improve Greedy• Add a Global mode

• RegisterBankInfo: Provide RegisterBank related information

RegBankSelectUses

TODO

TODO

RegBankSelect

RegisterBankInfo

Page 150: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass)

RegBankSelect RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

TARGET API

Page 151: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass) FPRRegBank covers FPR32RegClass

RegBankSelect RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

TARGET API

Page 152: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass)

FPR32

FPRRegBank covers FPR32RegClass

FPR coverage

RegBankSelect RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

TARGET API

Page 153: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass)

FPR32

FPRRegBank covers FPR32RegClassFPRRegBank covers FPR64RegClass

FPR coverage

RegBankSelect RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

TARGET API

Page 154: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass)

FPR64

FPR32

FPRRegBank covers FPR32RegClassFPRRegBank covers FPR64RegClass

FPR coverage

RegBankSelect RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

TARGET API

Page 155: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass)

QQQQQQQQQ

FPR64

FPR32

FPRRegBank covers QQQQRegClass

FPRRegBank covers FPR32RegClassFPRRegBank covers FPR64RegClass

FPR128

FPR coverage

RegBankSelect RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

TARGET API

Page 156: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass) copyCost(RegBankDst, RegBankSrc, Size)

RegBankSelect RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

TARGET API

Page 157: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass) copyCost(RegBankDst, RegBankSrc, Size)

RegBankSelect RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

• Cost of cross register bank copies

TARGET API

Page 158: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass) copyCost(RegBankDst, RegBankSrc, Size) %0(RBDst,Size) = COPY %1(RBSrc,Size)

RegBankSelect RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

• Cost of cross register bank copies

TARGET API

Page 159: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass) copyCost(RegBankDst, RegBankSrc, Size) getInstrMapping(MachineInstr)

RegBankSelect RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

• Cost of cross register bank copies • Mapping of the Instructions

TARGET API

Page 160: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass) copyCost(RegBankDst, RegBankSrc, Size) getInstrMapping(MachineInstr)

%0(_,s64) = G_OR %1, %2

RegBankSelect RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

• Cost of cross register bank copies • Mapping of the Instructions

TARGET API

Page 161: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass) copyCost(RegBankDst, RegBankSrc, Size) getInstrMapping(MachineInstr)

%0(_,s64) = G_OR %1, %2

{/*ID*/ DefaultMappingID, /*Cost*/ 1, /*Opd0*/ {[0,63], GPR}, /*Opd1*/ {[0,63], GPR}, /*Opd2*/ {[0,63], GPR}}

RegBankSelect RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

• Cost of cross register bank copies • Mapping of the Instructions

TARGET API

Page 162: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass) copyCost(RegBankDst, RegBankSrc, Size) getInstrMapping(MachineInstr) getInstrAlternativeMappings(MachineInstr)

{/*ID*/ VecOR, /*Cost*/ 1, /*Opd0*/ {[0,63], FPR}, /*Opd1*/ {[0,63], FPR}, /*Opd2*/ {[0,63], FPR}}

{/*ID*/ DefaultMappingID, /*Cost*/ 1, /*Opd0*/ {[0,63], GPR}, /*Opd1*/ {[0,63], GPR}, /*Opd2*/ {[0,63], GPR}}

RegBankSelect RegisterBankInfo

%0(_,s64) = G_OR %1, %2

• Coverage of the RegisterClasses by the RegisterBanks

• Cost of cross register bank copies • Mapping of the Instructions

TARGET API

Page 163: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfoaddRegBankCoverage(RegBank, RegClass) copyCost(RegBankDst, RegBankSrc, Size) getInstrMapping(MachineInstr) getInstrAlternativeMappings(MachineInstr)

RegBankSelect RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

• Cost of cross register bank copies • Mapping of the Instructions • Merge the API related to instruction mappingsTODO

IN DEPTH

Page 164: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

RegisterBankInfo

• Coverage of the RegisterClasses by the RegisterBanks

• Cost of cross register bank copies • Mapping of the Instructions • Merge the API related to instruction mappings • Infer mappings from TableGen

addRegBankCoverage(RegBank, RegClass) copyCost(RegBankDst, RegBankSrc, Size) getInstrMapping(MachineInstr) getInstrAlternativeMappings(MachineInstr)

TODO

TODO

RegBankSelect RegisterBankInfo

IN DEPTH

Page 165: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Global ISel In Depth Passes: InstructionSelect

Page 166: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

InstructionSelect

Page 167: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• InstructionSelect Pass: ISel engine

InstructionSelect

InstructionSelect

Page 168: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• InstructionSelect Pass: ISel engine

• Traverse blocks bottom-up

InstructionSelect

InstructionSelect

Page 169: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• InstructionSelect Pass: ISel engine

• Traverse blocks bottom-up

• Provide dead code elimination for free

InstructionSelect

InstructionSelect

Page 170: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• InstructionSelect Pass: ISel engine

• Traverse blocks bottom-up

• Provide dead code elimination for free

• InstructionSelector: Translate (G)MI to MI

InstructionSelectUses

InstructionSelect

InstructionSelector

Page 171: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

InstructionSelectorselect(MachineInstr)

InstructionSelect InstructionSelector

TARGET API

Page 172: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

InstructionSelectorselect(MachineInstr) %6(GPR,<2 x s32>) = G_OR %4, %5

InstructionSelect InstructionSelector

TARGET API

Page 173: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

InstructionSelector

• Switch to target specific opcode

select(MachineInstr) %6(GPR,<2 x s32>) = ORRXrr %4, %5

InstructionSelect InstructionSelector

TARGET API

Page 174: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

InstructionSelector

• Switch to target specific opcode

select(MachineInstr) %6(GPR64) = ORRXrr %4, %5

InstructionSelect InstructionSelector

TARGET API

Page 175: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

InstructionSelector

• Switch to target specific opcode• Set proper RegisterClass

InstructionSelector::constrainSelectedInstRegOperands

select(MachineInstr) %6(GPR64) = ORRXrr %4, %5

InstructionSelect InstructionSelector

TARGET API

Page 176: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

InstructionSelector

• Switch to target specific opcode• Set proper RegisterClass

InstructionSelector::constrainSelectedInstRegOperands

select(MachineInstr) %6(GPR64) = ORRXrr %4, %5

InstructionSelect InstructionSelector

IN DEPTH

Page 177: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

InstructionSelector

• Switch to target specific opcode• Set proper RegisterClass

InstructionSelector::constrainSelectedInstRegOperands

• InstructionSelector bound to subtarget

select(MachineInstr) %6(GPR64) = ORRXrr %4, %5

InstructionSelect InstructionSelector

IN DEPTH

Page 178: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

InstructionSelector

• Switch to target specific opcode• Set proper RegisterClass

InstructionSelector::constrainSelectedInstRegOperands

• InstructionSelector bound to subtarget• Generate select code from TableGen

select(MachineInstr) %6(GPR64) = ORRXrr %4, %5

TODO

InstructionSelect InstructionSelector

IN DEPTH

Page 179: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Global ISel In Depth Targeting Overview

Page 180: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Targeting TargetPassConfig

TARGET API

Page 181: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Create the Global ISel pipeline

Targeting TargetPassConfig

TARGET API

Page 182: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Create the Global ISel pipeline MI

Legalizer

RegBank Select

Instruction Select

IRTranslator

LLVM IRTargeting TargetPassConfig

TARGET API

Page 183: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Create the Global ISel pipeline MI

Legalizer

RegBank Select

Instruction Select

IRTranslator

LLVM IR

addIRTranslator

addLegalizeMachineIR

addRegBankSelect

addGlobalInstructionSelect

Targeting TargetPassConfig

TARGET API

Page 184: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Create the Global ISel pipeline• Inject additional target specific passes

MI

Legalizer

RegBank Select

Instruction Select

IRTranslator

LLVM IR

addIRTranslator

addLegalizeMachineIR

addRegBankSelect

addGlobalInstructionSelect

Targeting TargetPassConfig

TARGET API

Page 185: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Create the Global ISel pipeline• Inject additional target specific passes

MI

Legalizer

RegBank Select

Instruction Select

IRTranslator

LLVM IR

addIRTranslatoraddPreLegalizeMachineIR

addLegalizeMachineIRaddPreRegBankSelect

addRegBankSelect

addPreGlobalInstructionSelect

addGlobalInstructionSelect

Targeting TargetPassConfig

TARGET API

Page 186: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Create the Global ISel pipeline• Inject additional target specific passes• GISelAccessor available as a proxy

MI

Legalizer

RegBank Select

Instruction Select

IRTranslator

LLVM IR

addIRTranslatoraddPreLegalizeMachineIR

addLegalizeMachineIRaddPreRegBankSelect

addRegBankSelect

addPreGlobalInstructionSelect

addGlobalInstructionSelect

Targeting TargetPassConfig

TARGET API

Page 187: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Targeting Summary

TARGET API

Page 188: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• TargetPassConfig

Targeting Summary

TARGET API

Page 189: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• TargetPassConfig

• CallLowering

Targeting Summary

TARGET API

Page 190: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• TargetPassConfig

• CallLowering

• LegalizerInfo

Targeting Summary

TARGET API

Page 191: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• TargetPassConfig

• CallLowering

• LegalizerInfo

• RegisterBankInfo

Targeting Summary

TARGET API

Page 192: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• TargetPassConfig

• CallLowering

• LegalizerInfo

• RegisterBankInfo

• InstructionSelector

Targeting Summary

TARGET API

Page 193: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Global ISel Status

Page 194: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Non Goals

Page 195: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

☒Self contained representation

Non Goals

Page 196: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Goals

Page 197: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

☑Global

Goals

Page 198: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

☑Global☑Fast

Goals

Page 199: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

☑Global☑Fast☑Shared code path for fast and good ISel

Goals

Page 200: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

☑Global☑Fast☑Shared code path for fast and good ISel☑No change to LLVM IR

Goals

Page 201: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

☑Global☑Fast☑Shared code path for fast and good ISel☑No change to LLVM IR

⍰More configurable

Goals

Page 202: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

☑Global☑Fast☑Shared code path for fast and good ISel☑No change to LLVM IR

⍰More configurable

⍰ Easier to maintain/understand

Goals

Page 203: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Future Work

Page 204: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Work on supporting all IR

Future Work

Page 205: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Work on supporting all IR

• Work on compile time and runtime performance

Future Work

Page 206: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Work on supporting all IR

• Work on compile time and runtime performance

• Implement TableGen support

Future Work

Page 207: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Work on supporting all IR

• Work on compile time and runtime performance

• Implement TableGen support

• Deliver documentation

Future Work

Page 208: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Work on supporting all IR

• Work on compile time and runtime performance

• Implement TableGen support

• Deliver documentation

• Think about a transition plan

Future Work

Page 209: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

• Work on supporting all IR

• Work on compile time and runtime performance

• Implement TableGen support

• Deliver documentation

• Think about a transition plan

• Implement more backends

Future Work

Page 210: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM

Questions?

http://llvm.org/docs/GlobalISel.html

Page 211: GISel DevMtg16 copy - LLVMllvm.org/devmtg/2016-11/Slides/Colombet-GlobalISel.pdf · Title: GISel DevMtg16 copy Created Date: 11/7/2016 5:07:48 PM