diff --git a/gcc/function.h b/gcc/function.h
index f0f48648504..9a678741f6c 100644
--- a/gcc/function.h
+++ b/gcc/function.h
@@ -243,34 +243,27 @@ public:
   (current_function_dynamic_stack_size != 0               \
    || current_function_has_unbounded_dynamic_stack_size)
 
+/* Pass properties set on function::curr_properties.  */
+enum class PROP_bitnum
+{
+#define PROP(a) PROP_BIT_##a ,
+#include "ir-prop.def"
+PROP_BIT_end
+};
+
+typedef unsigned int function_prop_type;
+/* Make sure current_properties has enough bits for the properties. */
+static_assert ((size_t)PROP_bitnum::PROP_BIT_end
+		<= (sizeof(function_prop_type) * CHAR_BIT),
+	       "too many properties for prop type");
 
 /* Pass properties set on function::curr_properties.  */
-#define PROP_gimple_any		(1 << 0)	/* entire gimple grammar */
-#define PROP_gimple_lcf		(1 << 1)	/* lowered control flow */
-#define PROP_gimple_leh		(1 << 2)	/* lowered eh */
-#define PROP_cfg		(1 << 3)
-#define PROP_objsz		(1 << 4)	/* object sizes computed */
-#define PROP_ssa		(1 << 5)
-/* UNUSED			(1 << 6) */
-#define PROP_rtl		(1 << 7)
-#define PROP_gimple_lomp	(1 << 8)	/* lowered OpenMP directives */
-#define PROP_cfglayout	 	(1 << 9)	/* cfglayout mode on RTL */
-#define PROP_gimple_lcx		(1 << 10)       /* lowered complex */
-#define PROP_loops		(1 << 11)	/* preserve loop structures */
-#define PROP_gimple_lvec	(1 << 12)       /* lowered vector */
-#define PROP_gimple_eomp	(1 << 13)       /* no OpenMP directives */
-#define PROP_gimple_lva		(1 << 14)       /* No va_arg internal function.  */
-#define PROP_gimple_opt_math	(1 << 15)	/* Disable canonicalization
-						   of math functions; the
-						   current choices have
-						   been optimized.  */
-#define PROP_gimple_lomp_dev	(1 << 16)	/* done omp_device_lower */
-#define PROP_rtl_split_insns	(1 << 17)	/* RTL has insns split.  */
-#define PROP_loop_opts_done	(1 << 18)	/* SSA loop optimizations
-						   have completed.  */
-#define PROP_assumptions_done	(1 << 19)	/* Assume function kept
-						   around.  */
-#define PROP_gimple_lbitint	(1 << 20)       /* lowered large _BitInt */
+enum PROP_bit : function_prop_type
+{
+#define PROP(a) PROP_##a = \
+	((function_prop_type)1) << (function_prop_type)PROP_bitnum::PROP_BIT_##a,
+#include "ir-prop.def"
+};
 
 #define PROP_gimple \
   (PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh | PROP_gimple_lomp)
@@ -364,7 +357,7 @@ struct GTY(()) function {
   location_t function_end_locus;
 
   /* Properties used by the pass manager.  */
-  unsigned int curr_properties;
+  function_prop_type curr_properties;
   unsigned int last_verified;
 
   /* Different from normal TODO_flags which are handled right at the
diff --git a/gcc/ir-prop.def b/gcc/ir-prop.def
new file mode 100644
index 00000000000..7ec6d135a4e
--- /dev/null
+++ b/gcc/ir-prop.def
@@ -0,0 +1,45 @@
+/* Pass properties set on function::curr_properties.
+   Copyright (C) 1989-2024 Free Software Foundation, Inc.
+   Copyright The GNU Toolchain Authors.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+/* PROP (name) defines the property that can be set on
+   function::curr_properties. */
+PROP (gimple_any)	/* entire gimple grammar */
+PROP (gimple_lcf)	/* lowered control flow */
+PROP (gimple_leh)	/* lowered eh */
+PROP (cfg)
+PROP (objsz)		/* object sizes computed */
+PROP (ssa)
+PROP (rtl)
+PROP (gimple_lomp)	/* lowered OpenMP directives */
+PROP (cfglayout)	/* cfglayout mode on RTL */
+PROP (gimple_lcx)	/* lowered complex */
+PROP (loops)		/* preserve loop structures */
+PROP (gimple_lvec)	/* lowered vector */
+PROP (gimple_eomp)	/* no OpenMP directives */
+PROP (gimple_lva)	/* No va_arg internal function.  */
+PROP (gimple_opt_math)	/* Disable canonicalization of math functions; the
+			   current choices have been optimized.  */
+PROP (gimple_lomp_dev)	/* done omp_device_lower */
+PROP (rtl_split_insns)	/* RTL has insns split.  */
+PROP (loop_opts_done)	/* SSA loop optimizations have completed.  */
+PROP (assumptions_done)	/* Assume function kept  around.  */
+PROP (gimple_lbitint)	/* lowered large _BitInt */
+
+#undef PROP
diff --git a/gcc/passes.cc b/gcc/passes.cc
index c494c76808b..1cfc505a24f 100644
--- a/gcc/passes.cc
+++ b/gcc/passes.cc
@@ -3161,39 +3161,32 @@ execute_all_ipa_stmt_fixups (struct cgraph_node *node, gimple **stmts)
 }
 
 
-extern void debug_properties (unsigned int);
-extern void dump_properties (FILE *, unsigned int);
+extern void debug_properties (function_prop_type);
+extern void dump_properties (FILE *, function_prop_type);
 
 DEBUG_FUNCTION void
-dump_properties (FILE *dump, unsigned int props)
+dump_properties (FILE *dump, function_prop_type props)
 {
   fprintf (dump, "Properties:\n");
-  if (props & PROP_gimple_any)
-    fprintf (dump, "PROP_gimple_any\n");
-  if (props & PROP_gimple_lcf)
-    fprintf (dump, "PROP_gimple_lcf\n");
-  if (props & PROP_gimple_leh)
-    fprintf (dump, "PROP_gimple_leh\n");
-  if (props & PROP_cfg)
-    fprintf (dump, "PROP_cfg\n");
-  if (props & PROP_ssa)
-    fprintf (dump, "PROP_ssa\n");
-  if (props & PROP_rtl)
-    fprintf (dump, "PROP_rtl\n");
-  if (props & PROP_gimple_lomp)
-    fprintf (dump, "PROP_gimple_lomp\n");
-  if (props & PROP_gimple_lomp_dev)
-    fprintf (dump, "PROP_gimple_lomp_dev\n");
-  if (props & PROP_gimple_lcx)
-    fprintf (dump, "PROP_gimple_lcx\n");
-  if (props & PROP_gimple_lvec)
-    fprintf (dump, "PROP_gimple_lvec\n");
-  if (props & PROP_cfglayout)
-    fprintf (dump, "PROP_cfglayout\n");
+  static const char *prop_name[] = {
+#define PROP(a) "PROP_" #a ,
+#include "ir-prop.def"
+  };
+  for (unsigned i = 0; i < (sizeof(function_prop_type) * CHAR_BIT); i++)
+    {
+      if ((props & (((function_prop_type)1) << i)) == 0)
+	continue;
+      if (i >= ARRAY_SIZE (prop_name))
+	{
+	  fprintf(dump, "unkown_prop: %d\n", i);
+	  continue;
+	}
+      fprintf(dump, "%s\n", prop_name[i]);
+    }
 }
 
 DEBUG_FUNCTION void
-debug_properties (unsigned int props)
+debug_properties (function_prop_type props)
 {
   dump_properties (stderr, props);
 }
