diff options
author | Philip Reames <preames@rivosinc.com> | 2022-06-09 15:11:01 -0700 |
---|---|---|
committer | Philip Reames <listmail@philipreames.com> | 2022-06-09 15:17:24 -0700 |
commit | f85c5079b8d093ed9867733fac2946e3a50ed039 (patch) | |
tree | 3db8eefff0039e4259bbf74415263d1aafeb6337 /llvm/lib/Transforms/Utils/LoopRotationUtils.cpp | |
parent | ba79bb4973f963e9bd6a007e6508cdc6ec990051 (diff) | |
download | llvm-f85c5079b8d093ed9867733fac2946e3a50ed039.zip llvm-f85c5079b8d093ed9867733fac2946e3a50ed039.tar.gz llvm-f85c5079b8d093ed9867733fac2946e3a50ed039.tar.bz2 |
Pipe potentially invalid InstructionCost through CodeMetrics
Per the documentation in Support/InstructionCost.h, the purpose of an invalid cost is so that clients can change behavior on impossible to cost inputs. CodeMetrics was instead asserting that invalid costs never occurred.
On a target with an incomplete cost model - e.g. RISCV - this means that transformations would crash on (falsely) invalid constructs - e.g. scalable vectors. While we certainly should improve the cost model - and I plan to do so in the near future - we also shouldn't be crashing. This violates the explicitly stated purpose of an invalid InstructionCost.
I updated all of the "easy" consumers where bailouts were locally obvious. I plan to follow up with loop unroll in a following change.
Differential Revision: https://reviews.llvm.org/D127131
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopRotationUtils.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopRotationUtils.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp b/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp index 6dd5f6b..0f33559 100644 --- a/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopRotationUtils.cpp @@ -310,7 +310,13 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) { L->dump()); return Rotated; } - if (Metrics.NumInsts > MaxHeaderSize) { + if (!Metrics.NumInsts.isValid()) { + LLVM_DEBUG(dbgs() << "LoopRotation: NOT rotating - contains instructions" + " with invalid cost: "; + L->dump()); + return Rotated; + } + if (*Metrics.NumInsts.getValue() > MaxHeaderSize) { LLVM_DEBUG(dbgs() << "LoopRotation: NOT rotating - contains " << Metrics.NumInsts << " instructions, which is more than the threshold (" |