in reply to having a hash maintain order when passed to a sub

The only thing that can be passed to a sub is a list of scalars. You did not pass a hash to the sub, and the new hash you created in the sub isn't an IxHash. Solutions:
sub printh { tie my %x, 'Tie::IxHash', @_; # Recreate the hash. Expensive warn $_ for keys %x; } printh(%h); # Flatten the hash
sub printh { my ($x) = @_; warn $_ for keys %$x; } printh(\%h); # Pass a reference