[llvm] r249370 - [X86] Teach constant hoisting that ANDs with 64-bit immediates in the range 0x80000000-0xffffffff can be handled cheaply and don't need to be hoisted.
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 5 19:50:25 PDT 2015
Author: ctopper
Date: Mon Oct 5 21:50:24 2015
New Revision: 249370
URL: http://llvm.org/viewvc/llvm-project?rev=249370&view=rev
Log:
[X86] Teach constant hoisting that ANDs with 64-bit immediates in the range 0x80000000-0xffffffff can be handled cheaply and don't need to be hoisted.
Most importantly, this keeps constant hoisting from preventing instruction selections ability to turn an AND with 0xffffffff into a move into a 32-bit subregister.
Added:
llvm/trunk/test/CodeGen/X86/constant-hoisting-and.ll
Modified:
llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp
Modified: llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp?rev=249370&r1=249369&r2=249370&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86TargetTransformInfo.cpp Mon Oct 5 21:50:24 2015
@@ -1078,6 +1078,13 @@ int X86TTIImpl::getIntImmCost(unsigned O
case Instruction::Store:
ImmIdx = 0;
break;
+ case Instruction::And:
+ // We support 64-bit ANDs with immediates with 32-bits of leading zeroes
+ // by using a 32-bit operation with implicit zero extension. Detect such
+ // immediates here as the normal path expects bit 31 to be sign extended.
+ if (Idx == 1 && Imm.getBitWidth() == 64 && isUInt<32>(Imm.getZExtValue()))
+ return TTI::TCC_Free;
+ // Fallthrough
case Instruction::Add:
case Instruction::Sub:
case Instruction::Mul:
@@ -1085,7 +1092,6 @@ int X86TTIImpl::getIntImmCost(unsigned O
case Instruction::SDiv:
case Instruction::URem:
case Instruction::SRem:
- case Instruction::And:
case Instruction::Or:
case Instruction::Xor:
case Instruction::ICmp:
Added: llvm/trunk/test/CodeGen/X86/constant-hoisting-and.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/constant-hoisting-and.ll?rev=249370&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/constant-hoisting-and.ll (added)
+++ llvm/trunk/test/CodeGen/X86/constant-hoisting-and.ll Mon Oct 5 21:50:24 2015
@@ -0,0 +1,19 @@
+; RUN: llc < %s -O3 -march=x86-64 |FileCheck %s
+define i64 @foo(i1 %z, i64 %data1, i64 %data2)
+{
+; If constant 4294967294 is hoisted to a variable, then we won't be able to use
+; the implicit zero extension of 32-bit operations to handle the AND.
+entry:
+ %val1 = and i64 %data1, 4294967294
+ br i1 %z, label %End, label %L_val2
+
+; CHECK: andl $-2, {{.*}}
+; CHECK: andl $-2, {{.*}}
+L_val2:
+ %val2 = and i64 %data2, 4294967294
+ br label %End
+
+End:
+ %p1 = phi i64 [%val1,%entry], [%val2,%L_val2]
+ ret i64 %p1
+}
More information about the llvm-commits
mailing list