diff --git a/src/freedreno/ir3/ir3.c b/src/freedreno/ir3/ir3.c
index 94a9bfaf71e..086f4cb16a9 100644
--- a/src/freedreno/ir3/ir3.c
+++ b/src/freedreno/ir3/ir3.c
@@ -380,6 +380,7 @@ ir3_collect_info(struct ir3_shader_variant *v)
info->sizedwords = info->size / 4;
info->early_preamble = v->early_preamble;
+ info->loops = v->loops;
bool in_preamble = false;
bool has_eq = false;
diff --git a/src/freedreno/ir3/ir3.h b/src/freedreno/ir3/ir3.h
index 89c63f11ab9..864642f9dc7 100644
--- a/src/freedreno/ir3/ir3.h
+++ b/src/freedreno/ir3/ir3.h
@@ -42,6 +42,7 @@ struct ir3_info {
uint16_t nops_count; /* # of nop instructions, including nopN */
uint16_t mov_count;
uint16_t cov_count;
+ uint16_t loops;
uint16_t stp_count;
uint16_t ldp_count;
/* NOTE: max_reg, etc, does not include registers not touched
diff --git a/src/freedreno/vulkan/tu_pipeline.cc b/src/freedreno/vulkan/tu_pipeline.cc
index 5081bbf4aa9..161f2a4e71a 100644
--- a/src/freedreno/vulkan/tu_pipeline.cc
+++ b/src/freedreno/vulkan/tu_pipeline.cc
@@ -4952,6 +4952,7 @@ tu_GetPipelineExecutableStatisticsKHR(
stats.sy = exe->stats.sy;
stats.ss_stall = exe->stats.sstall;
stats.sy_stall = exe->stats.systall;
+ stats.loops = exe->stats.loops;
stats.stps = exe->stats.stp_count;
stats.ldps = exe->stats.ldp_count;
stats.preamble_inst = exe->stats.preamble_instrs_count;
diff --git a/src/util/shader_stats.xml b/src/util/shader_stats.xml
index 10c449f8de3..36f870b9060 100644
--- a/src/util/shader_stats.xml
+++ b/src/util/shader_stats.xml
@@ -15,6 +15,7 @@
A better metric to estimate the impact of SS syncs.
A better metric to estimate the impact of SY syncs.
Number of cat# instructions.
+ Number of hardware loops
Number of STore Private instructions in the final generated shader executable.
Number of LoaD Private instructions in the final generated shader executable.
Total number of IR3 instructions in the preamble.