[llvm] 5cf6412 - [GlobalISel] Fix modifying a G_OR without notifying the observer
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 29 08:34:29 PST 2021
Author: Jay Foad
Date: 2021-01-29T16:32:24Z
New Revision: 5cf6412a27892a7a48c83e26d79f8c3ae1cfa944
URL: https://github.com/llvm/llvm-project/commit/5cf6412a27892a7a48c83e26d79f8c3ae1cfa944
DIFF: https://github.com/llvm/llvm-project/commit/5cf6412a27892a7a48c83e26d79f8c3ae1cfa944.diff
LOG: [GlobalISel] Fix modifying a G_OR without notifying the observer
Remove the call to setFlags in favour of creating the instruction with
the correct flags in the first place, so we don't have to explicitly
notify the observer.
Differential Revision: https://reviews.llvm.org/D95681
Added:
Modified:
llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
index 93fd1cce29fd..3c8c858371a7 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
@@ -1507,8 +1507,9 @@ class MachineIRBuilder {
///
/// \return a MachineInstrBuilder for the newly created instruction.
MachineInstrBuilder buildOr(const DstOp &Dst, const SrcOp &Src0,
- const SrcOp &Src1) {
- return buildInstr(TargetOpcode::G_OR, {Dst}, {Src0, Src1});
+ const SrcOp &Src1,
+ Optional<unsigned> Flags = None) {
+ return buildInstr(TargetOpcode::G_OR, {Dst}, {Src0, Src1}, Flags);
}
/// Build and insert \p Res = G_XOR \p Op0, \p Op1
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
index 9fbbdd1ccdf5..ba5170c73116 100644
--- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
@@ -5479,31 +5479,27 @@ LegalizerHelper::lowerFCopySign(MachineInstr &MI) {
auto NotSignBitMask = MIRBuilder.buildConstant(
Src0Ty, APInt::getLowBitsSet(Src0Size, Src0Size - 1));
- auto And0 = MIRBuilder.buildAnd(Src0Ty, Src0, NotSignBitMask);
- MachineInstr *Or;
-
+ Register And0 = MIRBuilder.buildAnd(Src0Ty, Src0, NotSignBitMask).getReg(0);
+ Register And1;
if (Src0Ty == Src1Ty) {
- auto And1 = MIRBuilder.buildAnd(Src1Ty, Src1, SignBitMask);
- Or = MIRBuilder.buildOr(Dst, And0, And1);
+ And1 = MIRBuilder.buildAnd(Src1Ty, Src1, SignBitMask).getReg(0);
} else if (Src0Size > Src1Size) {
auto ShiftAmt = MIRBuilder.buildConstant(Src0Ty, Src0Size - Src1Size);
auto Zext = MIRBuilder.buildZExt(Src0Ty, Src1);
auto Shift = MIRBuilder.buildShl(Src0Ty, Zext, ShiftAmt);
- auto And1 = MIRBuilder.buildAnd(Src0Ty, Shift, SignBitMask);
- Or = MIRBuilder.buildOr(Dst, And0, And1);
+ And1 = MIRBuilder.buildAnd(Src0Ty, Shift, SignBitMask).getReg(0);
} else {
auto ShiftAmt = MIRBuilder.buildConstant(Src1Ty, Src1Size - Src0Size);
auto Shift = MIRBuilder.buildLShr(Src1Ty, Src1, ShiftAmt);
auto Trunc = MIRBuilder.buildTrunc(Src0Ty, Shift);
- auto And1 = MIRBuilder.buildAnd(Src0Ty, Trunc, SignBitMask);
- Or = MIRBuilder.buildOr(Dst, And0, And1);
+ And1 = MIRBuilder.buildAnd(Src0Ty, Trunc, SignBitMask).getReg(0);
}
// Be careful about setting nsz/nnan/ninf on every instruction, since the
// constants are a nan and -0.0, but the final result should preserve
// everything.
- if (unsigned Flags = MI.getFlags())
- Or->setFlags(Flags);
+ unsigned Flags = MI.getFlags();
+ MIRBuilder.buildOr(Dst, And0, And1, Flags);
MI.eraseFromParent();
return Legalized;
More information about the llvm-commits
mailing list