Skip to content

Commit afa0f53

Browse files
committed
[ValueTracking] Fix f16 fptosi range for large integers
We were missing the signed flag on the negative value, so the range was incorrectly interpreted for integers larger than 64-bit. Split out from #80309.
1 parent 46fb225 commit afa0f53

File tree

3 files changed

+43
-161
lines changed

3 files changed

+43
-161
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9671,7 +9671,7 @@ static void setLimitForFPToI(const Instruction *I, APInt &Lower, APInt &Upper) {
96719671
if (!I->getOperand(0)->getType()->getScalarType()->isHalfTy())
96729672
return;
96739673
if (isa<FPToSIInst>(I) && BitWidth >= 17) {
9674-
Lower = APInt(BitWidth, -65504);
9674+
Lower = APInt(BitWidth, -65504, true);
96759675
Upper = APInt(BitWidth, 65505);
96769676
}
96779677

llvm/test/CodeGen/Thumb2/mve-fpclamptosat_vec.ll

Lines changed: 40 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,60 +1012,21 @@ entry:
10121012
define arm_aapcs_vfpcc <2 x i64> @stest_f16i64(<2 x half> %x) {
10131013
; CHECK-LABEL: stest_f16i64:
10141014
; CHECK: @ %bb.0: @ %entry
1015-
; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, lr}
1016-
; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, lr}
1015+
; CHECK-NEXT: .save {r4, r5, r7, lr}
1016+
; CHECK-NEXT: push {r4, r5, r7, lr}
10171017
; CHECK-NEXT: .vsave {d8, d9}
10181018
; CHECK-NEXT: vpush {d8, d9}
10191019
; CHECK-NEXT: vmov.u16 r0, q0[1]
10201020
; CHECK-NEXT: vmov q4, q0
10211021
; CHECK-NEXT: bl __fixhfti
1022-
; CHECK-NEXT: subs.w r7, r0, #-1
1023-
; CHECK-NEXT: mvn r9, #-2147483648
1024-
; CHECK-NEXT: sbcs.w r7, r1, r9
1025-
; CHECK-NEXT: mov.w r10, #-2147483648
1026-
; CHECK-NEXT: sbcs r7, r2, #0
1027-
; CHECK-NEXT: sbcs r7, r3, #0
1028-
; CHECK-NEXT: cset r7, lt
1029-
; CHECK-NEXT: cmp r7, #0
1030-
; CHECK-NEXT: csel r3, r3, r7, ne
1031-
; CHECK-NEXT: csel r2, r2, r7, ne
1032-
; CHECK-NEXT: mov.w r7, #-1
1033-
; CHECK-NEXT: csel r1, r1, r9, ne
1034-
; CHECK-NEXT: csel r4, r0, r7, ne
1035-
; CHECK-NEXT: rsbs r0, r4, #0
1036-
; CHECK-NEXT: sbcs.w r0, r10, r1
1037-
; CHECK-NEXT: sbcs.w r0, r7, r2
1038-
; CHECK-NEXT: sbcs.w r0, r7, r3
1039-
; CHECK-NEXT: cset r5, lt
1022+
; CHECK-NEXT: mov r4, r0
10401023
; CHECK-NEXT: vmov.u16 r0, q4[0]
1041-
; CHECK-NEXT: cmp r5, #0
1042-
; CHECK-NEXT: csel r8, r1, r10, ne
1024+
; CHECK-NEXT: mov r5, r1
10431025
; CHECK-NEXT: bl __fixhfti
1044-
; CHECK-NEXT: subs.w r6, r0, #-1
1045-
; CHECK-NEXT: sbcs.w r6, r1, r9
1046-
; CHECK-NEXT: sbcs r6, r2, #0
1047-
; CHECK-NEXT: sbcs r6, r3, #0
1048-
; CHECK-NEXT: cset r6, lt
1049-
; CHECK-NEXT: cmp r6, #0
1050-
; CHECK-NEXT: csel r0, r0, r7, ne
1051-
; CHECK-NEXT: csel r1, r1, r9, ne
1052-
; CHECK-NEXT: csel r3, r3, r6, ne
1053-
; CHECK-NEXT: csel r2, r2, r6, ne
1054-
; CHECK-NEXT: rsbs r6, r0, #0
1055-
; CHECK-NEXT: sbcs.w r6, r10, r1
1056-
; CHECK-NEXT: sbcs.w r2, r7, r2
1057-
; CHECK-NEXT: sbcs.w r2, r7, r3
1058-
; CHECK-NEXT: cset r2, lt
1059-
; CHECK-NEXT: cmp r2, #0
1060-
; CHECK-NEXT: csel r1, r1, r10, ne
1061-
; CHECK-NEXT: cmp r5, #0
1062-
; CHECK-NEXT: csel r3, r4, r5, ne
1063-
; CHECK-NEXT: cmp r2, #0
1064-
; CHECK-NEXT: csel r0, r0, r2, ne
1065-
; CHECK-NEXT: vmov q0[2], q0[0], r0, r3
1066-
; CHECK-NEXT: vmov q0[3], q0[1], r1, r8
1026+
; CHECK-NEXT: vmov q0[2], q0[0], r0, r4
1027+
; CHECK-NEXT: vmov q0[3], q0[1], r1, r5
10671028
; CHECK-NEXT: vpop {d8, d9}
1068-
; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, pc}
1029+
; CHECK-NEXT: pop {r4, r5, r7, pc}
10691030
entry:
10701031
%conv = fptosi <2 x half> %x to <2 x i128>
10711032
%0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807>
@@ -1105,58 +1066,39 @@ entry:
11051066
define arm_aapcs_vfpcc <2 x i64> @ustest_f16i64(<2 x half> %x) {
11061067
; CHECK-LABEL: ustest_f16i64:
11071068
; CHECK: @ %bb.0: @ %entry
1108-
; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, lr}
1109-
; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, r9, lr}
1110-
; CHECK-NEXT: .pad #4
1111-
; CHECK-NEXT: sub sp, #4
1069+
; CHECK-NEXT: .save {r4, r5, r6, r7, r8, lr}
1070+
; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, lr}
11121071
; CHECK-NEXT: .vsave {d8, d9}
11131072
; CHECK-NEXT: vpush {d8, d9}
11141073
; CHECK-NEXT: vmov.u16 r0, q0[1]
11151074
; CHECK-NEXT: vmov q4, q0
11161075
; CHECK-NEXT: bl __fixhfti
1117-
; CHECK-NEXT: subs r5, r2, #1
1118-
; CHECK-NEXT: mov.w r8, #1
1119-
; CHECK-NEXT: sbcs r5, r3, #0
1120-
; CHECK-NEXT: mov.w r7, #0
1121-
; CHECK-NEXT: cset r5, lt
1122-
; CHECK-NEXT: cmp r5, #0
1123-
; CHECK-NEXT: csel r0, r0, r5, ne
1124-
; CHECK-NEXT: csel r3, r3, r5, ne
1125-
; CHECK-NEXT: csel r2, r2, r8, ne
1126-
; CHECK-NEXT: csel r4, r1, r5, ne
1076+
; CHECK-NEXT: mov r4, r1
11271077
; CHECK-NEXT: rsbs r1, r0, #0
1128-
; CHECK-NEXT: sbcs.w r1, r7, r4
1129-
; CHECK-NEXT: sbcs.w r1, r7, r2
1130-
; CHECK-NEXT: sbcs.w r1, r7, r3
1078+
; CHECK-NEXT: mov.w r5, #0
1079+
; CHECK-NEXT: sbcs.w r1, r5, r4
1080+
; CHECK-NEXT: sbcs.w r1, r5, r2
1081+
; CHECK-NEXT: sbcs.w r1, r5, r3
11311082
; CHECK-NEXT: cset r6, lt
11321083
; CHECK-NEXT: cmp r6, #0
1133-
; CHECK-NEXT: csel r9, r0, r6, ne
1084+
; CHECK-NEXT: csel r8, r0, r6, ne
11341085
; CHECK-NEXT: vmov.u16 r0, q4[0]
11351086
; CHECK-NEXT: bl __fixhfti
1136-
; CHECK-NEXT: subs r5, r2, #1
1137-
; CHECK-NEXT: sbcs r5, r3, #0
1138-
; CHECK-NEXT: cset r5, lt
1139-
; CHECK-NEXT: cmp r5, #0
1140-
; CHECK-NEXT: csel r0, r0, r5, ne
1141-
; CHECK-NEXT: csel r2, r2, r8, ne
1142-
; CHECK-NEXT: csel r3, r3, r5, ne
1143-
; CHECK-NEXT: csel r1, r1, r5, ne
1144-
; CHECK-NEXT: rsbs r5, r0, #0
1145-
; CHECK-NEXT: sbcs.w r5, r7, r1
1146-
; CHECK-NEXT: sbcs.w r2, r7, r2
1147-
; CHECK-NEXT: sbcs.w r2, r7, r3
1087+
; CHECK-NEXT: rsbs r7, r0, #0
1088+
; CHECK-NEXT: sbcs.w r7, r5, r1
1089+
; CHECK-NEXT: sbcs.w r2, r5, r2
1090+
; CHECK-NEXT: sbcs.w r2, r5, r3
11481091
; CHECK-NEXT: cset r2, lt
11491092
; CHECK-NEXT: cmp r2, #0
11501093
; CHECK-NEXT: csel r0, r0, r2, ne
11511094
; CHECK-NEXT: cmp r6, #0
11521095
; CHECK-NEXT: csel r3, r4, r6, ne
11531096
; CHECK-NEXT: cmp r2, #0
11541097
; CHECK-NEXT: csel r1, r1, r2, ne
1155-
; CHECK-NEXT: vmov q0[2], q0[0], r0, r9
1098+
; CHECK-NEXT: vmov q0[2], q0[0], r0, r8
11561099
; CHECK-NEXT: vmov q0[3], q0[1], r1, r3
11571100
; CHECK-NEXT: vpop {d8, d9}
1158-
; CHECK-NEXT: add sp, #4
1159-
; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, r9, pc}
1101+
; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, pc}
11601102
entry:
11611103
%conv = fptosi <2 x half> %x to <2 x i128>
11621104
%0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
@@ -2119,60 +2061,21 @@ entry:
21192061
define arm_aapcs_vfpcc <2 x i64> @stest_f16i64_mm(<2 x half> %x) {
21202062
; CHECK-LABEL: stest_f16i64_mm:
21212063
; CHECK: @ %bb.0: @ %entry
2122-
; CHECK-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, lr}
2123-
; CHECK-NEXT: push.w {r4, r5, r6, r7, r8, r9, r10, lr}
2064+
; CHECK-NEXT: .save {r4, r5, r7, lr}
2065+
; CHECK-NEXT: push {r4, r5, r7, lr}
21242066
; CHECK-NEXT: .vsave {d8, d9}
21252067
; CHECK-NEXT: vpush {d8, d9}
21262068
; CHECK-NEXT: vmov.u16 r0, q0[1]
21272069
; CHECK-NEXT: vmov q4, q0
21282070
; CHECK-NEXT: bl __fixhfti
2129-
; CHECK-NEXT: subs.w r7, r0, #-1
2130-
; CHECK-NEXT: mvn r9, #-2147483648
2131-
; CHECK-NEXT: sbcs.w r7, r1, r9
2132-
; CHECK-NEXT: mov.w r10, #-2147483648
2133-
; CHECK-NEXT: sbcs r7, r2, #0
2134-
; CHECK-NEXT: sbcs r7, r3, #0
2135-
; CHECK-NEXT: cset r7, lt
2136-
; CHECK-NEXT: cmp r7, #0
2137-
; CHECK-NEXT: csel r3, r3, r7, ne
2138-
; CHECK-NEXT: csel r2, r2, r7, ne
2139-
; CHECK-NEXT: mov.w r7, #-1
2140-
; CHECK-NEXT: csel r1, r1, r9, ne
2141-
; CHECK-NEXT: csel r4, r0, r7, ne
2142-
; CHECK-NEXT: rsbs r0, r4, #0
2143-
; CHECK-NEXT: sbcs.w r0, r10, r1
2144-
; CHECK-NEXT: sbcs.w r0, r7, r2
2145-
; CHECK-NEXT: sbcs.w r0, r7, r3
2146-
; CHECK-NEXT: cset r5, lt
2071+
; CHECK-NEXT: mov r4, r0
21472072
; CHECK-NEXT: vmov.u16 r0, q4[0]
2148-
; CHECK-NEXT: cmp r5, #0
2149-
; CHECK-NEXT: csel r8, r1, r10, ne
2073+
; CHECK-NEXT: mov r5, r1
21502074
; CHECK-NEXT: bl __fixhfti
2151-
; CHECK-NEXT: subs.w r6, r0, #-1
2152-
; CHECK-NEXT: sbcs.w r6, r1, r9
2153-
; CHECK-NEXT: sbcs r6, r2, #0
2154-
; CHECK-NEXT: sbcs r6, r3, #0
2155-
; CHECK-NEXT: cset r6, lt
2156-
; CHECK-NEXT: cmp r6, #0
2157-
; CHECK-NEXT: csel r0, r0, r7, ne
2158-
; CHECK-NEXT: csel r1, r1, r9, ne
2159-
; CHECK-NEXT: csel r3, r3, r6, ne
2160-
; CHECK-NEXT: csel r2, r2, r6, ne
2161-
; CHECK-NEXT: rsbs r6, r0, #0
2162-
; CHECK-NEXT: sbcs.w r6, r10, r1
2163-
; CHECK-NEXT: sbcs.w r2, r7, r2
2164-
; CHECK-NEXT: sbcs.w r2, r7, r3
2165-
; CHECK-NEXT: cset r2, lt
2166-
; CHECK-NEXT: cmp r2, #0
2167-
; CHECK-NEXT: csel r1, r1, r10, ne
2168-
; CHECK-NEXT: cmp r5, #0
2169-
; CHECK-NEXT: csel r3, r4, r5, ne
2170-
; CHECK-NEXT: cmp r2, #0
2171-
; CHECK-NEXT: csel r0, r0, r2, ne
2172-
; CHECK-NEXT: vmov q0[2], q0[0], r0, r3
2173-
; CHECK-NEXT: vmov q0[3], q0[1], r1, r8
2075+
; CHECK-NEXT: vmov q0[2], q0[0], r0, r4
2076+
; CHECK-NEXT: vmov q0[3], q0[1], r1, r5
21742077
; CHECK-NEXT: vpop {d8, d9}
2175-
; CHECK-NEXT: pop.w {r4, r5, r6, r7, r8, r9, r10, pc}
2078+
; CHECK-NEXT: pop {r4, r5, r7, pc}
21762079
entry:
21772080
%conv = fptosi <2 x half> %x to <2 x i128>
21782081
%spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>)
@@ -2209,51 +2112,34 @@ entry:
22092112
define arm_aapcs_vfpcc <2 x i64> @ustest_f16i64_mm(<2 x half> %x) {
22102113
; CHECK-LABEL: ustest_f16i64_mm:
22112114
; CHECK: @ %bb.0: @ %entry
2212-
; CHECK-NEXT: .save {r4, r5, r6, r7, lr}
2213-
; CHECK-NEXT: push {r4, r5, r6, r7, lr}
2214-
; CHECK-NEXT: .pad #4
2215-
; CHECK-NEXT: sub sp, #4
2115+
; CHECK-NEXT: .save {r4, r5, r6, lr}
2116+
; CHECK-NEXT: push {r4, r5, r6, lr}
22162117
; CHECK-NEXT: .vsave {d8, d9}
22172118
; CHECK-NEXT: vpush {d8, d9}
22182119
; CHECK-NEXT: vmov.u16 r0, q0[1]
22192120
; CHECK-NEXT: vmov q4, q0
22202121
; CHECK-NEXT: bl __fixhfti
2221-
; CHECK-NEXT: mov r4, r1
2222-
; CHECK-NEXT: subs r1, r2, #1
2223-
; CHECK-NEXT: sbcs r1, r3, #0
2224-
; CHECK-NEXT: cset r6, lt
2225-
; CHECK-NEXT: cmp r6, #0
2226-
; CHECK-NEXT: csel r5, r0, r6, ne
2227-
; CHECK-NEXT: csel r7, r3, r6, ne
2122+
; CHECK-NEXT: mov r4, r0
22282123
; CHECK-NEXT: vmov.u16 r0, q4[0]
2229-
; CHECK-NEXT: cmp r7, #0
2230-
; CHECK-NEXT: it mi
2231-
; CHECK-NEXT: movmi r5, #0
2124+
; CHECK-NEXT: mov r5, r1
2125+
; CHECK-NEXT: mov r6, r3
22322126
; CHECK-NEXT: bl __fixhfti
2233-
; CHECK-NEXT: subs r2, #1
2234-
; CHECK-NEXT: sbcs r2, r3, #0
2235-
; CHECK-NEXT: cset r2, lt
2236-
; CHECK-NEXT: cmp r2, #0
2237-
; CHECK-NEXT: csel r3, r3, r2, ne
2238-
; CHECK-NEXT: csel r0, r0, r2, ne
2127+
; CHECK-NEXT: cmp r6, #0
2128+
; CHECK-NEXT: it mi
2129+
; CHECK-NEXT: movmi r4, #0
22392130
; CHECK-NEXT: cmp r3, #0
22402131
; CHECK-NEXT: it mi
22412132
; CHECK-NEXT: movmi r0, #0
22422133
; CHECK-NEXT: cmp r6, #0
2243-
; CHECK-NEXT: vmov q0[2], q0[0], r0, r5
2244-
; CHECK-NEXT: csel r6, r4, r6, ne
2245-
; CHECK-NEXT: cmp r7, #0
2134+
; CHECK-NEXT: vmov q0[2], q0[0], r0, r4
22462135
; CHECK-NEXT: it mi
2247-
; CHECK-NEXT: movmi r6, #0
2248-
; CHECK-NEXT: cmp r2, #0
2249-
; CHECK-NEXT: csel r1, r1, r2, ne
2136+
; CHECK-NEXT: movmi r5, #0
22502137
; CHECK-NEXT: cmp r3, #0
22512138
; CHECK-NEXT: it mi
22522139
; CHECK-NEXT: movmi r1, #0
2253-
; CHECK-NEXT: vmov q0[3], q0[1], r1, r6
2140+
; CHECK-NEXT: vmov q0[3], q0[1], r1, r5
22542141
; CHECK-NEXT: vpop {d8, d9}
2255-
; CHECK-NEXT: add sp, #4
2256-
; CHECK-NEXT: pop {r4, r5, r6, r7, pc}
2142+
; CHECK-NEXT: pop {r4, r5, r6, pc}
22572143
entry:
22582144
%conv = fptosi <2 x half> %x to <2 x i128>
22592145
%spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)

