Index: llvm/trunk/lib/Target/X86/X86InstrFPStack.td =================================================================== --- llvm/trunk/lib/Target/X86/X86InstrFPStack.td +++ llvm/trunk/lib/Target/X86/X86InstrFPStack.td @@ -667,10 +667,10 @@ } // Defs = [FPSW] } // SchedRW -// Operandless floating-point instructions for the disassembler. -let SchedRW = [WriteMicrocoded] in { -def FNOP : I<0xD9, MRM_D0, (outs), (ins), "fnop", [], IIC_FNOP>; +// Operand-less floating-point instructions for the disassembler. +def FNOP : I<0xD9, MRM_D0, (outs), (ins), "fnop", [], IIC_FNOP>, Sched<[WriteNop]>; +let SchedRW = [WriteMicrocoded] in { let Defs = [FPSW] in { def WAIT : I<0x9B, RawFrm, (outs), (ins), "wait", [], IIC_WAIT>; def FXAM : I<0xD9, MRM_E5, (outs), (ins), "fxam", [], IIC_FXAM>; Index: llvm/trunk/lib/Target/X86/X86InstrInfo.td =================================================================== --- llvm/trunk/lib/Target/X86/X86InstrInfo.td +++ llvm/trunk/lib/Target/X86/X86InstrInfo.td @@ -1133,7 +1133,7 @@ // // Nop -let hasSideEffects = 0, SchedRW = [WriteZero] in { +let hasSideEffects = 0, SchedRW = [WriteNop] in { def NOOP : I<0x90, RawFrm, (outs), (ins), "nop", [], IIC_NOP>; def NOOPW : I<0x1f, MRMXm, (outs), (ins i16mem:$zero), "nop{w}\t$zero", [], IIC_NOP>, TB, OpSize16; Index: llvm/trunk/lib/Target/X86/X86ScheduleBtVer2.td =================================================================== --- llvm/trunk/lib/Target/X86/X86ScheduleBtVer2.td +++ llvm/trunk/lib/Target/X86/X86ScheduleBtVer2.td @@ -286,7 +286,9 @@ def : WriteRes { let Latency = 100; } def : WriteRes { let Latency = 100; } def : WriteRes; -def : WriteRes; +// Nops don't have dependencies, so there's no actual latency, but we set this +// to '1' to tell the scheduler that the nop uses an ALU slot for a cycle. +def : WriteRes { let Latency = 1; } //////////////////////////////////////////////////////////////////////////////// // Floating point. This covers both scalar and vector operations. Index: llvm/trunk/test/CodeGen/X86/schedule-x86_64.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/schedule-x86_64.ll +++ llvm/trunk/test/CodeGen/X86/schedule-x86_64.ll @@ -8389,13 +8389,13 @@ ; BTVER2-LABEL: test_nop: ; BTVER2: # %bb.0: ; BTVER2-NEXT: #APP -; BTVER2-NEXT: nop # sched: [1:?] -; BTVER2-NEXT: nopw %di # sched: [1:?] -; BTVER2-NEXT: nopw (%rcx) # sched: [1:?] -; BTVER2-NEXT: nopl %esi # sched: [1:?] -; BTVER2-NEXT: nopl (%r8) # sched: [1:?] -; BTVER2-NEXT: nopq %rdx # sched: [1:?] -; BTVER2-NEXT: nopq (%r9) # sched: [1:?] +; BTVER2-NEXT: nop # sched: [1:0.50] +; BTVER2-NEXT: nopw %di # sched: [1:0.50] +; BTVER2-NEXT: nopw (%rcx) # sched: [1:0.50] +; BTVER2-NEXT: nopl %esi # sched: [1:0.50] +; BTVER2-NEXT: nopl (%r8) # sched: [1:0.50] +; BTVER2-NEXT: nopq %rdx # sched: [1:0.50] +; BTVER2-NEXT: nopq (%r9) # sched: [1:0.50] ; BTVER2-NEXT: #NO_APP ; BTVER2-NEXT: retq # sched: [4:1.00] ; @@ -9500,7 +9500,7 @@ ; BTVER2-LABEL: test_pause: ; BTVER2: # %bb.0: ; BTVER2-NEXT: #APP -; BTVER2-NEXT: pause # sched: [1:?] +; BTVER2-NEXT: pause # sched: [1:0.50] ; BTVER2-NEXT: #NO_APP ; BTVER2-NEXT: retq # sched: [4:1.00] ; Index: llvm/trunk/test/CodeGen/X86/sse-schedule.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/sse-schedule.ll +++ llvm/trunk/test/CodeGen/X86/sse-schedule.ll @@ -3763,7 +3763,7 @@ ret <4 x float> %7 } -; 'WriteZero' class instructions. +; 'WriteZero' and 'WriteNop' class instructions. define <4 x float> @test_fnop() nounwind { ; GENERIC-LABEL: test_fnop: @@ -3840,7 +3840,7 @@ ; BTVER2: # %bb.0: ; BTVER2-NEXT: vxorps %xmm0, %xmm0, %xmm0 # sched: [1:0.50] ; BTVER2-NEXT: #APP -; BTVER2-NEXT: nop # sched: [1:?] +; BTVER2-NEXT: nop # sched: [1:0.50] ; BTVER2-NEXT: #NO_APP ; BTVER2-NEXT: retq # sched: [4:1.00] ; Index: llvm/trunk/test/CodeGen/X86/x87-schedule.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/x87-schedule.ll +++ llvm/trunk/test/CodeGen/X86/x87-schedule.ll @@ -3209,7 +3209,7 @@ ; SLM-LABEL: test_fnop: ; SLM: # %bb.0: ; SLM-NEXT: #APP -; SLM-NEXT: fnop # sched: [100:1.00] +; SLM-NEXT: fnop # sched: [1:?] ; SLM-NEXT: #NO_APP ; SLM-NEXT: retl # sched: [4:1.00] ; @@ -3251,7 +3251,7 @@ ; BTVER2-LABEL: test_fnop: ; BTVER2: # %bb.0: ; BTVER2-NEXT: #APP -; BTVER2-NEXT: fnop # sched: [100:0.50] +; BTVER2-NEXT: fnop # sched: [1:0.50] ; BTVER2-NEXT: #NO_APP ; BTVER2-NEXT: retl # sched: [4:1.00] ;