# Infinite loop at peephole optimization

**URL:** <https://www.ruby-forum.com/t/infinite-loop-at-peephole-optimization/111561>\
**Category:** Development\
**Created:** [August 8, 2007, 4:34pm UTC](https://www.ruby-forum.com/t/infinite-loop-at-peephole-optimization/111561 "2007-08-08T16:34:27Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [August 8, 2007, 4:34pm UTC](https://www.ruby-forum.com/t/infinite-loop-at-peephole-optimization/111561/1 "2007-08-08T16:34:27Z")

</div>

e$B1sF#$H?=$7$^$9!#e(B

while true; redo; end e$B$Ge(B YARV  
e$B$N%3%s%Q%$%k$,;\_$^$i$J$/$J$j$^$9!#e(B

$ ./ruby -ve ‘VM::InstructionSequence.compile(“while true; redo; end”)’  
ruby 1.9.0 (2007-08-08 patchlevel 0) [i686-linux]

(e$B8G$^$ke(B)

peephole optimization e$B$r;\_$a$k$H$A$c$s$H%3%s%Q%$%k$G$-$^$9!#e(B

$ ./ruby -ve ’  
VM::InstructionSequence.compile\_option = { :peephole\_optimization =\>  
false }  
puts VM::InstructionSequence.compile(“while true; redo; end”).disasm  
’  
ruby 1.9.0 (2007-08-08 patchlevel 0) [i686-linux]  
== disasm: \<ISeq:@\>=================================  
== catch table  
| catch type: break st: 0002 ed: 0007 sp: 0000 cont: 0007  
| catch type: next st: 0002 ed: 0007 sp: 0000 cont: 0004

| catch type: redo st: 0002 ed: 0007 sp: 0000 cont: 0002 |
| --- |

0000 jump 4 (  
1)  
0002 jump 2  
0004 jump 2  
0006 putnil  
0007 leave

e$B8+$?46$8e(B iseq\_peephole\_optimize e$B$Ne(B goto again;  
e$B$GL58B%k!\<%W$7$F$$$k$h$&$G$9!#e(B  
e$B@5$7$$=$@5$+$o$+$j$^$;$s$,!"$H$j$"$($:0J2\<$GF0$/$h$&$K$J$j$^$7$?!#e(B

# Index: compile.c

— compile.c (revision 12903)  
+++ compile.c (working copy)  
@@ -1318,8 +1318,10 @@  
REMOVE\_ELEM(&iobj-\>link);  
}  
else if (iobj != diobj && diobj-\>insn\_id == BIN(jump)) {

- 

```
 OPERAND_AT(iobj, 0) = OPERAND_AT(diobj, 0);

```

- 

```
 goto again;

```

- 

```
 if (OPERAND_AT(iobj, 0) != OPERAND_AT(diobj, 0)) {

```

- OPERAND\_AT(iobj, 0) = OPERAND\_AT(diobj, 0);
- goto again;
- 

```
 }

```

}  
else if (diobj-\>insn\_id == BIN(leave)) {  
/\*

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [August 12, 2007, 8:04pm UTC](https://www.ruby-forum.com/t/infinite-loop-at-peephole-optimization/111561/2 "2007-08-12T20:04:19Z")

</div>

e$B!!$5$5$@$G$9!#e(B

Yusuke ENDOH wrote:

> else if (iobj != diobj && diobj-\>insn\_id == BIN(jump)) {
> 
> - 
> 
> ```
> OPERAND_AT(iobj, 0) = OPERAND_AT(diobj, 0);
> 
> ```
> 
> - 
> 
> ```
> goto again;
> 
> ```
> 
> - 
> 
> ```
> if (OPERAND_AT(iobj, 0) != OPERAND_AT(diobj, 0)) {
> 
> ```
> 
> - OPERAND\_AT(iobj, 0) = OPERAND\_AT(diobj, 0);
> - goto again;
> - 
> 
> ```
> }
> 
> ```
> 
> }  
> else if (diobj-\>insn\_id == BIN(leave)) {  
> /\*

e$B!!$"$j$,$H$&$4$6$$$^$9!#B?J,Bg\>fIW$@$H;W$&$N$G%3%\_%C%H$7$^$9!#e(B
