[llvm] r331567 - Mapping SDNode flags to MachineInstr flags
Michael Berg via llvm-commits
llvm-commits at lists.llvm.org
Fri May 4 16:41:15 PDT 2018
Author: mcberg2017
Date: Fri May 4 16:41:15 2018
New Revision: 331567
URL: http://llvm.org/viewvc/llvm-project?rev=331567&view=rev
Log:
Mapping SDNode flags to MachineInstr flags
Summary: Providing the glue to map SDNode fast math sub flags to MachineInstr fast math sub flags.
Reviewers: spatel, arsenm, wristow
Reviewed By: spatel
Subscribers: wdng
Differential Revision: https://reviews.llvm.org/D46447
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
llvm/trunk/test/CodeGen/X86/sqrt-fastmath-mir.ll
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp?rev=331567&r1=331566&r2=331567&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp Fri May 4 16:41:15 2018
@@ -824,9 +824,34 @@ EmitMachineNode(SDNode *Node, bool IsClo
// Add result register values for things that are defined by this
// instruction.
- if (NumResults)
+ if (NumResults) {
CreateVirtualRegisters(Node, MIB, II, IsClone, IsCloned, VRBaseMap);
+ // Transfer any IR flags from the SDNode to the MachineInstr
+ MachineInstr *MI = MIB.getInstr();
+ const SDNodeFlags Flags = Node->getFlags();
+ if (Flags.hasNoSignedZeros())
+ MI->setFlag(MachineInstr::MIFlag::FmNsz);
+
+ if (Flags.hasAllowReciprocal())
+ MI->setFlag(MachineInstr::MIFlag::FmArcp);
+
+ if (Flags.hasNoNaNs())
+ MI->setFlag(MachineInstr::MIFlag::FmNoNans);
+
+ if (Flags.hasNoInfs())
+ MI->setFlag(MachineInstr::MIFlag::FmNoInfs);
+
+ if (Flags.hasAllowContract())
+ MI->setFlag(MachineInstr::MIFlag::FmContract);
+
+ if (Flags.hasApproximateFuncs())
+ MI->setFlag(MachineInstr::MIFlag::FmAfn);
+
+ if (Flags.hasAllowReassociation())
+ MI->setFlag(MachineInstr::MIFlag::FmReassoc);
+ }
+
// Emit all of the actual operands of this instruction, adding them to the
// instruction as appropriate.
bool HasOptPRefs = NumDefs > NumResults;
Modified: llvm/trunk/test/CodeGen/X86/sqrt-fastmath-mir.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/sqrt-fastmath-mir.ll?rev=331567&r1=331566&r2=331567&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/sqrt-fastmath-mir.ll (original)
+++ llvm/trunk/test/CodeGen/X86/sqrt-fastmath-mir.ll Fri May 4 16:41:15 2018
@@ -7,16 +7,16 @@ define float @foo(float %f) #0 {
; CHECK: body:
; CHECK: %0:fr32 = COPY $xmm0
; CHECK: %1:fr32 = VRSQRTSSr killed %2, %0
-; CHECK: %3:fr32 = VMULSSrr %0, %1
+; CHECK: %3:fr32 = reassoc VMULSSrr %0, %1
; CHECK: %4:fr32 = VMOVSSrm
; CHECK: %5:fr32 = VFMADD213SSr %1, killed %3, %4
; CHECK: %6:fr32 = VMOVSSrm
-; CHECK: %7:fr32 = VMULSSrr %1, %6
-; CHECK: %8:fr32 = VMULSSrr killed %7, killed %5
-; CHECK: %9:fr32 = VMULSSrr %0, %8
+; CHECK: %7:fr32 = reassoc VMULSSrr %1, %6
+; CHECK: %8:fr32 = reassoc VMULSSrr killed %7, killed %5
+; CHECK: %9:fr32 = reassoc VMULSSrr %0, %8
; CHECK: %10:fr32 = VFMADD213SSr %8, %9, %4
-; CHECK: %11:fr32 = VMULSSrr %9, %6
-; CHECK: %12:fr32 = VMULSSrr killed %11, killed %10
+; CHECK: %11:fr32 = reassoc VMULSSrr %9, %6
+; CHECK: %12:fr32 = reassoc VMULSSrr killed %11, killed %10
; CHECK: %14:fr32 = FsFLD0SS
; CHECK: %15:fr32 = VCMPSSrr %0, killed %14, 0
; CHECK: %17:vr128 = VANDNPSrr killed %16, killed %13
@@ -31,16 +31,16 @@ define float @rfoo(float %f) #0 {
; CHECK: body: |
; CHECK: %0:fr32 = COPY $xmm0
; CHECK: %1:fr32 = VRSQRTSSr killed %2, %0
-; CHECK: %3:fr32 = VMULSSrr %0, %1
+; CHECK: %3:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr %0, %1
; CHECK: %4:fr32 = VMOVSSrm
; CHECK: %5:fr32 = VFMADD213SSr %1, killed %3, %4
; CHECK: %6:fr32 = VMOVSSrm
-; CHECK: %7:fr32 = VMULSSrr %1, %6
-; CHECK: %8:fr32 = VMULSSrr killed %7, killed %5
-; CHECK: %9:fr32 = VMULSSrr %0, %8
+; CHECK: %7:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr %1, %6
+; CHECK: %8:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr killed %7, killed %5
+; CHECK: %9:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr %0, %8
; CHECK: %10:fr32 = VFMADD213SSr %8, killed %9, %4
-; CHECK: %11:fr32 = VMULSSrr %8, %6
-; CHECK: %12:fr32 = VMULSSrr killed %11, killed %10
+; CHECK: %11:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr %8, %6
+; CHECK: %12:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr killed %11, killed %10
; CHECK: $xmm0 = COPY %12
; CHECK: RET 0, $xmm0
%sqrt = tail call float @llvm.sqrt.f32(float %f)
More information about the llvm-commits
mailing list