[PATCH] D56016: [MSP430] Optimize 'shl x, 8[+ N] -> swpb(zext(x)) [<< N]' for i16
Anton Korobeynikov via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 9 05:06:40 PST 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rL350712: [MSP430] Optimize 'shl x, 8[+ N] -> swpb(zext(x)) [<< N]' for i16 (authored by asl, committed by ).
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D56016/new/
https://reviews.llvm.org/D56016
Files:
llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp
llvm/trunk/test/CodeGen/MSP430/shifts.ll
Index: llvm/trunk/test/CodeGen/MSP430/shifts.ll
===================================================================
--- llvm/trunk/test/CodeGen/MSP430/shifts.ll
+++ llvm/trunk/test/CodeGen/MSP430/shifts.ll
@@ -74,3 +74,14 @@
%shr = lshr i16 %a, 10
ret i16 %shr
}
+
+define i16 @lshl10_i16(i16 %a) #0 {
+entry:
+; CHECK-LABEL: lshl10_i16:
+; CHECK: mov.b r12, r12
+; CHECK-NEXT: swpb r12
+; CHECK-NEXT: add r12, r12
+; CHECK-NEXT: add r12, r12
+ %shl = shl i16 %a, 10
+ ret i16 %shl
+}
Index: llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp
===================================================================
--- llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp
+++ llvm/trunk/lib/Target/MSP430/MSP430ISelLowering.cpp
@@ -954,15 +954,26 @@
// Expand the stuff into sequence of shifts.
SDValue Victim = N->getOperand(0);
- if ((Opc == ISD::SRA || Opc == ISD::SRL) && ShiftAmount >= 8) {
- // foo >> (8 + N) => sxt(swpb(foo)) >> N
+ if (ShiftAmount >= 8) {
assert(VT == MVT::i16 && "Can not shift i8 by 8 and more");
- Victim = DAG.getNode(ISD::BSWAP, dl, VT, Victim);
- if (Opc == ISD::SRA)
- Victim = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, VT, Victim,
- DAG.getValueType(MVT::i8));
- else
+ switch(Opc) {
+ default:
+ llvm_unreachable("Unknown shift");
+ case ISD::SHL:
+ // foo << (8 + N) => swpb(zext(foo)) << N
Victim = DAG.getZeroExtendInReg(Victim, dl, MVT::i8);
+ Victim = DAG.getNode(ISD::BSWAP, dl, VT, Victim);
+ break;
+ case ISD::SRA:
+ case ISD::SRL:
+ // foo >> (8 + N) => sxt(swpb(foo)) >> N
+ Victim = DAG.getNode(ISD::BSWAP, dl, VT, Victim);
+ Victim = (Opc == ISD::SRA)
+ ? DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, VT, Victim,
+ DAG.getValueType(MVT::i8))
+ : DAG.getZeroExtendInReg(Victim, dl, MVT::i8);
+ break;
+ }
ShiftAmount -= 8;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D56016.180820.patch
Type: text/x-patch
Size: 1976 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190109/7c04c7aa/attachment.bin>
More information about the llvm-commits
mailing list