[llvm] ea7f14d - [DAG] SelectionDAG::GetDemandedBits - don't simplify opaque constants
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 28 06:47:19 PDT 2022
Author: Simon Pilgrim
Date: 2022-07-28T14:46:59+01:00
New Revision: ea7f14dad068b094d44648ca8bba3cd36b10d12a
URL: https://github.com/llvm/llvm-project/commit/ea7f14dad068b094d44648ca8bba3cd36b10d12a
DIFF: https://github.com/llvm/llvm-project/commit/ea7f14dad068b094d44648ca8bba3cd36b10d12a.diff
LOG: [DAG] SelectionDAG::GetDemandedBits - don't simplify opaque constants
I'm actually trying to get rid of GetDemandedBits - but while dismantling it I noticed that we were altering opaque constants. Fixing that causes a FP_TO_INT_SAT regression that should be addressed separately - I'll raise a bug.
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
llvm/test/CodeGen/X86/fpclamptosat.ll
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 893795c3deca..357ff271bc2a 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -2473,7 +2473,10 @@ SDValue SelectionDAG::GetDemandedBits(SDValue V, const APInt &DemandedBits) {
default:
return TLI->SimplifyMultipleUseDemandedBits(V, DemandedBits, *this);
case ISD::Constant: {
- const APInt &CVal = cast<ConstantSDNode>(V)->getAPIntValue();
+ auto *C = cast<ConstantSDNode>(V);
+ if (C->isOpaque())
+ break;
+ const APInt &CVal = C->getAPIntValue();
APInt NewVal = CVal & DemandedBits;
if (NewVal != CVal)
return getConstant(NewVal, SDLoc(V), V.getValueType());
diff --git a/llvm/test/CodeGen/X86/fpclamptosat.ll b/llvm/test/CodeGen/X86/fpclamptosat.ll
index 623779076312..ac6d9d359e5e 100644
--- a/llvm/test/CodeGen/X86/fpclamptosat.ll
+++ b/llvm/test/CodeGen/X86/fpclamptosat.ll
@@ -419,16 +419,27 @@ entry:
; i64 saturate
+; FIXME: Failure to recognise the i128 is in i64 bounds.
define i64 @stest_f64i64(double %x) {
; CHECK-LABEL: stest_f64i64:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: cvttsd2si %xmm0, %rax
-; CHECK-NEXT: ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; CHECK-NEXT: movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
-; CHECK-NEXT: cmovbeq %rax, %rcx
-; CHECK-NEXT: xorl %eax, %eax
-; CHECK-NEXT: ucomisd %xmm0, %xmm0
-; CHECK-NEXT: cmovnpq %rcx, %rax
+; CHECK-NEXT: pushq %rax
+; CHECK-NEXT: .cfi_def_cfa_offset 16
+; CHECK-NEXT: callq __fixdfti at PLT
+; CHECK-NEXT: xorl %ecx, %ecx
+; CHECK-NEXT: movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
+; CHECK-NEXT: cmpq %rsi, %rax
+; CHECK-NEXT: movq %rdx, %rdi
+; CHECK-NEXT: sbbq $0, %rdi
+; CHECK-NEXT: cmovlq %rdx, %rcx
+; CHECK-NEXT: cmovgeq %rsi, %rax
+; CHECK-NEXT: movabsq $-9223372036854775808, %rdx # imm = 0x8000000000000000
+; CHECK-NEXT: cmpq %rax, %rdx
+; CHECK-NEXT: movq $-1, %rsi
+; CHECK-NEXT: sbbq %rcx, %rsi
+; CHECK-NEXT: cmovgeq %rdx, %rax
+; CHECK-NEXT: popq %rcx
+; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
entry:
%conv = fptosi double %x to i128
@@ -489,16 +500,27 @@ entry:
ret i64 %conv6
}
+; FIXME: Failure to recognise the i128 is in i64 bounds.
define i64 @stest_f32i64(float %x) {
; CHECK-LABEL: stest_f32i64:
; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: cvttss2si %xmm0, %rax
-; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; CHECK-NEXT: movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
-; CHECK-NEXT: cmovbeq %rax, %rcx
-; CHECK-NEXT: xorl %eax, %eax
-; CHECK-NEXT: ucomiss %xmm0, %xmm0
-; CHECK-NEXT: cmovnpq %rcx, %rax
+; CHECK-NEXT: pushq %rax
+; CHECK-NEXT: .cfi_def_cfa_offset 16
+; CHECK-NEXT: callq __fixsfti at PLT
+; CHECK-NEXT: xorl %ecx, %ecx
+; CHECK-NEXT: movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
+; CHECK-NEXT: cmpq %rsi, %rax
+; CHECK-NEXT: movq %rdx, %rdi
+; CHECK-NEXT: sbbq $0, %rdi
+; CHECK-NEXT: cmovlq %rdx, %rcx
+; CHECK-NEXT: cmovgeq %rsi, %rax
+; CHECK-NEXT: movabsq $-9223372036854775808, %rdx # imm = 0x8000000000000000
+; CHECK-NEXT: cmpq %rax, %rdx
+; CHECK-NEXT: movq $-1, %rsi
+; CHECK-NEXT: sbbq %rcx, %rsi
+; CHECK-NEXT: cmovgeq %rdx, %rax
+; CHECK-NEXT: popq %rcx
+; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
entry:
%conv = fptosi float %x to i128
@@ -559,22 +581,25 @@ entry:
ret i64 %conv6
}
+; FIXME: Failure to recognise the i128 is in i64 bounds.
define i64 @stest_f16i64(half %x) {
; CHECK-LABEL: stest_f16i64:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: pushq %rax
; CHECK-NEXT: .cfi_def_cfa_offset 16
-; CHECK-NEXT: callq __extendhfsf2 at PLT
-; CHECK-NEXT: cvttss2si %xmm0, %rax
-; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; CHECK-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
-; CHECK-NEXT: cmovaeq %rax, %rcx
-; CHECK-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; CHECK-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
-; CHECK-NEXT: cmovbeq %rcx, %rdx
-; CHECK-NEXT: xorl %eax, %eax
-; CHECK-NEXT: ucomiss %xmm0, %xmm0
-; CHECK-NEXT: cmovnpq %rdx, %rax
+; CHECK-NEXT: callq __fixhfti at PLT
+; CHECK-NEXT: xorl %ecx, %ecx
+; CHECK-NEXT: movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
+; CHECK-NEXT: cmpq %rsi, %rax
+; CHECK-NEXT: movq %rdx, %rdi
+; CHECK-NEXT: sbbq $0, %rdi
+; CHECK-NEXT: cmovlq %rdx, %rcx
+; CHECK-NEXT: cmovgeq %rsi, %rax
+; CHECK-NEXT: movabsq $-9223372036854775808, %rdx # imm = 0x8000000000000000
+; CHECK-NEXT: cmpq %rax, %rdx
+; CHECK-NEXT: movq $-1, %rsi
+; CHECK-NEXT: sbbq %rcx, %rsi
+; CHECK-NEXT: cmovgeq %rdx, %rax
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
More information about the llvm-commits
mailing list