diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2007-04-01 07:34:11 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2007-04-01 07:34:11 +0000 |
commit | 3a0843e73414c3eaf0c9f5eebf6959faef1253b3 (patch) | |
tree | ae72872b60366cfe653c935892f711499052df48 /llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | |
parent | a090ffb2ab6da8097d76979eed206568a65a02d0 (diff) | |
download | bcm5719-llvm-3a0843e73414c3eaf0c9f5eebf6959faef1253b3.tar.gz bcm5719-llvm-3a0843e73414c3eaf0c9f5eebf6959faef1253b3.zip |
For PR1297:
Adjust for changes in the bit counting intrinsics. They all return i32
now so we have to trunc/zext the DAG node accordingly.
llvm-svn: 35546
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 55 |
1 files changed, 31 insertions, 24 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 2387e9b5d77..e29a476c813 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -2328,37 +2328,44 @@ SelectionDAGLowering::visitIntrinsicCall(CallInst &I, unsigned Intrinsic) { DAG.setRoot(Tmp.getValue(1)); return 0; } - case Intrinsic::bswap_i16: - case Intrinsic::bswap_i32: - case Intrinsic::bswap_i64: + case Intrinsic::bswap: setValue(&I, DAG.getNode(ISD::BSWAP, getValue(I.getOperand(1)).getValueType(), getValue(I.getOperand(1)))); return 0; - case Intrinsic::cttz_i8: - case Intrinsic::cttz_i16: - case Intrinsic::cttz_i32: - case Intrinsic::cttz_i64: - setValue(&I, DAG.getNode(ISD::CTTZ, - getValue(I.getOperand(1)).getValueType(), - getValue(I.getOperand(1)))); + case Intrinsic::cttz: { + SDOperand Arg = getValue(I.getOperand(1)); + MVT::ValueType Ty = Arg.getValueType(); + SDOperand result = DAG.getNode(ISD::CTTZ, Ty, Arg); + if (Ty < MVT::i32) + result = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, result); + else if (Ty > MVT::i32) + result = DAG.getNode(ISD::TRUNCATE, MVT::i32, result); + setValue(&I, result); return 0; - case Intrinsic::ctlz_i8: - case Intrinsic::ctlz_i16: - case Intrinsic::ctlz_i32: - case Intrinsic::ctlz_i64: - setValue(&I, DAG.getNode(ISD::CTLZ, - getValue(I.getOperand(1)).getValueType(), - getValue(I.getOperand(1)))); + } + case Intrinsic::ctlz: { + SDOperand Arg = getValue(I.getOperand(1)); + MVT::ValueType Ty = Arg.getValueType(); + SDOperand result = DAG.getNode(ISD::CTLZ, Ty, Arg); + if (Ty < MVT::i32) + result = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, result); + else if (Ty > MVT::i32) + result = DAG.getNode(ISD::TRUNCATE, MVT::i32, result); + setValue(&I, result); return 0; - case Intrinsic::ctpop_i8: - case Intrinsic::ctpop_i16: - case Intrinsic::ctpop_i32: - case Intrinsic::ctpop_i64: - setValue(&I, DAG.getNode(ISD::CTPOP, - getValue(I.getOperand(1)).getValueType(), - getValue(I.getOperand(1)))); + } + case Intrinsic::ctpop: { + SDOperand Arg = getValue(I.getOperand(1)); + MVT::ValueType Ty = Arg.getValueType(); + SDOperand result = DAG.getNode(ISD::CTPOP, Ty, Arg); + if (Ty < MVT::i32) + result = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, result); + else if (Ty > MVT::i32) + result = DAG.getNode(ISD::TRUNCATE, MVT::i32, result); + setValue(&I, result); return 0; + } case Intrinsic::stacksave: { SDOperand Op = getRoot(); SDOperand Tmp = DAG.getNode(ISD::STACKSAVE, |