--- a/src/vim9cmds.c
+++ b/src/vim9cmds.c
@@ -386,7 +386,13 @@
 	isn_T	    *isn;
 
 	isn = ((isn_T *)instr->ga_data) + cur->el_end_label;
-	isn->isn_arg.jump.jump_where = jump_where;
+	// ISN_WHILE keeps its target in "whileloop", not in "jump".  The two
+	// put the int at different offsets when structure members are not
+	// padded (DEC C on VAX), so writing "jump" breaks every :while loop.
+	if (isn->isn_type == ISN_WHILE)
+	    isn->isn_arg.whileloop.while_end = jump_where;
+	else
+	    isn->isn_arg.jump.jump_where = jump_where;
 	*el = cur->el_next;
 	vim_free(cur);
     }
