diff --git a/hercules_ir/src/typecheck.rs b/hercules_ir/src/typecheck.rs
index 262ce6f8465ac362d47e4ce78d3e0639154e7035..244d8d198dc9f619eeb7afb9229a0b62575cacad 100644
--- a/hercules_ir/src/typecheck.rs
+++ b/hercules_ir/src/typecheck.rs
@@ -1,3 +1,4 @@
+use std::cmp::{max, min};
 use std::collections::HashMap;
 use std::iter::zip;
 
@@ -1152,8 +1153,15 @@ fn dyn_consts_match(
         (DynamicConstant::Constant(x), DynamicConstant::Constant(y)) => x == y,
         (DynamicConstant::Parameter(i), _) => input == dc_args[*i],
         (DynamicConstant::Add(pl, pr), DynamicConstant::Add(il, ir))
-        | (DynamicConstant::Sub(pl, pr), DynamicConstant::Sub(il, ir))
         | (DynamicConstant::Mul(pl, pr), DynamicConstant::Mul(il, ir))
+        | (DynamicConstant::Min(pl, pr), DynamicConstant::Min(il, ir))
+        | (DynamicConstant::Max(pl, pr), DynamicConstant::Max(il, ir)) => {
+            // Normalize for associative ops by always looking at smaller DC ID
+            // as left arm and larger DC ID as right arm.
+            dyn_consts_match(dynamic_constants, dc_args, min(*pl, *pr), min(*il, *ir))
+                && dyn_consts_match(dynamic_constants, dc_args, max(*pl, *pr), max(*il, *ir))
+        }
+        (DynamicConstant::Sub(pl, pr), DynamicConstant::Sub(il, ir))
         | (DynamicConstant::Div(pl, pr), DynamicConstant::Div(il, ir))
         | (DynamicConstant::Rem(pl, pr), DynamicConstant::Rem(il, ir)) => {
             dyn_consts_match(dynamic_constants, dc_args, *pl, *il)