[PATCH] D42986: [TargetLowering] try to create -1 constant operand for math ops via demanded bits
Sanjay Patel via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Feb 6 14:24:45 PST 2018
spatel created this revision.
spatel added reviewers: craig.topper, efriedma, RKSimon.
Herald added subscribers: javed.absar, mcrosier.
This reverses instcombine's demanded bits' transform which always tries to clear bits in constants.
As noted in PR35792 and shown in the test diffs:
https://bugs.llvm.org/show_bug.cgi?id=35792
...we can do better in codegen by trying to form -1. The x86 sub test shows a missed opportunity. We also don't get the shift case from the bug report, but I thought it'd be best to post this as-is to make sure it looks ok.
I did investigate changing instcombine's behavior, but it would be more work to change canonicalization in IR. Clearing bits / shrinking constants can allow killing instructions, so we'd have to figure out how to not regress those cases.
https://reviews.llvm.org/D42986
Files:
lib/CodeGen/SelectionDAG/TargetLowering.cpp
test/CodeGen/AArch64/sub1.ll
test/CodeGen/X86/bmi.ll
test/CodeGen/X86/zext-demanded.ll
Index: test/CodeGen/X86/zext-demanded.ll
===================================================================
--- test/CodeGen/X86/zext-demanded.ll
+++ test/CodeGen/X86/zext-demanded.ll
@@ -101,7 +101,7 @@
define i64 @add_neg_one(i64 %x) {
; CHECK-LABEL: add_neg_one:
; CHECK: # %bb.0:
-; CHECK-NEXT: leal 65535(%rdi), %eax
+; CHECK-NEXT: leal -1(%rdi), %eax
; CHECK-NEXT: andl %edi, %eax
; CHECK-NEXT: movzwl %ax, %eax
; CHECK-NEXT: retq
@@ -128,8 +128,7 @@
; CHECK-LABEL: mul_neg_one:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
-; CHECK-NEXT: shll $16, %eax
-; CHECK-NEXT: subl %edi, %eax
+; CHECK-NEXT: negl %eax
; CHECK-NEXT: andl %edi, %eax
; CHECK-NEXT: movzwl %ax, %eax
; CHECK-NEXT: retq
Index: test/CodeGen/X86/bmi.ll
===================================================================
--- test/CodeGen/X86/bmi.ll
+++ test/CodeGen/X86/bmi.ll
@@ -813,8 +813,7 @@
define i64 @blsr_disguised_constant(i64 %x) {
; CHECK-LABEL: blsr_disguised_constant:
; CHECK: # %bb.0:
-; CHECK-NEXT: leal 65535(%rdi), %eax
-; CHECK-NEXT: andl %edi, %eax
+; CHECK-NEXT: blsrl %edi, %eax
; CHECK-NEXT: movzwl %ax, %eax
; CHECK-NEXT: retq
%a1 = and i64 %x, 65535
Index: test/CodeGen/AArch64/sub1.ll
===================================================================
--- test/CodeGen/AArch64/sub1.ll
+++ test/CodeGen/AArch64/sub1.ll
@@ -4,8 +4,7 @@
define i64 @sub1_disguised_constant(i64 %x) {
; CHECK-LABEL: sub1_disguised_constant:
; CHECK: // %bb.0:
-; CHECK-NEXT: orr w8, wzr, #0xffff
-; CHECK-NEXT: add w8, w0, w8
+; CHECK-NEXT: sub w8, w0, #1 // =1
; CHECK-NEXT: and w8, w0, w8
; CHECK-NEXT: and x0, x8, #0xffff
; CHECK-NEXT: ret
Index: lib/CodeGen/SelectionDAG/TargetLowering.cpp
===================================================================
--- lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -1232,6 +1232,21 @@
}
return true;
}
+
+ // If we have a constant operand, we may be able to turn it into -1 if we
+ // do not demand the high bits. This can make the constant smaller to
+ // encode, allow more general folding, or match specialized instruction
+ // patterns (eg, 'blsr' on x86). Don't bother changing 1 to -1 because that
+ // is probably not useful (and could be detrimental).
+ ConstantSDNode *C = isConstOrConstSplat(Op1);
+ APInt HighMask = APInt::getHighBitsSet(NewMask.getBitWidth(), NewMaskLZ);
+ if (C && !C->isAllOnesValue() && !C->isOne() &&
+ (C->getAPIntValue() | HighMask).isAllOnesValue()) {
+ SDValue Neg1 = TLO.DAG.getAllOnesConstant(dl, VT);
+ SDValue NewMath = TLO.DAG.getNode(Op.getOpcode(), dl, VT, Op0, Neg1);
+ return TLO.CombineTo(Op, NewMath);
+ }
+
LLVM_FALLTHROUGH;
}
default:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D42986.133079.patch
Type: text/x-patch
Size: 2864 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180206/0df6029c/attachment.bin>
More information about the llvm-commits
mailing list