new file mode 100644
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-Og -O3 -mcmodel=tiny" } */
+
+int
+main (__fp16 x)
+{
+ __fp16 a = 6.5504e4;
+ return (x <= a);
+}
@@ -3942,6 +3942,29 @@ output_constant_pool_1 (struct constant_descriptor_rtx *desc,
return;
}
+/* Recompute the offsets of entries in POOL, and the overall size of
+ POOL. Do this after calling mark_constant_pool to ensure that we
+ are computing the offset values for the pool which we will actually
+ emit. */
+
+static void
+recompute_pool_offsets (struct rtx_constant_pool *pool)
+{
+ struct constant_descriptor_rtx *desc;
+ pool->offset = 0;
+
+ for (desc = pool->first; desc ; desc = desc->next)
+ if (desc->mark)
+ {
+ /* Recalculate offset. */
+ unsigned int align = desc->align;
+ pool->offset += (align / BITS_PER_UNIT) - 1;
+ pool->offset &= ~ ((align / BITS_PER_UNIT) - 1);
+ desc->offset = pool->offset;
+ pool->offset += GET_MODE_SIZE (desc->mode);
+ }
+}
+
/* Mark all constants that are referenced by SYMBOL_REFs in X.
Emit referenced deferred strings. */
@@ -4060,6 +4083,11 @@ output_constant_pool (const char *fnname ATTRIBUTE_UNUSED,
case we do not need to output the constant. */
mark_constant_pool ();
+ /* Having marked the constant pool entries we'll actually emit, we
+ now need to rebuild the offset information, which may have become
+ stale. */
+ recompute_pool_offsets (pool);
+
#ifdef ASM_OUTPUT_POOL_PROLOGUE
ASM_OUTPUT_POOL_PROLOGUE (asm_out_file, fnname, fndecl, pool->offset);
#endif