Skip to content

Commit b65d65f

Browse files
committed
[InstCombine] Fold fabs over select
1 parent 4110196 commit b65d65f

File tree

4 files changed

+18
-20
lines changed

4 files changed

+18
-20
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3432,6 +3432,7 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
34323432
case Intrinsic::uadd_sat:
34333433
case Intrinsic::ssub_sat:
34343434
case Intrinsic::sadd_sat:
3435+
case Intrinsic::fabs:
34353436
for (Value *Op : II->args())
34363437
if (auto *Sel = dyn_cast<SelectInst>(Op))
34373438
if (Instruction *R = FoldOpIntoSelect(*II, Sel))

llvm/test/Transforms/InstCombine/fabs.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ define float @fabs_select_constant_neg0(i32 %c) {
179179
define float @fabs_select_var_constant_negative(i32 %c, float %x) {
180180
; CHECK-LABEL: @fabs_select_var_constant_negative(
181181
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C:%.*]], 0
182-
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], float [[X:%.*]], float -1.000000e+00
183-
; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
184-
; CHECK-NEXT: ret float [[FABS]]
182+
; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT:%.*]])
183+
; CHECK-NEXT: [[FABS1:%.*]] = select i1 [[CMP]], float [[FABS]], float 1.000000e+00
184+
; CHECK-NEXT: ret float [[FABS1]]
185185
;
186186
%cmp = icmp eq i32 %c, 0
187187
%select = select i1 %cmp, float %x, float -1.0

llvm/test/Transforms/InstCombine/intrinsic-select.ll

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -285,9 +285,7 @@ define double @test_fabs_select1(double %a) {
285285
; CHECK-LABEL: @test_fabs_select1(
286286
; CHECK-NEXT: [[COND:%.*]] = fcmp uno double [[A:%.*]], 0.000000e+00
287287
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[COND]], double 0x7FF8000000000000, double [[A]]
288-
; CHECK-NEXT: [[FABS:%.*]] = call double @llvm.fabs.f64(double [[SEL1]])
289-
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[COND]], double [[FABS]], double [[A]]
290-
; CHECK-NEXT: ret double [[SEL2]]
288+
; CHECK-NEXT: ret double [[SEL1]]
291289
;
292290
%cond = fcmp uno double %a, 0.000000e+00
293291
%sel1 = select i1 %cond, double 0x7FF8000000000000, double %a
@@ -300,8 +298,7 @@ define double @test_fabs_select2(double %a) {
300298
; CHECK-LABEL: @test_fabs_select2(
301299
; CHECK-NEXT: [[ABS1:%.*]] = call double @llvm.fabs.f64(double [[A:%.*]])
302300
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[ABS1]], 0x7FF0000000000000
303-
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], double -0.000000e+00, double [[ABS1]]
304-
; CHECK-NEXT: [[ABS2:%.*]] = call double @llvm.fabs.f64(double [[SEL]])
301+
; CHECK-NEXT: [[ABS2:%.*]] = select i1 [[CMP]], double 0.000000e+00, double [[ABS1]]
305302
; CHECK-NEXT: ret double [[ABS2]]
306303
;
307304
%abs1 = call double @llvm.fabs.f64(double %a)

