[MCA] Add an experimental MicroOpQueue stage.
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Fri, 29 Mar 2019 12:15:37 +0000 (12:15 +0000)
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>
Fri, 29 Mar 2019 12:15:37 +0000 (12:15 +0000)
commite074ac60b452717166398db0044fad0899c85b13
treeaeec0d0c76293d7d5261a6a0e949da3808ff0326
parent2b766ed774d4f0cf14f82c7e2eacb774d633fb77
[MCA] Add an experimental MicroOpQueue stage.

This patch adds an experimental stage named MicroOpQueueStage.
MicroOpQueueStage can be used to simulate a hardware micro-op queue (basically,
a decoupling queue between 'decode' and 'dispatch').  Users can specify a queue
size, as well as a optional MaxIPC (which - in the absence of a "Decoders" stage
- can be used to simulate a different throughput from the decoders).

This stage is added to the default pipeline between the EntryStage and the
DispatchStage only if PipelineOption::MicroOpQueue is different than zero. By
default, llvm-mca sets PipelineOption::MicroOpQueue to the value of hidden flag
-micro-op-queue-size.

Throughput from the decoder can be simulated via another hidden flag named
-decoder-throughput.  That flag allows us to quickly experiment with different
frontend throughputs.  For targets that declare a loop buffer, flag
-decoder-throughput allows users to do multiple runs, each time simulating a
different throughput from the decoders.

This stage can/will be extended in future. For example, we could add a "buffer
full" event to notify bottlenecks caused by backpressure. flag
-decoder-throughput would probably go away if in future we delegate to another
stage (DecoderStage?) the simulation of a (potentially variable) throughput from
the decoders. For now, flag -decoder-throughput is "good enough" to run some
simple experiments.

Differential Revision: https://reviews.llvm.org/D59928

llvm-svn: 357248
llvm/include/llvm/MCA/Context.h
llvm/include/llvm/MCA/Stages/MicroOpQueueStage.h [new file with mode: 0644]
llvm/lib/MCA/CMakeLists.txt
llvm/lib/MCA/Context.cpp
llvm/lib/MCA/Stages/MicroOpQueueStage.cpp [new file with mode: 0644]
llvm/test/tools/llvm-mca/X86/uop-queue.s [new file with mode: 0644]
llvm/tools/llvm-mca/llvm-mca.cpp