Skip to content

Commit c4f4010

Browse files
davemgreenllvmbot
authored andcommitted
[AArch64] Don't try to custom lower fp16 selects with nofp (#129492)
If we do not have fp then we do not need to try and custom lower fp16 selects. Fixes #129394. (cherry picked from commit cb850fe)
1 parent a69568e commit c4f4010

File tree

2 files changed

+95
-2
lines changed

2 files changed

+95
-2
lines changed

Diff for: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -498,8 +498,10 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
498498
setOperationAction(ISD::BR_CC, MVT::f64, Custom);
499499
setOperationAction(ISD::SELECT, MVT::i32, Custom);
500500
setOperationAction(ISD::SELECT, MVT::i64, Custom);
501-
setOperationAction(ISD::SELECT, MVT::f16, Custom);
502-
setOperationAction(ISD::SELECT, MVT::bf16, Custom);
501+
if (Subtarget->hasFPARMv8()) {
502+
setOperationAction(ISD::SELECT, MVT::f16, Custom);
503+
setOperationAction(ISD::SELECT, MVT::bf16, Custom);
504+
}
503505
setOperationAction(ISD::SELECT, MVT::f32, Custom);
504506
setOperationAction(ISD::SELECT, MVT::f64, Custom);
505507
setOperationAction(ISD::SELECT_CC, MVT::i32, Custom);

Diff for: llvm/test/CodeGen/AArch64/16bit-float-promotion-with-nofp.ll

+91
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,94 @@ entry:
2929
ret bfloat %0
3030
}
3131

32+
define double @select_f64(double %a, double %b, i1 %c) {
33+
; CHECK-LABEL: select_f64:
34+
; CHECK: // %bb.0: // %entry
35+
; CHECK-NEXT: tst w2, #0x1
36+
; CHECK-NEXT: csel x0, x0, x1, ne
37+
; CHECK-NEXT: ret
38+
entry:
39+
%0 = select i1 %c, double %a, double %b
40+
ret double %0
41+
}
42+
43+
define float @select_f32(float %a, float %b, i1 %c) {
44+
; CHECK-LABEL: select_f32:
45+
; CHECK: // %bb.0: // %entry
46+
; CHECK-NEXT: tst w2, #0x1
47+
; CHECK-NEXT: csel w0, w0, w1, ne
48+
; CHECK-NEXT: ret
49+
entry:
50+
%0 = select i1 %c, float %a, float %b
51+
ret float %0
52+
}
53+
54+
define half @select_f16(half %a, half %b, i1 %c) {
55+
; CHECK-LABEL: select_f16:
56+
; CHECK: // %bb.0: // %entry
57+
; CHECK-NEXT: tst w2, #0x1
58+
; CHECK-NEXT: csel w0, w0, w1, ne
59+
; CHECK-NEXT: ret
60+
entry:
61+
%0 = select i1 %c, half %a, half %b
62+
ret half %0
63+
}
64+
65+
define bfloat @select_bf16(bfloat %a, bfloat %b, i1 %c) {
66+
; CHECK-LABEL: select_bf16:
67+
; CHECK: // %bb.0: // %entry
68+
; CHECK-NEXT: tst w2, #0x1
69+
; CHECK-NEXT: csel w0, w0, w1, ne
70+
; CHECK-NEXT: ret
71+
entry:
72+
%0 = select i1 %c, bfloat %a, bfloat %b
73+
ret bfloat %0
74+
}
75+
76+
define double @selectcc_f64(double %a, double %b, i32 %d) {
77+
; CHECK-LABEL: selectcc_f64:
78+
; CHECK: // %bb.0: // %entry
79+
; CHECK-NEXT: cmp w2, #0
80+
; CHECK-NEXT: csel x0, x0, x1, lt
81+
; CHECK-NEXT: ret
82+
entry:
83+
%c = icmp slt i32 %d, 0
84+
%0 = select i1 %c, double %a, double %b
85+
ret double %0
86+
}
87+
88+
define float @selectcc_f32(float %a, float %b, i32 %d) {
89+
; CHECK-LABEL: selectcc_f32:
90+
; CHECK: // %bb.0: // %entry
91+
; CHECK-NEXT: cmp w2, #0
92+
; CHECK-NEXT: csel w0, w0, w1, lt
93+
; CHECK-NEXT: ret
94+
entry:
95+
%c = icmp slt i32 %d, 0
96+
%0 = select i1 %c, float %a, float %b
97+
ret float %0
98+
}
99+
100+
define half @selectcc_f16(half %a, half %b, i32 %d) {
101+
; CHECK-LABEL: selectcc_f16:
102+
; CHECK: // %bb.0: // %entry
103+
; CHECK-NEXT: cmp w2, #0
104+
; CHECK-NEXT: csel w0, w0, w1, lt
105+
; CHECK-NEXT: ret
106+
entry:
107+
%c = icmp slt i32 %d, 0
108+
%0 = select i1 %c, half %a, half %b
109+
ret half %0
110+
}
111+
112+
define bfloat @selectcc_bf16(bfloat %a, bfloat %b, i32 %d) {
113+
; CHECK-LABEL: selectcc_bf16:
114+
; CHECK: // %bb.0: // %entry
115+
; CHECK-NEXT: cmp w2, #0
116+
; CHECK-NEXT: csel w0, w0, w1, lt
117+
; CHECK-NEXT: ret
118+
entry:
119+
%c = icmp slt i32 %d, 0
120+
%0 = select i1 %c, bfloat %a, bfloat %b
121+
ret bfloat %0
122+
}

0 commit comments

Comments
 (0)