[llvm] [GlobalISel] Micro-optimize getConstantVRegValWithLookThrough (PR #91969)
Pierre van Houtryve via llvm-commits
llvm-commits at lists.llvm.org
Mon May 13 07:27:42 PDT 2024
================
@@ -313,13 +313,22 @@ llvm::getIConstantVRegSExtVal(Register VReg, const MachineRegisterInfo &MRI) {
namespace {
-typedef std::function<bool(const MachineInstr *)> IsOpcodeFn;
-typedef std::function<std::optional<APInt>(const MachineInstr *MI)> GetAPCstFn;
-
-std::optional<ValueAndVReg> getConstantVRegValWithLookThrough(
- Register VReg, const MachineRegisterInfo &MRI, IsOpcodeFn IsConstantOpcode,
- GetAPCstFn getAPCstValue, bool LookThroughInstrs = true,
- bool LookThroughAnyExt = false) {
+// This function is used in many places, and as such, it has some
+// micro-optimizations to try and make it as fast as it can be.
+//
+// - We use template arguments to avoid an indirect call caused by passing a
+// function_ref/std::function
+// - GetAPCstValue does not return std::optional<APInt> as that's expensive.
+// Instead it returns true/false and places the result in a pre-constructed
+// APInt.
+//
+// Please change this function carefully and benchmark your changes.
+template <bool (*IsConstantOpcode)(const MachineInstr *),
+ bool (*GetAPCstValue)(const MachineInstr *MI, APInt &)>
----------------
Pierre-vh wrote:
The idea is to make sure this becomes a direct call and ideally even inline the IsConstantOpcode function, with function_ref that's not possible
I can use a typedef to make it less ugly if you want
https://github.com/llvm/llvm-project/pull/91969
More information about the llvm-commits
mailing list