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.
Testing wise, I don't have a good answer. I'm about to update the RISC-V model which means that using riscv for tests won't work long term. I could in theory pick some architecture without scalable support (e.g. x86), but that seems somewhat weird. I'm tempted to just leave this untested in the patch. Thoughts?
Is this field misnamed? It seems like that was already the case so I won't block the patch.