if (cpuc->excl_cntrs)
                return intel_get_excl_constraints(cpuc, event, idx, c2);
 
-       /* Not all counters support the branch counter feature. */
-       if (branch_sample_counters(event)) {
+       if (event->hw.dyn_constraint != ~0ULL) {
                c2 = dyn_constraint(cpuc, c2, idx);
-               c2->idxmsk64 &= x86_pmu.lbr_counters;
+               c2->idxmsk64 &= event->hw.dyn_constraint;
                c2->weight = hweight64(c2->idxmsk64);
        }
 
                leader = event->group_leader;
                if (branch_sample_call_stack(leader))
                        return -EINVAL;
-               if (branch_sample_counters(leader))
+               if (branch_sample_counters(leader)) {
                        num++;
+                       leader->hw.dyn_constraint &= x86_pmu.lbr_counters;
+               }
                leader->hw.flags |= PERF_X86_EVENT_BRANCH_COUNTERS;
 
                for_each_sibling_event(sibling, leader) {
                        if (branch_sample_call_stack(sibling))
                                return -EINVAL;
-                       if (branch_sample_counters(sibling))
+                       if (branch_sample_counters(sibling)) {
                                num++;
+                               sibling->hw.dyn_constraint &= x86_pmu.lbr_counters;
+                       }
                }
 
                if (num > fls(x86_pmu.lbr_counters))
                        goto err;
        }
 
-       if (x86_pmu.flags & (PMU_FL_EXCL_CNTRS | PMU_FL_TFA | PMU_FL_BR_CNTR)) {
+       if (x86_pmu.flags & (PMU_FL_EXCL_CNTRS | PMU_FL_TFA | PMU_FL_DYN_CONSTRAINT)) {
                size_t sz = X86_PMC_IDX_MAX * sizeof(struct event_constraint);
 
                cpuc->constraint_list = kzalloc_node(sz, GFP_KERNEL, cpu_to_node(cpu));
                        pr_cont(" AnyThread deprecated, ");
        }
 
+       /*
+        * Many features on and after V6 require dynamic constraint,
+        * e.g., Arch PEBS, ACR.
+        */
+       if (version >= 6)
+               x86_pmu.flags |= PMU_FL_DYN_CONSTRAINT;
        /*
         * Install the hw-cache-events table:
         */
 
 #define PMU_FL_MEM_LOADS_AUX   0x100 /* Require an auxiliary event for the complete memory info */
 #define PMU_FL_RETIRE_LATENCY  0x200 /* Support Retire Latency in PEBS */
 #define PMU_FL_BR_CNTR         0x400 /* Support branch counter logging */
+#define PMU_FL_DYN_CONSTRAINT  0x800 /* Needs dynamic constraint */
 
 #define EVENT_VAR(_id)  event_attr_##_id
 #define EVENT_PTR(_id) &event_attr_##_id.attr.attr