Skip to content

Commit e74520f

Browse files
authored
[DAG] canCreateUndefOrPoison - add handling for ISD::ABS nodes (#148791)
Unlike the abs intrinsic, the ISD::ABS node defines ABS(INT_MIN) -> INT_MIN, so no undef/poison is created by the node itself
1 parent 8ee32c7 commit e74520f

File tree

2 files changed

+11
-28
lines changed

2 files changed

+11
-28
lines changed

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5571,6 +5571,11 @@ bool SelectionDAG::canCreateUndefOrPoison(SDValue Op, const APInt &DemandedElts,
55715571
case ISD::SPLAT_VECTOR:
55725572
return false;
55735573

5574+
case ISD::ABS:
5575+
// ISD::ABS defines abs(INT_MIN) -> INT_MIN and never generates poison.
5576+
// Different to Intrinsic::abs.
5577+
return false;
5578+
55745579
case ISD::ADDC:
55755580
case ISD::SUBC:
55765581
case ISD::ADDE:

llvm/test/CodeGen/X86/freeze-unary.ll

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -73,23 +73,17 @@ define <2 x i64> @freeze_zext_vec(<2 x i16> %a0) nounwind {
7373
define i32 @freeze_abs(i32 %a0) nounwind {
7474
; X86-LABEL: freeze_abs:
7575
; X86: # %bb.0:
76-
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
77-
; X86-NEXT: movl %eax, %ecx
78-
; X86-NEXT: negl %ecx
79-
; X86-NEXT: cmovsl %eax, %ecx
76+
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
8077
; X86-NEXT: movl %ecx, %eax
8178
; X86-NEXT: negl %eax
8279
; X86-NEXT: cmovsl %ecx, %eax
8380
; X86-NEXT: retl
8481
;
8582
; X64-LABEL: freeze_abs:
8683
; X64: # %bb.0:
87-
; X64-NEXT: movl %edi, %ecx
88-
; X64-NEXT: negl %ecx
89-
; X64-NEXT: cmovsl %edi, %ecx
90-
; X64-NEXT: movl %ecx, %eax
84+
; X64-NEXT: movl %edi, %eax
9185
; X64-NEXT: negl %eax
92-
; X64-NEXT: cmovsl %ecx, %eax
86+
; X64-NEXT: cmovsl %edi, %eax
9387
; X64-NEXT: retq
9488
%x = call i32 @llvm.abs.i32(i32 %a0, i1 0)
9589
%f = freeze i32 %x
@@ -104,16 +98,11 @@ define <4 x i32> @freeze_abs_vec(<4 x i32> %a0) nounwind {
10498
; X86-NEXT: psrad $31, %xmm1
10599
; X86-NEXT: pxor %xmm1, %xmm0
106100
; X86-NEXT: psubd %xmm1, %xmm0
107-
; X86-NEXT: movdqa %xmm0, %xmm1
108-
; X86-NEXT: psrad $31, %xmm1
109-
; X86-NEXT: pxor %xmm1, %xmm0
110-
; X86-NEXT: psubd %xmm1, %xmm0
111101
; X86-NEXT: retl
112102
;
113103
; X64-LABEL: freeze_abs_vec:
114104
; X64: # %bb.0:
115105
; X64-NEXT: pabsd %xmm0, %xmm0
116-
; X64-NEXT: pabsd %xmm0, %xmm0
117106
; X64-NEXT: retq
118107
%x = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %a0, i1 0)
119108
%f = freeze <4 x i32> %x
@@ -124,23 +113,17 @@ define <4 x i32> @freeze_abs_vec(<4 x i32> %a0) nounwind {
124113
define i32 @freeze_abs_undef(i32 %a0) nounwind {
125114
; X86-LABEL: freeze_abs_undef:
126115
; X86: # %bb.0:
127-
; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
128-
; X86-NEXT: movl %eax, %ecx
129-
; X86-NEXT: negl %ecx
130-
; X86-NEXT: cmovsl %eax, %ecx
116+
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
131117
; X86-NEXT: movl %ecx, %eax
132118
; X86-NEXT: negl %eax
133119
; X86-NEXT: cmovsl %ecx, %eax
134120
; X86-NEXT: retl
135121
;
136122
; X64-LABEL: freeze_abs_undef:
137123
; X64: # %bb.0:
138-
; X64-NEXT: movl %edi, %ecx
139-
; X64-NEXT: negl %ecx
140-
; X64-NEXT: cmovsl %edi, %ecx
141-
; X64-NEXT: movl %ecx, %eax
124+
; X64-NEXT: movl %edi, %eax
142125
; X64-NEXT: negl %eax
143-
; X64-NEXT: cmovsl %ecx, %eax
126+
; X64-NEXT: cmovsl %edi, %eax
144127
; X64-NEXT: retq
145128
%x = call i32 @llvm.abs.i32(i32 %a0, i1 -1)
146129
%f = freeze i32 %x
@@ -155,16 +138,11 @@ define <4 x i32> @freeze_abs_undef_vec(<4 x i32> %a0) nounwind {
155138
; X86-NEXT: psrad $31, %xmm1
156139
; X86-NEXT: pxor %xmm1, %xmm0
157140
; X86-NEXT: psubd %xmm1, %xmm0
158-
; X86-NEXT: movdqa %xmm0, %xmm1
159-
; X86-NEXT: psrad $31, %xmm1
160-
; X86-NEXT: pxor %xmm1, %xmm0
161-
; X86-NEXT: psubd %xmm1, %xmm0
162141
; X86-NEXT: retl
163142
;
164143
; X64-LABEL: freeze_abs_undef_vec:
165144
; X64: # %bb.0:
166145
; X64-NEXT: pabsd %xmm0, %xmm0
167-
; X64-NEXT: pabsd %xmm0, %xmm0
168146
; X64-NEXT: retq
169147
%x = call <4 x i32> @llvm.abs.v4i32(<4 x i32> %a0, i1 -1)
170148
%f = freeze <4 x i32> %x

0 commit comments

Comments
 (0)