[llvm] r298855 - [GlobalISel] Add a 'getConstantVRegVal' helper.
Ahmed Bougacha via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 27 09:35:28 PDT 2017
Author: ab
Date: Mon Mar 27 11:35:27 2017
New Revision: 298855
URL: http://llvm.org/viewvc/llvm-project?rev=298855&view=rev
Log:
[GlobalISel] Add a 'getConstantVRegVal' helper.
Use it to compare immediate operands.
Modified:
llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelector.h
llvm/trunk/lib/CodeGen/GlobalISel/InstructionSelector.cpp
Modified: llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelector.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelector.h?rev=298855&r1=298854&r2=298855&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelector.h (original)
+++ llvm/trunk/include/llvm/CodeGen/GlobalISel/InstructionSelector.h Mon Mar 27 11:35:27 2017
@@ -16,6 +16,7 @@
#ifndef LLVM_CODEGEN_GLOBALISEL_INSTRUCTIONSELECTOR_H
#define LLVM_CODEGEN_GLOBALISEL_INSTRUCTIONSELECTOR_H
+#include "llvm/ADT/Optional.h"
#include <cstdint>
namespace llvm {
@@ -61,6 +62,9 @@ protected:
const TargetRegisterInfo &TRI,
const RegisterBankInfo &RBI) const;
+ Optional<int64_t> getConstantVRegVal(unsigned VReg,
+ const MachineRegisterInfo &MRI) const;
+
bool isOperandImmEqual(const MachineOperand &MO, int64_t Value,
const MachineRegisterInfo &MRI) const;
};
Modified: llvm/trunk/lib/CodeGen/GlobalISel/InstructionSelector.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalISel/InstructionSelector.cpp?rev=298855&r1=298854&r2=298855&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/GlobalISel/InstructionSelector.cpp (original)
+++ llvm/trunk/lib/CodeGen/GlobalISel/InstructionSelector.cpp Mon Mar 27 11:35:27 2017
@@ -68,21 +68,29 @@ bool InstructionSelector::constrainSelec
return true;
}
+Optional<int64_t>
+InstructionSelector::getConstantVRegVal(unsigned VReg,
+ const MachineRegisterInfo &MRI) const {
+ MachineInstr *MI = MRI.getVRegDef(VReg);
+ if (MI->getOpcode() != TargetOpcode::G_CONSTANT)
+ return None;
+
+ if (MI->getOperand(1).isImm())
+ return MI->getOperand(1).getImm();
+
+ if (MI->getOperand(1).isCImm() &&
+ MI->getOperand(1).getCImm()->getBitWidth() <= 64)
+ return MI->getOperand(1).getCImm()->getSExtValue();
+
+ return None;
+}
+
bool InstructionSelector::isOperandImmEqual(
const MachineOperand &MO, int64_t Value,
const MachineRegisterInfo &MRI) const {
- // TODO: We should also test isImm() and isCImm() too but this isn't required
- // until a DAGCombine equivalent is implemented.
-
- if (MO.isReg()) {
- MachineInstr *Def = MRI.getVRegDef(MO.getReg());
- if (Def->getOpcode() != TargetOpcode::G_CONSTANT)
- return false;
- assert(Def->getOperand(1).isCImm() &&
- "G_CONSTANT values must be constants");
- const ConstantInt &Imm = *Def->getOperand(1).getCImm();
- return Imm.getBitWidth() <= 64 && Imm.getSExtValue() == Value;
- }
+ if (MO.getReg())
+ if (auto VRegVal = getConstantVRegVal(MO.getReg(), MRI))
+ return *VRegVal == Value;
return false;
}
More information about the llvm-commits
mailing list