Dependencies LLVM调度以防止数据危害

Dependencies LLVM调度以防止数据危害,dependencies,llvm,scheduling,Dependencies,Llvm,Scheduling,我正试图在llvm中将调度添加到后端,以防止数据危险。后端与microblaze非常相似,但有很多不同之处,例如用于分支延迟的多个延迟槽。目前,每当llvm编译代码时,我总是发现数据危险,尤其是对于加载和存储指令。 我已经研究了PPC和ARM后端调度,但我不知道如何调整它,所以我想做我自己的。 我想知道如何在编译过程中从llvm获取编译指令的列表,以便根据使用的寄存器对指令进行排序并检查依赖性 我现在对此一无所知,因为我不是一个熟练的C++程序员。CPU是流水线的,只有控制危险(分支)和数据危险

我正试图在llvm中将调度添加到后端,以防止数据危险。后端与microblaze非常相似,但有很多不同之处,例如用于分支延迟的多个延迟槽。目前,每当llvm编译代码时,我总是发现数据危险,尤其是对于加载和存储指令。 我已经研究了PPC和ARM后端调度,但我不知道如何调整它,所以我想做我自己的。 我想知道如何在编译过程中从llvm获取编译指令的列表,以便根据使用的寄存器对指令进行排序并检查依赖性

我现在对此一无所知,因为我不是一个熟练的C++程序员。CPU是流水线的,只有控制危险(分支)和数据危险。 CPU有5个阶段在管道中,但只有阶段3和5中的指令能够使用阶段1中的数据。
我已经为我的后端设置了延迟,但它没有改变任何事情。

我认为你不应该重新发明轮子,编写你的侧调度程序。您需要在后端添加HazardRecognizer。通过这种方式,LLVM的调度程序将了解可能的危险,并尝试避免它们。PPC后端可能是此类调度的最佳示例。

PPC的危害调度包含的内容远远超过了我的后端所需的内容。我的后端将不会有结构性的危险,我不完全理解isSingle和isFirst的确切用途。另外还有一个问题,就是对分支延迟槽中的指令的代码和数据进行正确排序。分支延迟槽适合3条指令。我还想知道在调度之后如何对代码进行排序。我更喜欢brid(…),swi,swi,nop。谢谢