diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2012-07-12 18:14:57 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2012-07-12 18:14:57 +0000 |
commit | feae00a68e819e661ff6fddd15be703670247c10 (patch) | |
tree | cab546b1b03848f0ea7143a526b146ebf60ac397 /lib | |
parent | fc3f0b5c910cd60bb2d7cf6a882fd60e456df723 (diff) |
Give the rdrand instructions a SideEffect flag and a chain so MachineCSE and MachineLICM don't touch it.
I already had the necessary things in place for IR-level passes but missed the machine passes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160137 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/X86/X86ISelLowering.cpp | 6 | ||||
-rw-r--r-- | lib/Target/X86/X86InstrInfo.td | 3 |
2 files changed, 5 insertions, 4 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index c242aaa3da..19cf5bf75a 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -9823,8 +9823,8 @@ X86TargetLowering::LowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const { case Intrinsic::x86_rdrand_32: case Intrinsic::x86_rdrand_64: { // Emit the node with the right value type. - SDValue Result = DAG.getNode(X86ISD::RDRAND, dl, - DAG.getVTList(Op->getValueType(0), MVT::Glue)); + SDVTList VTs = DAG.getVTList(Op->getValueType(0), MVT::Glue, MVT::Other); + SDValue Result = DAG.getNode(X86ISD::RDRAND, dl, VTs, Op.getOperand(0)); // If the value returned by RDRAND was valid (CF=1), return 1. Otherwise // return the value from Rand, which is always 0, casted to i32. @@ -9838,7 +9838,7 @@ X86TargetLowering::LowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const { // Return { result, isValid, chain }. return DAG.getNode(ISD::MERGE_VALUES, dl, Op->getVTList(), Result, isValid, - Op.getOperand(0)); + SDValue(Result.getNode(), 2)); } } } diff --git a/lib/Target/X86/X86InstrInfo.td b/lib/Target/X86/X86InstrInfo.td index dc26d4c1dc..2c4e393556 100644 --- a/lib/Target/X86/X86InstrInfo.td +++ b/lib/Target/X86/X86InstrInfo.td @@ -139,7 +139,8 @@ def X86setcc_c : SDNode<"X86ISD::SETCC_CARRY", SDTX86SetCC_C>; def X86sahf : SDNode<"X86ISD::SAHF", SDTX86sahf>; -def X86rdrand : SDNode<"X86ISD::RDRAND", SDTX86rdrand>; +def X86rdrand : SDNode<"X86ISD::RDRAND", SDTX86rdrand, + [SDNPHasChain, SDNPSideEffect]>; def X86cas : SDNode<"X86ISD::LCMPXCHG_DAG", SDTX86cas, [SDNPHasChain, SDNPInGlue, SDNPOutGlue, SDNPMayStore, |