diff --git a/hercules_opt/src/float_collections.rs b/hercules_opt/src/float_collections.rs
index 6ef050c2430a32673140db49543bbbf96462d58e..d64b3f806a5099c8eacdb296d5962b31357f8976 100644
--- a/hercules_opt/src/float_collections.rs
+++ b/hercules_opt/src/float_collections.rs
@@ -1,4 +1,4 @@
-use std::collections::BTreeMap;
+use std::collections::{BTreeMap, HashMap};
 
 use hercules_ir::*;
 
@@ -83,10 +83,6 @@ pub fn float_collections(
                 .map(|(idx, node)| (NodeID::new(idx), node.clone()))
                 .collect();
             let success = editors.get_mut(&caller).unwrap().edit(|mut edit| {
-                let cons_ids: Vec<_> = cons
-                    .iter()
-                    .map(|(_, node)| edit.add_node(node.clone()))
-                    .collect();
                 for (id, node) in calls {
                     let Node::Call {
                         control,
@@ -97,6 +93,19 @@ pub fn float_collections(
                     else {
                         panic!()
                     };
+                    let dc_args = (0..dynamic_constants.len())
+                        .map(|i| edit.add_dynamic_constant(DynamicConstant::Parameter(i)));
+                    let substs = dc_args
+                        .zip(dynamic_constants.iter().map(|id| *id))
+                        .collect::<HashMap<_, _>>();
+                    let cons_ids: Vec<_> = cons
+                        .iter()
+                        .map(|(_, node)| {
+                            let mut node = node.clone();
+                            substitute_dynamic_constants_in_node(&substs, &mut node, &mut edit);
+                            edit.add_node(node)
+                        })
+                        .collect();
                     let mut args = Vec::from(args);
                     args.extend(cons_ids.iter());
                     let new_call = edit.add_node(Node::Call {