| ; RUN: llvm-as < %s | opt -cee -constprop -instcombine -dce | llvm-dis | not grep 'REMOVE' |
| |
| int %test1(int %A) { |
| %cond = seteq int %A, 40 |
| br bool %cond, label %T, label %F |
| T: |
| %REMOVE = add int %A, 2 ; Should become = 42 |
| ret int %REMOVE |
| F: |
| ret int 8 |
| } |
| |
| bool %test2(int %A) { |
| %cond = seteq int %A, 40 |
| br bool %cond, label %T, label %F |
| T: |
| %REMOVE = seteq int %A, 2 ; Should become = false |
| ret bool %REMOVE |
| F: |
| ret bool false |
| } |
| |
| bool %test3(int %A) { |
| %cond = setlt int %A, 40 |
| br bool %cond, label %T, label %F |
| T: |
| %REMOVE = setgt int %A, 47 ; Should become = false |
| ret bool %REMOVE |
| F: |
| %REMOVE2 = setge int %A, 40 ; Should become = true |
| ret bool %REMOVE2 |
| } |
| |
| bool %test4(int %A) { |
| %cond = setlt int %A, 40 |
| br bool %cond, label %T, label %F |
| T: |
| %REMOVE = setgt int %A, 47 ; Should become = false |
| ret bool %REMOVE |
| F: |
| ret bool false |
| } |
| |
| int %test5(int %A, int %B) { |
| %cond = setne int %A, %B |
| br bool %cond, label %F, label %T |
| T: |
| %C = sub int %A, %B ; = 0 |
| ret int %C |
| F: |
| ret int 0 |
| } |
| |
| bool %test6(int %A) { |
| %REMOVE = setlt int %A, 47 ; Should become dead |
| %cond = setlt int %A, 40 |
| br bool %cond, label %T, label %F |
| T: |
| ret bool %REMOVE ;; == true |
| F: |
| ret bool false |
| } |
| |
| bool %test7(int %A) { |
| %cond = setlt int %A, 40 |
| br bool %cond, label %T, label %F |
| T: |
| %REMOVE = xor bool %cond, true |
| ret bool %REMOVE |
| F: |
| ret bool false |
| } |
| |
| ; Test that and expressions are handled... |
| bool %test8(int %A, int %B) { |
| %cond1 = setle int %A, 7 |
| %cond2 = setle int %B, 7 |
| %cond = and bool %cond1, %cond2 |
| br bool %cond, label %T, label %F |
| T: |
| %REMOVE1 = seteq int %A, 9 ; false |
| %REMOVE2 = setge int %B, 9 ; false |
| %REMOVE = or bool %REMOVE1, %REMOVE2 ; false |
| ret bool %REMOVE |
| F: |
| ret bool false |
| } |
| |
| ; Test that or expressions are handled... |
| bool %test9(int %A, int %B) { |
| %cond1 = setle int %A, 7 |
| %cond2 = setle int %B, 7 |
| %cond = or bool %cond1, %cond2 |
| br bool %cond, label %T, label %F |
| T: |
| ret bool false |
| F: |
| %REMOVE1 = setge int %A, 8 ; true |
| %REMOVE2 = setge int %B, 8 ; true |
| %REMOVE = or bool %REMOVE1, %REMOVE2 ; true |
| ret bool %REMOVE |
| } |
| |
| bool %test10(int %A) { |
| %cond = setle int %A, 7 |
| br bool %cond, label %T, label %F |
| T: |
| ret bool false |
| F: |
| %REMOVE = setge int %A, 8 |
| ret bool %REMOVE |
| } |
| |
| ; Implement correlated comparisons against non-constants |
| bool %test11(int %A, int %B) { |
| %cond = setlt int %A, %B |
| br bool %cond, label %T, label %F |
| T: |
| %REMOVE1 = seteq int %A, %B ; false |
| %REMOVE2 = setle int %A, %B ; true |
| %cond2 = and bool %REMOVE1, %REMOVE2 |
| ret bool %cond2 |
| F: |
| ret bool true |
| } |
| |
| bool %test12(int %A) { |
| %cond = setlt int %A, 0 |
| br bool %cond, label %T, label %F |
| T: |
| %REMOVE = setne int %A, 0 ; true |
| ret bool %REMOVE |
| F: |
| ret bool false |
| } |