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

llvm-svn: 331567
This commit is contained in:
Michael Berg 2018-05-04 23:41:15 +00:00
parent d177ab2a5f
commit 2dcf12ffd4
2 changed files with 38 additions and 13 deletions

View File

@ -824,9 +824,34 @@ EmitMachineNode(SDNode *Node, bool IsClone, bool IsCloned,
// Add result register values for things that are defined by this // Add result register values for things that are defined by this
// instruction. // instruction.
if (NumResults) if (NumResults) {
CreateVirtualRegisters(Node, MIB, II, IsClone, IsCloned, VRBaseMap); 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 // Emit all of the actual operands of this instruction, adding them to the
// instruction as appropriate. // instruction as appropriate.
bool HasOptPRefs = NumDefs > NumResults; bool HasOptPRefs = NumDefs > NumResults;

View File

@ -7,16 +7,16 @@ define float @foo(float %f) #0 {
; CHECK: body: ; CHECK: body:
; CHECK: %0:fr32 = COPY $xmm0 ; CHECK: %0:fr32 = COPY $xmm0
; CHECK: %1:fr32 = VRSQRTSSr killed %2, %0 ; 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: %4:fr32 = VMOVSSrm
; CHECK: %5:fr32 = VFMADD213SSr %1, killed %3, %4 ; CHECK: %5:fr32 = VFMADD213SSr %1, killed %3, %4
; CHECK: %6:fr32 = VMOVSSrm ; CHECK: %6:fr32 = VMOVSSrm
; CHECK: %7:fr32 = VMULSSrr %1, %6 ; CHECK: %7:fr32 = reassoc VMULSSrr %1, %6
; CHECK: %8:fr32 = VMULSSrr killed %7, killed %5 ; CHECK: %8:fr32 = reassoc VMULSSrr killed %7, killed %5
; CHECK: %9:fr32 = VMULSSrr %0, %8 ; CHECK: %9:fr32 = reassoc VMULSSrr %0, %8
; CHECK: %10:fr32 = VFMADD213SSr %8, %9, %4 ; CHECK: %10:fr32 = VFMADD213SSr %8, %9, %4
; CHECK: %11:fr32 = VMULSSrr %9, %6 ; CHECK: %11:fr32 = reassoc VMULSSrr %9, %6
; CHECK: %12:fr32 = VMULSSrr killed %11, killed %10 ; CHECK: %12:fr32 = reassoc VMULSSrr killed %11, killed %10
; CHECK: %14:fr32 = FsFLD0SS ; CHECK: %14:fr32 = FsFLD0SS
; CHECK: %15:fr32 = VCMPSSrr %0, killed %14, 0 ; CHECK: %15:fr32 = VCMPSSrr %0, killed %14, 0
; CHECK: %17:vr128 = VANDNPSrr killed %16, killed %13 ; CHECK: %17:vr128 = VANDNPSrr killed %16, killed %13
@ -31,16 +31,16 @@ define float @rfoo(float %f) #0 {
; CHECK: body: | ; CHECK: body: |
; CHECK: %0:fr32 = COPY $xmm0 ; CHECK: %0:fr32 = COPY $xmm0
; CHECK: %1:fr32 = VRSQRTSSr killed %2, %0 ; 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: %4:fr32 = VMOVSSrm
; CHECK: %5:fr32 = VFMADD213SSr %1, killed %3, %4 ; CHECK: %5:fr32 = VFMADD213SSr %1, killed %3, %4
; CHECK: %6:fr32 = VMOVSSrm ; CHECK: %6:fr32 = VMOVSSrm
; CHECK: %7:fr32 = VMULSSrr %1, %6 ; CHECK: %7:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr %1, %6
; CHECK: %8:fr32 = VMULSSrr killed %7, killed %5 ; CHECK: %8:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr killed %7, killed %5
; CHECK: %9:fr32 = VMULSSrr %0, %8 ; CHECK: %9:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr %0, %8
; CHECK: %10:fr32 = VFMADD213SSr %8, killed %9, %4 ; CHECK: %10:fr32 = VFMADD213SSr %8, killed %9, %4
; CHECK: %11:fr32 = VMULSSrr %8, %6 ; CHECK: %11:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr %8, %6
; CHECK: %12:fr32 = VMULSSrr killed %11, killed %10 ; CHECK: %12:fr32 = nnan ninf nsz arcp contract afn reassoc VMULSSrr killed %11, killed %10
; CHECK: $xmm0 = COPY %12 ; CHECK: $xmm0 = COPY %12
; CHECK: RET 0, $xmm0 ; CHECK: RET 0, $xmm0
%sqrt = tail call float @llvm.sqrt.f32(float %f) %sqrt = tail call float @llvm.sqrt.f32(float %f)