Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / expand-large-fp-convert-fptosi129.ll
blobff460c155c5dba07d51ce0b3a0c8730790c90ee9
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -mtriple=x86_64-- -expand-large-fp-convert < %s | FileCheck %s
4 define i129 @halftosi129(half %a) {
5 ; CHECK-LABEL: @halftosi129(
6 ; CHECK-NEXT:    [[TMP1:%.*]] = fptosi half [[A:%.*]] to i32
7 ; CHECK-NEXT:    [[TMP2:%.*]] = sext i32 [[TMP1]] to i129
8 ; CHECK-NEXT:    ret i129 [[TMP2]]
10   %conv = fptosi half %a to i129
11   ret i129 %conv
14 define i129 @floattosi129(float %a) {
15 ; CHECK-LABEL: @floattosi129(
16 ; CHECK-NEXT:  fp-to-i-entry:
17 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast float [[A:%.*]] to i32
18 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i32 [[TMP0]] to i129
19 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[TMP0]], -1
20 ; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP2]], i129 1, i129 -1
21 ; CHECK-NEXT:    [[TMP4:%.*]] = lshr i129 [[TMP1]], 23
22 ; CHECK-NEXT:    [[TMP5:%.*]] = and i129 [[TMP4]], 255
23 ; CHECK-NEXT:    [[TMP6:%.*]] = and i129 [[TMP1]], 8388607
24 ; CHECK-NEXT:    [[TMP7:%.*]] = or i129 [[TMP6]], 8388608
25 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp ult i129 [[TMP5]], 127
26 ; CHECK-NEXT:    br i1 [[TMP8]], label [[FP_TO_I_CLEANUP:%.*]], label [[FP_TO_I_IF_END:%.*]]
27 ; CHECK:       fp-to-i-if-end:
28 ; CHECK-NEXT:    [[TMP9:%.*]] = add i129 [[TMP5]], -256
29 ; CHECK-NEXT:    [[TMP10:%.*]] = icmp ult i129 [[TMP9]], 4294967167
30 ; CHECK-NEXT:    br i1 [[TMP10]], label [[FP_TO_I_IF_THEN5:%.*]], label [[FP_TO_I_IF_END9:%.*]]
31 ; CHECK:       fp-to-i-if-then5:
32 ; CHECK-NEXT:    [[TMP11:%.*]] = select i1 [[TMP2]], i129 340282366920938463463374607431768211455, i129 -340282366920938463463374607431768211456
33 ; CHECK-NEXT:    br label [[FP_TO_I_CLEANUP]]
34 ; CHECK:       fp-to-i-if-end9:
35 ; CHECK-NEXT:    [[TMP12:%.*]] = icmp ult i129 [[TMP5]], 150
36 ; CHECK-NEXT:    br i1 [[TMP12]], label [[FP_TO_I_IF_THEN12:%.*]], label [[FP_TO_I_IF_ELSE:%.*]]
37 ; CHECK:       fp-to-i-if-then12:
38 ; CHECK-NEXT:    [[TMP13:%.*]] = sub i129 150, [[TMP5]]
39 ; CHECK-NEXT:    [[TMP14:%.*]] = lshr i129 [[TMP7]], [[TMP13]]
40 ; CHECK-NEXT:    [[TMP15:%.*]] = mul i129 [[TMP14]], [[TMP3]]
41 ; CHECK-NEXT:    br label [[FP_TO_I_CLEANUP]]
42 ; CHECK:       fp-to-i-if-else:
43 ; CHECK-NEXT:    [[TMP16:%.*]] = add i129 [[TMP5]], 4294967146
44 ; CHECK-NEXT:    [[TMP17:%.*]] = shl i129 [[TMP7]], [[TMP16]]
45 ; CHECK-NEXT:    [[TMP18:%.*]] = mul i129 [[TMP17]], [[TMP3]]
46 ; CHECK-NEXT:    br label [[FP_TO_I_CLEANUP]]
47 ; CHECK:       fp-to-i-cleanup:
48 ; CHECK-NEXT:    [[TMP19:%.*]] = phi i129 [ [[TMP11]], [[FP_TO_I_IF_THEN5]] ], [ [[TMP15]], [[FP_TO_I_IF_THEN12]] ], [ [[TMP18]], [[FP_TO_I_IF_ELSE]] ], [ 0, [[FP_TO_I_ENTRY:%.*]] ]
49 ; CHECK-NEXT:    ret i129 [[TMP19]]
51   %conv = fptosi float %a to i129
52   ret i129 %conv
55 define i129 @doubletosi129(double %a) {
56 ; CHECK-LABEL: @doubletosi129(
57 ; CHECK-NEXT:  fp-to-i-entry:
58 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast double [[A:%.*]] to i64
59 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i64 [[TMP0]] to i129
60 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i64 [[TMP0]], -1
61 ; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP2]], i129 1, i129 -1
62 ; CHECK-NEXT:    [[TMP4:%.*]] = lshr i129 [[TMP1]], 52
63 ; CHECK-NEXT:    [[TMP5:%.*]] = and i129 [[TMP4]], 2047
64 ; CHECK-NEXT:    [[TMP6:%.*]] = and i129 [[TMP1]], 4503599627370495
65 ; CHECK-NEXT:    [[TMP7:%.*]] = or i129 [[TMP6]], 4503599627370496
66 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp ult i129 [[TMP5]], 1023
67 ; CHECK-NEXT:    br i1 [[TMP8]], label [[FP_TO_I_CLEANUP:%.*]], label [[FP_TO_I_IF_END:%.*]]
68 ; CHECK:       fp-to-i-if-end:
69 ; CHECK-NEXT:    [[TMP9:%.*]] = add i129 [[TMP5]], -1152
70 ; CHECK-NEXT:    [[TMP10:%.*]] = icmp ult i129 [[TMP9]], 4294967167
71 ; CHECK-NEXT:    br i1 [[TMP10]], label [[FP_TO_I_IF_THEN5:%.*]], label [[FP_TO_I_IF_END9:%.*]]
72 ; CHECK:       fp-to-i-if-then5:
73 ; CHECK-NEXT:    [[TMP11:%.*]] = select i1 [[TMP2]], i129 340282366920938463463374607431768211455, i129 -340282366920938463463374607431768211456
74 ; CHECK-NEXT:    br label [[FP_TO_I_CLEANUP]]
75 ; CHECK:       fp-to-i-if-end9:
76 ; CHECK-NEXT:    [[TMP12:%.*]] = icmp ult i129 [[TMP5]], 1075
77 ; CHECK-NEXT:    br i1 [[TMP12]], label [[FP_TO_I_IF_THEN12:%.*]], label [[FP_TO_I_IF_ELSE:%.*]]
78 ; CHECK:       fp-to-i-if-then12:
79 ; CHECK-NEXT:    [[TMP13:%.*]] = sub i129 1075, [[TMP5]]
80 ; CHECK-NEXT:    [[TMP14:%.*]] = lshr i129 [[TMP7]], [[TMP13]]
81 ; CHECK-NEXT:    [[TMP15:%.*]] = mul i129 [[TMP14]], [[TMP3]]
82 ; CHECK-NEXT:    br label [[FP_TO_I_CLEANUP]]
83 ; CHECK:       fp-to-i-if-else:
84 ; CHECK-NEXT:    [[TMP16:%.*]] = add i129 [[TMP5]], 4294966221
85 ; CHECK-NEXT:    [[TMP17:%.*]] = shl i129 [[TMP7]], [[TMP16]]
86 ; CHECK-NEXT:    [[TMP18:%.*]] = mul i129 [[TMP17]], [[TMP3]]
87 ; CHECK-NEXT:    br label [[FP_TO_I_CLEANUP]]
88 ; CHECK:       fp-to-i-cleanup:
89 ; CHECK-NEXT:    [[TMP19:%.*]] = phi i129 [ [[TMP11]], [[FP_TO_I_IF_THEN5]] ], [ [[TMP15]], [[FP_TO_I_IF_THEN12]] ], [ [[TMP18]], [[FP_TO_I_IF_ELSE]] ], [ 0, [[FP_TO_I_ENTRY:%.*]] ]
90 ; CHECK-NEXT:    ret i129 [[TMP19]]
92   %conv = fptosi double %a to i129
93   ret i129 %conv
96 define i129 @x86_fp80tosi129(x86_fp80 %a) {
97 ; CHECK-LABEL: @x86_fp80tosi129(
98 ; CHECK-NEXT:  fp-to-i-entry:
99 ; CHECK-NEXT:    [[TMP0:%.*]] = fpext x86_fp80 [[A:%.*]] to fp128
100 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast fp128 [[TMP0]] to i128
101 ; CHECK-NEXT:    [[TMP2:%.*]] = zext i128 [[TMP1]] to i129
102 ; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i128 [[TMP1]], -1
103 ; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[TMP3]], i129 1, i129 -1
104 ; CHECK-NEXT:    [[TMP5:%.*]] = lshr i129 [[TMP2]], 112
105 ; CHECK-NEXT:    [[TMP6:%.*]] = and i129 [[TMP5]], 32767
106 ; CHECK-NEXT:    [[TMP7:%.*]] = and i129 [[TMP2]], 5192296858534827628530496329220095
107 ; CHECK-NEXT:    [[TMP8:%.*]] = or i129 [[TMP7]], 5192296858534827628530496329220096
108 ; CHECK-NEXT:    [[TMP9:%.*]] = icmp ult i129 [[TMP6]], 16383
109 ; CHECK-NEXT:    br i1 [[TMP9]], label [[FP_TO_I_CLEANUP:%.*]], label [[FP_TO_I_IF_END:%.*]]
110 ; CHECK:       fp-to-i-if-end:
111 ; CHECK-NEXT:    [[TMP10:%.*]] = add i129 [[TMP6]], -16512
112 ; CHECK-NEXT:    [[TMP11:%.*]] = icmp ult i129 [[TMP10]], 4294967167
113 ; CHECK-NEXT:    br i1 [[TMP11]], label [[FP_TO_I_IF_THEN5:%.*]], label [[FP_TO_I_IF_END9:%.*]]
114 ; CHECK:       fp-to-i-if-then5:
115 ; CHECK-NEXT:    [[TMP12:%.*]] = select i1 [[TMP3]], i129 340282366920938463463374607431768211455, i129 -340282366920938463463374607431768211456
116 ; CHECK-NEXT:    br label [[FP_TO_I_CLEANUP]]
117 ; CHECK:       fp-to-i-if-end9:
118 ; CHECK-NEXT:    [[TMP13:%.*]] = icmp ult i129 [[TMP6]], 16495
119 ; CHECK-NEXT:    br i1 [[TMP13]], label [[FP_TO_I_IF_THEN12:%.*]], label [[FP_TO_I_IF_ELSE:%.*]]
120 ; CHECK:       fp-to-i-if-then12:
121 ; CHECK-NEXT:    [[TMP14:%.*]] = sub i129 16495, [[TMP6]]
122 ; CHECK-NEXT:    [[TMP15:%.*]] = lshr i129 [[TMP8]], [[TMP14]]
123 ; CHECK-NEXT:    [[TMP16:%.*]] = mul i129 [[TMP15]], [[TMP4]]
124 ; CHECK-NEXT:    br label [[FP_TO_I_CLEANUP]]
125 ; CHECK:       fp-to-i-if-else:
126 ; CHECK-NEXT:    [[TMP17:%.*]] = add i129 [[TMP6]], 4294950801
127 ; CHECK-NEXT:    [[TMP18:%.*]] = shl i129 [[TMP8]], [[TMP17]]
128 ; CHECK-NEXT:    [[TMP19:%.*]] = mul i129 [[TMP18]], [[TMP4]]
129 ; CHECK-NEXT:    br label [[FP_TO_I_CLEANUP]]
130 ; CHECK:       fp-to-i-cleanup:
131 ; CHECK-NEXT:    [[TMP20:%.*]] = phi i129 [ [[TMP12]], [[FP_TO_I_IF_THEN5]] ], [ [[TMP16]], [[FP_TO_I_IF_THEN12]] ], [ [[TMP19]], [[FP_TO_I_IF_ELSE]] ], [ 0, [[FP_TO_I_ENTRY:%.*]] ]
132 ; CHECK-NEXT:    ret i129 [[TMP20]]
134   %conv = fptosi x86_fp80 %a to i129
135   ret i129 %conv
138 define i129 @fp128tosi129(fp128 %a) {
139 ; CHECK-LABEL: @fp128tosi129(
140 ; CHECK-NEXT:  fp-to-i-entry:
141 ; CHECK-NEXT:    [[TMP0:%.*]] = bitcast fp128 [[A:%.*]] to i128
142 ; CHECK-NEXT:    [[TMP1:%.*]] = zext i128 [[TMP0]] to i129
143 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i128 [[TMP0]], -1
144 ; CHECK-NEXT:    [[TMP3:%.*]] = select i1 [[TMP2]], i129 1, i129 -1
145 ; CHECK-NEXT:    [[TMP4:%.*]] = lshr i129 [[TMP1]], 112
146 ; CHECK-NEXT:    [[TMP5:%.*]] = and i129 [[TMP4]], 32767
147 ; CHECK-NEXT:    [[TMP6:%.*]] = and i129 [[TMP1]], 5192296858534827628530496329220095
148 ; CHECK-NEXT:    [[TMP7:%.*]] = or i129 [[TMP6]], 5192296858534827628530496329220096
149 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp ult i129 [[TMP5]], 16383
150 ; CHECK-NEXT:    br i1 [[TMP8]], label [[FP_TO_I_CLEANUP:%.*]], label [[FP_TO_I_IF_END:%.*]]
151 ; CHECK:       fp-to-i-if-end:
152 ; CHECK-NEXT:    [[TMP9:%.*]] = add i129 [[TMP5]], -16512
153 ; CHECK-NEXT:    [[TMP10:%.*]] = icmp ult i129 [[TMP9]], 4294967167
154 ; CHECK-NEXT:    br i1 [[TMP10]], label [[FP_TO_I_IF_THEN5:%.*]], label [[FP_TO_I_IF_END9:%.*]]
155 ; CHECK:       fp-to-i-if-then5:
156 ; CHECK-NEXT:    [[TMP11:%.*]] = select i1 [[TMP2]], i129 340282366920938463463374607431768211455, i129 -340282366920938463463374607431768211456
157 ; CHECK-NEXT:    br label [[FP_TO_I_CLEANUP]]
158 ; CHECK:       fp-to-i-if-end9:
159 ; CHECK-NEXT:    [[TMP12:%.*]] = icmp ult i129 [[TMP5]], 16495
160 ; CHECK-NEXT:    br i1 [[TMP12]], label [[FP_TO_I_IF_THEN12:%.*]], label [[FP_TO_I_IF_ELSE:%.*]]
161 ; CHECK:       fp-to-i-if-then12:
162 ; CHECK-NEXT:    [[TMP13:%.*]] = sub i129 16495, [[TMP5]]
163 ; CHECK-NEXT:    [[TMP14:%.*]] = lshr i129 [[TMP7]], [[TMP13]]
164 ; CHECK-NEXT:    [[TMP15:%.*]] = mul i129 [[TMP14]], [[TMP3]]
165 ; CHECK-NEXT:    br label [[FP_TO_I_CLEANUP]]
166 ; CHECK:       fp-to-i-if-else:
167 ; CHECK-NEXT:    [[TMP16:%.*]] = add i129 [[TMP5]], 4294950801
168 ; CHECK-NEXT:    [[TMP17:%.*]] = shl i129 [[TMP7]], [[TMP16]]
169 ; CHECK-NEXT:    [[TMP18:%.*]] = mul i129 [[TMP17]], [[TMP3]]
170 ; CHECK-NEXT:    br label [[FP_TO_I_CLEANUP]]
171 ; CHECK:       fp-to-i-cleanup:
172 ; CHECK-NEXT:    [[TMP19:%.*]] = phi i129 [ [[TMP11]], [[FP_TO_I_IF_THEN5]] ], [ [[TMP15]], [[FP_TO_I_IF_THEN12]] ], [ [[TMP18]], [[FP_TO_I_IF_ELSE]] ], [ 0, [[FP_TO_I_ENTRY:%.*]] ]
173 ; CHECK-NEXT:    ret i129 [[TMP19]]
175   %conv = fptosi fp128 %a to i129
176   ret i129 %conv