blob: 2f57c6e6bbdb6021b45aba55540879ac649e0959 [file] [log] [blame]
; 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
}