llvm / llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
http://llvm.org
Other
28.78k stars 11.9k forks source link

[RISCV][LoopUnroll/CostModel] Loops with Insert/Extract element using induction variable without vector are not unrolled #92366

Open joe-img opened 5 months ago

joe-img commented 5 months ago

Without vector, extractelement/insertelement with non-constant index can be very costly. This was factored into the cost model in https://github.com/llvm/llvm-project/pull/67334

However, in the case of full canonical loop unrolling and the index being the induction variable, the index will be constant, but is not at the time of estimating the cost of unrolling the loop.

Example before and after this change: (llvm 17 vs 18) https://compiler-explorer.com/z/Mh6eWKjr7

I had a go at fixing this myself, but could not see a good fix. I ended up abusing ephemeral values that get passed into UnrollCostEstimator.

llvmbot commented 5 months ago

@llvm/issue-subscribers-backend-risc-v

Author: Joe Faulls (joe-img)

Without vector, extractelement/insertelement with non-constant index can be very costly. This was factored into the cost model in https://github.com/llvm/llvm-project/pull/67334 However, in the case of full canonical loop unrolling and the index being the induction variable, the index _will_ be constant, but is not at the time of estimating the cost of unrolling the loop. Example before and after this change: (llvm 17 vs 18) https://compiler-explorer.com/z/Mh6eWKjr7 I had a go at fixing this myself, but could not see a good fix. I ended up abusing ephemeral values that get passed into UnrollCostEstimator.
asb commented 5 months ago

This wouldn't fix the general problem, but at least for the kind of example you shared (simple vector initialisation expressed using a loop), I wonder if it would make sense to do something in LoopIdiomRecognize to detect that pattern and replace the loop with logic that sets a constant vec value.