mirror of
https://github.com/intel/llvm.git
synced 2026-01-22 23:49:22 +08:00
[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. llvm-svn: 249370
This commit is contained in:
@@ -1078,6 +1078,13 @@ int X86TTIImpl::getIntImmCost(unsigned Opcode, unsigned Idx, const APInt &Imm,
|
||||
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 Opcode, unsigned Idx, const APInt &Imm,
|
||||
case Instruction::SDiv:
|
||||
case Instruction::URem:
|
||||
case Instruction::SRem:
|
||||
case Instruction::And:
|
||||
case Instruction::Or:
|
||||
case Instruction::Xor:
|
||||
case Instruction::ICmp:
|
||||
|
||||
19
llvm/test/CodeGen/X86/constant-hoisting-and.ll
Normal file
19
llvm/test/CodeGen/X86/constant-hoisting-and.ll
Normal file
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user