summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2019-04-06 19:00:11 +0000
committerCraig Topper <craig.topper@intel.com>2019-04-06 19:00:11 +0000
commit399102b4647284fc49ad973c425cb4542193c592 (patch)
treeb2e4b92d622debd8d49028f236c5708d5f5bbe21
parentd0a53d491492d61c72b6c9b80774f08846f26192 (diff)
downloadbcm5719-llvm-399102b4647284fc49ad973c425cb4542193c592.tar.gz
bcm5719-llvm-399102b4647284fc49ad973c425cb4542193c592.zip
[X86] When converting (x << C1) AND C2 to (x AND (C2>>C1)) << C1 during isel, try using andl over andq by favoring 32-bit unsigned immediates.
llvm-svn: 357848
-rw-r--r--llvm/lib/Target/X86/X86ISelDAGToDAG.cpp19
-rw-r--r--llvm/test/CodeGen/X86/narrow-shl-cst.ll2
2 files changed, 14 insertions, 7 deletions
diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
index acd6e23a10c..fb48b087b41 100644
--- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
+++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
@@ -3586,16 +3586,23 @@ void X86DAGToDAGISel::Select(SDNode *Node) {
// Check the minimum bitwidth for the new constant.
// TODO: Using 16 and 8 bit operations is also possible for or32 & xor32.
auto CanShrinkImmediate = [&](int64_t &ShiftedVal) {
+ if (Opcode == ISD::AND) {
+ // AND32ri is the same as AND64ri32 with zext imm.
+ // Try this before sign extended immediates below.
+ ShiftedVal = (uint64_t)Val >> ShAmt;
+ if (NVT == MVT::i64 && !isUInt<32>(Val) && isUInt<32>(ShiftedVal))
+ return true;
+ }
ShiftedVal = Val >> ShAmt;
if ((!isInt<8>(Val) && isInt<8>(ShiftedVal)) ||
(!isInt<32>(Val) && isInt<32>(ShiftedVal)))
return true;
- // For 64-bit we can also try unsigned 32 bit immediates.
- // AND32ri is the same as AND64ri32 with zext imm.
- // MOV32ri+OR64r is cheaper than MOV64ri64+OR64rr
- ShiftedVal = (uint64_t)Val >> ShAmt;
- if (NVT == MVT::i64 && !isUInt<32>(Val) && isUInt<32>(ShiftedVal))
- return true;
+ if (Opcode != ISD::AND) {
+ // MOV32ri+OR64r/XOR64r is cheaper than MOV64ri64+OR64rr/XOR64rr
+ ShiftedVal = (uint64_t)Val >> ShAmt;
+ if (NVT == MVT::i64 && !isUInt<32>(Val) && isUInt<32>(ShiftedVal))
+ return true;
+ }
return false;
};
diff --git a/llvm/test/CodeGen/X86/narrow-shl-cst.ll b/llvm/test/CodeGen/X86/narrow-shl-cst.ll
index 3389ff731c9..0174803d449 100644
--- a/llvm/test/CodeGen/X86/narrow-shl-cst.ll
+++ b/llvm/test/CodeGen/X86/narrow-shl-cst.ll
@@ -66,7 +66,7 @@ define i64 @test6(i64 %x) nounwind {
; CHECK-LABEL: test6:
; CHECK: # %bb.0:
; CHECK-NEXT: movq %rdi, %rax
-; CHECK-NEXT: andq $-65536, %rax # imm = 0xFFFF0000
+; CHECK-NEXT: andl $-65536, %eax # imm = 0xFFFF0000
; CHECK-NEXT: shlq $32, %rax
; CHECK-NEXT: retq
%and = shl i64 %x, 32
OpenPOWER on IntegriCloud