[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp PPC32ISelPattern.cpp
Chris Lattner
sabre at nondot.org
Thu Aug 18 11:04:41 PDT 2005
I emailed Jim about this before, but won't this miscompile 65535 -> -1?
-Chris
On Thu, 18 Aug 2005, Nate Begeman wrote:
>
>
> Changes in directory llvm/lib/Target/PowerPC:
>
> PPC32ISelDAGToDAG.cpp updated: 1.8 -> 1.9
> PPC32ISelPattern.cpp updated: 1.151 -> 1.152
> ---
> Log message:
>
> Improve ISD::Constant codegen.
> Now for int foo() { return -1; } we generate:
> _foo:
> li r3, -1
> blr
>
> instead of
> _foo:
> lis r2, -1
> ori r3, r2, 65535
> blr
>
>
> ---
> Diffs of the changes: (+12 -8)
>
> PPC32ISelDAGToDAG.cpp | 18 +++++++++++-------
> PPC32ISelPattern.cpp | 2 +-
> 2 files changed, 12 insertions(+), 8 deletions(-)
>
>
> Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp
> diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.8 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.9
> --- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.8 Thu Aug 18 02:30:46 2005
> +++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp Thu Aug 18 13:01:39 2005
> @@ -277,15 +277,18 @@
> case ISD::Constant: {
> assert(N->getValueType(0) == MVT::i32);
> unsigned v = (unsigned)cast<ConstantSDNode>(N)->getValue();
> - if ((unsigned)(short)v == v) {
> + unsigned Hi = HA16(v);
> + unsigned Lo = Lo16(v);
> + if (Hi && Lo) {
> + SDOperand Top = CurDAG->getTargetNode(PPC::LIS, MVT::i32,
> + getI32Imm(v >> 16));
> + CurDAG->SelectNodeTo(N, MVT::i32, PPC::ORI, Top, getI32Imm(v & 0xFFFF));
> + } else if (Lo) {
> CurDAG->SelectNodeTo(N, MVT::i32, PPC::LI, getI32Imm(v));
> - break;
> } else {
> - SDOperand Top = CurDAG->getTargetNode(PPC::LIS, MVT::i32,
> - getI32Imm(unsigned(v) >> 16));
> - CurDAG->SelectNodeTo(N, MVT::i32, PPC::ORI, Top, getI32Imm(v & 0xFFFF));
> - break;
> + CurDAG->SelectNodeTo(N, MVT::i32, PPC::LIS, getI32Imm(v >> 16));
> }
> + break;
> }
> case ISD::SIGN_EXTEND_INREG:
> switch(cast<VTSDNode>(N->getOperand(1))->getVT()) {
> @@ -412,12 +415,13 @@
> Select(N->getOperand(1)));
> break;
> case ISD::AND: {
> - unsigned Imm, SH, MB, ME;
> + unsigned Imm;
> // If this is an and of a value rotated between 0 and 31 bits and then and'd
> // with a mask, emit rlwinm
> if (isIntImmediate(N->getOperand(1), Imm) && (isShiftedMask_32(Imm) ||
> isShiftedMask_32(~Imm))) {
> SDOperand Val;
> + unsigned SH, MB, ME;
> if (isRotateAndMask(N->getOperand(0).Val, Imm, false, SH, MB, ME)) {
> Val = Select(N->getOperand(0).getOperand(0));
> } else {
>
>
> Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp
> diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.151 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.152
> --- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.151 Thu Aug 18 12:16:52 2005
> +++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp Thu Aug 18 13:01:39 2005
> @@ -1736,7 +1736,7 @@
> assert(N.getValueType() == MVT::i32 &&
> "Only i32 constants are legal on this target!");
> int v = (int)cast<ConstantSDNode>(N)->getValue();
> - unsigned Hi = Hi16(v);
> + unsigned Hi = HA16(v);
> unsigned Lo = Lo16(v);
> if (Hi && Lo) {
> Tmp1 = MakeIntReg();
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-Chris
--
http://nondot.org/sabre/
http://llvm.org/
More information about the llvm-commits
mailing list