diff --git a/lib/CodeGen/GlobalISel/InstructionSelect.cpp b/lib/CodeGen/GlobalISel/InstructionSelect.cpp index a38ff00ed41..c1e4a8661a2 100644 --- a/lib/CodeGen/GlobalISel/InstructionSelect.cpp +++ b/lib/CodeGen/GlobalISel/InstructionSelect.cpp @@ -20,6 +20,7 @@ #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/TargetPassConfig.h" +#include "llvm/IR/Constants.h" #include "llvm/IR/Function.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" @@ -187,8 +188,10 @@ bool InstructionSelector::isOperandImmEqual( MachineInstr *Def = MRI.getVRegDef(MO.getReg()); if (Def->getOpcode() != TargetOpcode::G_CONSTANT) return false; - assert(Def->getOperand(1).isImm() && "G_CONSTANT values must be constants"); - return Def->getOperand(1).getImm() == Value; + 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; } return false; diff --git a/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect-xor.mir b/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect-xor.mir index 2fd5588cadd..722dddb20a7 100644 --- a/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect-xor.mir +++ b/test/CodeGen/AArch64/GlobalISel/arm64-instructionselect-xor.mir @@ -100,7 +100,7 @@ body: | liveins: %w0 %0(s32) = COPY %w0 - %1(s32) = G_CONSTANT -1 + %1(s32) = G_CONSTANT i64 -1 %2(s32) = G_XOR %0, %1 ... @@ -128,7 +128,7 @@ body: | liveins: %x0 %0(s64) = COPY %x0 - %1(s64) = G_CONSTANT -1 + %1(s64) = G_CONSTANT i64 -1 %2(s64) = G_XOR %0, %1 ... @@ -157,10 +157,9 @@ body: | bb.0: liveins: %w0, %w1 successors: %bb.1 - %1(s32) = G_CONSTANT -1 + %1(s32) = G_CONSTANT i64 -1 G_BR %bb.1 bb.1: %0(s32) = COPY %w0 %2(s32) = G_XOR %0, %1 ... -