Index: llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp @@ -824,9 +824,34 @@ // 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; Index: llvm/trunk/test/CodeGen/X86/sqrt-fastmath-mir.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/sqrt-fastmath-mir.ll +++ llvm/trunk/test/CodeGen/X86/sqrt-fastmath-mir.ll @@ -7,16 +7,16 @@ ; 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 @@ ; 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)