[PATCH] D23677: [AArch64] Avoid materializing -1 values when generating csinv instructions.
Chad Rosier via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 18 13:08:46 PDT 2016
mcrosier retitled this revision from "[AArch64] Reuse register with known value when generating csneg and csinv instructions." to "[AArch64] Avoid materializing -1 values when generating csinv instructions.".
mcrosier updated the summary for this revision.
mcrosier updated this revision to Diff 68597.
https://reviews.llvm.org/D23677
Files:
lib/Target/AArch64/AArch64ISelLowering.cpp
test/CodeGen/AArch64/arm64-csel.ll
Index: test/CodeGen/AArch64/arm64-csel.ll
===================================================================
--- test/CodeGen/AArch64/arm64-csel.ll
+++ test/CodeGen/AArch64/arm64-csel.ll
@@ -228,3 +228,37 @@
%inc.c = add i64 %inc, %c
ret i64 %inc.c
}
+
+; PR28965
+define i32 @foo20(i32 %x) {
+entry:
+; CHECK-LABEL: foo20:
+; CHECK: cmp w[[REG:[0-9]+]], #1
+; CHECK-NOT: orr w{{[0-9]+}}, wzr, #0x1
+; CHECK: csinv w0, w[[REG]], wzr, eq
+ %cmp = icmp eq i32 %x, 1
+ %res = select i1 %cmp, i32 1, i32 -1
+ ret i32 %res
+}
+
+define i64 @foo21(i64 %x) {
+entry:
+; CHECK-LABEL: foo21:
+; CHECK: cmp x[[REG:[0-9]+]], #1
+; CHECK-NOT: orr w{{[0-9]+}}, wzr, #0x1
+; CHECK: csinv x0, x[[REG]], xzr, eq
+ %cmp = icmp eq i64 %x, 1
+ %res = select i1 %cmp, i64 1, i64 -1
+ ret i64 %res
+}
+
+define i64 @foo22(i64 %x) {
+entry:
+; CHECK-LABEL: foo22:
+; CHECK: cmp x[[REG:[0-9]+]], #3
+; CHECK-NOT: orr w{{[0-9]+}}, wzr, #0x3
+; CHECK: csinv x0, x[[REG]], xzr, eq
+ %cmp = icmp eq i64 %x, 3
+ %res = select i1 %cmp, i64 3, i64 -1
+ ret i64 %res
+}
Index: lib/Target/AArch64/AArch64ISelLowering.cpp
===================================================================
--- lib/Target/AArch64/AArch64ISelLowering.cpp
+++ lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -3988,13 +3988,25 @@
} else if (CTVal && CFVal) {
const int64_t TrueVal = CTVal->getSExtValue();
const int64_t FalseVal = CFVal->getSExtValue();
+ ConstantSDNode *RHSVal = dyn_cast<ConstantSDNode>(RHS);
bool Swap = false;
+ bool KeepFVal = false;
// If both TVal and FVal are constants, see if FVal is the
// inverse/negation/increment of TVal and generate a CSINV/CSNEG/CSINC
// instead of a CSEL in that case.
if (TrueVal == ~FalseVal) {
Opcode = AArch64ISD::CSINV;
+ } else if (CFVal->isAllOnesValue() && RHSVal == CTVal &&
+ changeIntCCToAArch64CC(CC) == AArch64CC::EQ) {
+ // If FVal is -1, we can use a CSINV to invert wzr/xzr to avoid
+ // materializing the -1. We can also avoid materializing TVal, if TVal
+ // matches RHS and we're doing an equality comparison as we know LHS
+ // will contain TVal if the equality is true.
+ Opcode = AArch64ISD::CSINV;
+ TVal = LHS;
+ FVal = DAG.getConstant(0, dl, FVal.getValueType());
+ KeepFVal = true;
} else if (TrueVal == -FalseVal) {
Opcode = AArch64ISD::CSNEG;
} else if (TVal.getValueType() == MVT::i32) {
@@ -4029,7 +4041,7 @@
CC = ISD::getSetCCInverse(CC, true);
}
- if (Opcode != AArch64ISD::CSEL) {
+ if (Opcode != AArch64ISD::CSEL && !KeepFVal) {
// Drop FVal since we can get its value by simply inverting/negating
// TVal.
FVal = TVal;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23677.68597.patch
Type: text/x-patch
Size: 2799 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160818/306c122d/attachment.bin>
More information about the llvm-commits
mailing list