Skip to content

Commit 0954c67

Browse files
committed
[DAG] visitFREEZE - only fold integer types to an all ones constant
ISD::isBuildVectorAllOnes can peek through bitcasts, so this can match against FP NAN (ish) data (e.g. double (bitcast i64 -1)) under certain circumstances - bail if the type isn't an integer and let bitcast folding handle it first. Fixes #120093
1 parent 290f38c commit 0954c67

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16096,7 +16096,7 @@ SDValue DAGCombiner::visitFREEZE(SDNode *N) {
1609616096
if (N0.getOpcode() == ISD::BUILD_VECTOR) {
1609716097
SDLoc DL(N0);
1609816098
EVT VT = N0.getValueType();
16099-
if (llvm::ISD::isBuildVectorAllOnes(N0.getNode()))
16099+
if (llvm::ISD::isBuildVectorAllOnes(N0.getNode()) && VT.isInteger())
1610016100
return DAG.getAllOnesConstant(DL, VT);
1610116101
if (llvm::ISD::isBuildVectorOfConstantSDNodes(N0.getNode())) {
1610216102
SmallVector<SDValue, 8> NewVecC;

llvm/test/CodeGen/X86/pr120093.ll

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
3+
4+
define double @PR120093() {
5+
; CHECK-LABEL: PR120093:
6+
; CHECK: # %bb.0: # %bb
7+
; CHECK-NEXT: xorpd %xmm0, %xmm0
8+
; CHECK-NEXT: xorpd %xmm1, %xmm1
9+
; CHECK-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
10+
; CHECK-NEXT: cmpnltpd %xmm1, %xmm0
11+
; CHECK-NEXT: movmskpd %xmm0, %eax
12+
; CHECK-NEXT: cmpl $3, %eax
13+
; CHECK-NEXT: jne .LBB0_2
14+
; CHECK-NEXT: # %bb.1: # %bb2
15+
; CHECK-NEXT: xorpd %xmm0, %xmm0
16+
; CHECK-NEXT: retq
17+
; CHECK-NEXT: .LBB0_2: # %bb3
18+
bb:
19+
%insertelement = insertelement <2 x double> <double poison, double 0xFFFFFFFFFFFFFFFF>, double 0.000000e+00, i64 0
20+
%fcmp = fcmp uge <2 x double> zeroinitializer, %insertelement
21+
%extractelement = extractelement <2 x i1> %fcmp, i64 0
22+
%extractelement1 = extractelement <2 x i1> %fcmp, i64 1
23+
%select = select i1 %extractelement, i1 %extractelement1, i1 false
24+
br i1 %select, label %bb2, label %bb3
25+
26+
bb2: ; preds = %bb
27+
ret double 0.000000e+00
28+
29+
bb3: ; preds = %bb
30+
unreachable
31+
}

0 commit comments

Comments
 (0)