It's a bug that's been fixed in 5.22.0.
From perl5220delta.pod:
Assignment to a lexical scalar is often optimised away; for example in
C<my $x; $x = $y + $z>, the assign operator is optimised away and the
+add
operator writes its result directly to C<$x>. Various bugs related to
this optimisation have been fixed. Certain operators on the right-han
+d
side would sometimes fail to assign the value at all or assign the wro
+ng
value, or would call STORE twice or not at all on tied variables. The
operators affected were C<$foo++>, C<$foo-->, and C<-$foo> under C<use
integer>, C<chomp>, C<chr> and C<setpgrp>.
Dave.