llvm/test/Transforms/InstCombine/simplify-demanded-fpclass.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,8 @@ define nofpclass(inf) float @ret_nofpclass_inf__fabs_select_pinf_rhs(i1 %cond, f
387387
define nofpclass(ninf nnorm nsub nzero) float @ret_nofpclass_no_negatives__fabs_select_pinf_rhs(i1 %cond, float %x) {
388388
; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_nofpclass_no_negatives__fabs_select_pinf_rhs
389389
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
390-
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[X]], float 0x7FF0000000000000
391-
; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
390+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
391+
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[COND]], float [[TMP1]], float 0x7FF0000000000000
392392
; CHECK-NEXT: ret float [[FABS]]
393393
;
394394
%select = select i1 %cond, float %x, float 0x7FF0000000000000
@@ -411,8 +411,8 @@ define nofpclass(pinf pnorm psub pzero) float @ret_nofpclass_no_positives__fabs_
411411
define nofpclass(nan ninf nnorm nsub nzero) float @ret_nofpclass_no_negatives_nan__fabs_select_pinf_rhs(i1 %cond, float %x) {
412412
; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_nofpclass_no_negatives_nan__fabs_select_pinf_rhs
413413
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]]) {
414-
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[X]], float 0x7FF0000000000000
415-
; CHECK-NEXT: [[FABS:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
414+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
415+
; CHECK-NEXT: [[FABS:%.*]] = select i1 [[COND]], float [[TMP1]], float 0x7FF0000000000000
416416
; CHECK-NEXT: ret float [[FABS]]
417417
;
418418
%select = select i1 %cond, float %x, float 0x7FF0000000000000
@@ -665,8 +665,8 @@ define nofpclass(inf pnorm psub pzero) float @ret_nofpclass_no_positives_noinf__
665665
define nofpclass(ninf nnorm nsub nzero) float @ret_nofpclass_no_negatives__copysign_unknown_select_pinf_rhs(i1 %cond, float %x, float %unknown.sign) {
666666
; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @ret_nofpclass_no_negatives__copysign_unknown_select_pinf_rhs
667667
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
668-
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[X]], float 0x7FF0000000000000
669-
; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
668+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
669+
; CHECK-NEXT: [[COPYSIGN:%.*]] = select i1 [[COND]], float [[TMP1]], float 0x7FF0000000000000
670670
; CHECK-NEXT: ret float [[COPYSIGN]]
671671
;
672672
%select = select i1 %cond, float %x, float 0x7FF0000000000000
@@ -678,8 +678,8 @@ define nofpclass(ninf nnorm nsub nzero) float @ret_nofpclass_no_negatives__copys
678678
define nofpclass(pinf pnorm psub pzero) float @ret_nofpclass_no_positives__copysign_unknown_select_pinf_rhs(i1 %cond, float %x, float %unknown.sign) {
679679
; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @ret_nofpclass_no_positives__copysign_unknown_select_pinf_rhs
680680
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
681-
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[X]], float 0x7FF0000000000000
682-
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
681+
; CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.fabs.f32(float [[X]])
682+
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[COND]], float [[TMP2]], float 0x7FF0000000000000
683683
; CHECK-NEXT: [[COPYSIGN:%.*]] = fneg float [[TMP1]]
684684
; CHECK-NEXT: ret float [[COPYSIGN]]
685685
;
@@ -692,8 +692,8 @@ define nofpclass(pinf pnorm psub pzero) float @ret_nofpclass_no_positives__copys
692692
define nofpclass(nan ninf nnorm nsub nzero) float @ret_nofpclass_no_negatives_nonan__copysign_unknown_select_pinf_rhs(i1 %cond, float %x, float %unknown.sign) {
693693
; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @ret_nofpclass_no_negatives_nonan__copysign_unknown_select_pinf_rhs
694694
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
695-
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[X]], float 0x7FF0000000000000
696-
; CHECK-NEXT: [[COPYSIGN:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
695+
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[X]])
696+
; CHECK-NEXT: [[COPYSIGN:%.*]] = select i1 [[COND]], float [[TMP1]], float 0x7FF0000000000000
697697
; CHECK-NEXT: ret float [[COPYSIGN]]
698698
;
699699
%select = select i1 %cond, float %x, float 0x7FF0000000000000
@@ -705,8 +705,8 @@ define nofpclass(nan ninf nnorm nsub nzero) float @ret_nofpclass_no_negatives_no
705705
define nofpclass(nan pinf pnorm psub pzero) float @ret_nofpclass_no_positives_nonan__copysign_unknown_select_pinf_rhs(i1 %cond, float %x, float %unknown.sign) {
706706
; CHECK-LABEL: define nofpclass(nan pinf pzero psub pnorm) float @ret_nofpclass_no_positives_nonan__copysign_unknown_select_pinf_rhs
707707
; CHECK-SAME: (i1 [[COND:%.*]], float [[X:%.*]], float [[UNKNOWN_SIGN:%.*]]) {
708-
; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[COND]], float [[X]], float 0x7FF0000000000000
709-
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.fabs.f32(float [[SELECT]])
708+
; CHECK-NEXT: [[TMP2:%.*]] = call float @llvm.fabs.f32(float [[X]])
709+
; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[COND]], float [[TMP2]], float 0x7FF0000000000000
710710
; CHECK-NEXT: [[COPYSIGN:%.*]] = fneg float [[TMP1]]
711711
; CHECK-NEXT: ret float [[COPYSIGN]]
712712
;

0 commit comments

Comments
 (0)