llvm/test/Transforms/InstSimplify/fptoi-range.ll

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,7 @@ define i1 @f16_si16_max2(half %f) {
3434

3535
define i1 @f16_si128_max2(half %f) {
3636
; CHECK-LABEL: @f16_si128_max2(
37-
; CHECK-NEXT: [[I:%.*]] = fptosi half [[F:%.*]] to i128
38-
; CHECK-NEXT: [[C:%.*]] = icmp sgt i128 [[I]], 65504
39-
; CHECK-NEXT: ret i1 [[C]]
37+
; CHECK-NEXT: ret i1 false
4038
;
4139
%i = fptosi half %f to i128
4240
%c = icmp sgt i128 %i, 65504
@@ -54,9 +52,7 @@ define i1 @f16_si_min1(half %f) {
5452

5553
define i1 @f16_si128_min1(half %f) {
5654
; CHECK-LABEL: @f16_si128_min1(
57-
; CHECK-NEXT: [[I:%.*]] = fptosi half [[F:%.*]] to i128
58-
; CHECK-NEXT: [[C:%.*]] = icmp sge i128 [[I]], -65504
59-
; CHECK-NEXT: ret i1 [[C]]
55+
; CHECK-NEXT: ret i1 true
6056
;
6157
%i = fptosi half %f to i128
6258
%c = icmp sge i128 %i, -65504

0 commit comments

Comments
 (0)