mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-19 01:13:25 +00:00
a3a68bde21
Reorder operations to remove duplicated work. Fix to leave floating-point types out of the optimization. Add tests to predsimplify.ll for SwitchInst and SelectInst handling. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30055 91177308-0d34-0410-b5e6-96231b3b80d8
293 lines
4.8 KiB
LLVM
293 lines
4.8 KiB
LLVM
; RUN: llvm-as < %s | opt -predsimplify -instcombine -simplifycfg | llvm-dis | grep -v declare | not grep fail &&
|
|
; RUN: llvm-as < %s | opt -predsimplify -instcombine -simplifycfg | llvm-dis | grep -v declare | grep pass | wc -l | grep 3
|
|
|
|
void %test1(int %x) {
|
|
entry:
|
|
%A = seteq int %x, 0
|
|
br bool %A, label %then.1, label %else.1
|
|
then.1:
|
|
%B = seteq int %x, 1
|
|
br bool %B, label %then.2, label %else.1
|
|
then.2:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
else.1:
|
|
ret void
|
|
}
|
|
|
|
void %test2(int %x) {
|
|
entry:
|
|
%A = seteq int %x, 0
|
|
%B = seteq int %x, 1
|
|
br bool %A, label %then.1, label %else.1
|
|
then.1:
|
|
br bool %B, label %then.2, label %else.1
|
|
then.2:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
else.1:
|
|
ret void
|
|
}
|
|
|
|
void %test3(int %x) {
|
|
entry:
|
|
%A = seteq int %x, 0
|
|
%B = seteq int %x, 1
|
|
br bool %A, label %then.1, label %else.1
|
|
then.1:
|
|
br bool %B, label %then.2, label %else.1
|
|
then.2:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
else.1:
|
|
ret void
|
|
}
|
|
|
|
void %test4(int %x, int %y) {
|
|
entry:
|
|
%A = seteq int %x, 0
|
|
%B = seteq int %y, 0
|
|
%C = and bool %A, %B
|
|
br bool %C, label %then.1, label %else.1
|
|
then.1:
|
|
%D = seteq int %x, 0
|
|
br bool %D, label %then.2, label %else.2
|
|
then.2:
|
|
%E = seteq int %y, 0
|
|
br bool %E, label %else.1, label %else.2
|
|
else.1:
|
|
ret void
|
|
else.2:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
}
|
|
|
|
void %test5(int %x) {
|
|
entry:
|
|
%A = seteq int %x, 0
|
|
br bool %A, label %then.1, label %else.1
|
|
then.1:
|
|
ret void
|
|
then.2:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
else.1:
|
|
%B = seteq int %x, 0
|
|
br bool %B, label %then.2, label %then.1
|
|
}
|
|
|
|
void %test6(int %x, int %y) {
|
|
entry:
|
|
%A = seteq int %x, 0
|
|
%B = seteq int %y, 0
|
|
%C = or bool %A, %B
|
|
br bool %C, label %then.1, label %else.1
|
|
then.1:
|
|
ret void
|
|
then.2:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
else.1:
|
|
%D = seteq int %x, 0
|
|
br bool %D, label %then.2, label %else.2
|
|
else.2:
|
|
%E = setne int %y, 0
|
|
br bool %E, label %then.1, label %then.2
|
|
}
|
|
|
|
void %test7(int %x) {
|
|
entry:
|
|
%A = setne int %x, 0
|
|
%B = xor bool %A, true
|
|
br bool %B, label %then.1, label %else.1
|
|
then.1:
|
|
%C = seteq int %x, 1
|
|
br bool %C, label %then.2, label %else.1
|
|
then.2:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
else.1:
|
|
ret void
|
|
}
|
|
|
|
void %test8(int %x) {
|
|
entry:
|
|
%A = add int %x, 1
|
|
%B = seteq int %x, 0
|
|
br bool %B, label %then.1, label %then.2
|
|
then.1:
|
|
%C = seteq int %A, 1
|
|
br bool %C, label %then.2, label %else.2
|
|
then.2:
|
|
ret void
|
|
else.2:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
}
|
|
|
|
void %test9(int %y, int %z) {
|
|
entry:
|
|
%x = add int %y, %z
|
|
%A = seteq int %y, 3
|
|
%B = seteq int %z, 5
|
|
%C = and bool %A, %B
|
|
br bool %C, label %cond_true, label %return
|
|
|
|
cond_true:
|
|
%D = seteq int %x, 8
|
|
br bool %D, label %then, label %oops
|
|
|
|
then:
|
|
call void (...)* %pass( )
|
|
ret void
|
|
|
|
oops:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
|
|
return:
|
|
ret void
|
|
}
|
|
|
|
void %switch1(int %x) {
|
|
entry:
|
|
%A = seteq int %x, 10
|
|
br bool %A, label %return, label %cond_false
|
|
|
|
cond_false:
|
|
switch int %x, label %return [
|
|
int 9, label %then1
|
|
int 10, label %then2
|
|
]
|
|
|
|
then1:
|
|
call void (...)* %pass( )
|
|
ret void
|
|
|
|
then2:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
|
|
return:
|
|
ret void
|
|
}
|
|
|
|
void %switch2(int %x) {
|
|
entry:
|
|
%A = seteq int %x, 10
|
|
br bool %A, label %return, label %cond_false
|
|
|
|
cond_false:
|
|
switch int %x, label %return [
|
|
int 8, label %then1
|
|
int 9, label %then1
|
|
int 10, label %then1
|
|
]
|
|
|
|
then1:
|
|
%B = setne int %x, 8
|
|
br bool %B, label %then2, label %return
|
|
|
|
then2:
|
|
call void (...)* %pass( )
|
|
ret void
|
|
|
|
return:
|
|
ret void
|
|
}
|
|
|
|
void %switch3(int %x) {
|
|
entry:
|
|
%A = seteq int %x, 10
|
|
br bool %A, label %return, label %cond_false
|
|
|
|
cond_false:
|
|
switch int %x, label %return [
|
|
int 9, label %then1
|
|
int 10, label %then1
|
|
]
|
|
|
|
then1:
|
|
%B = seteq int %x, 9
|
|
br bool %B, label %return, label %oops
|
|
|
|
oops:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
|
|
return:
|
|
ret void
|
|
}
|
|
|
|
void %switch4(int %x) {
|
|
entry:
|
|
%A = seteq int %x, 10
|
|
br bool %A, label %then1, label %cond_false
|
|
|
|
cond_false:
|
|
switch int %x, label %default [
|
|
int 9, label %then1
|
|
int 10, label %then2
|
|
]
|
|
|
|
then1:
|
|
ret void
|
|
|
|
then2:
|
|
ret void
|
|
|
|
default:
|
|
%B = seteq int %x, 9
|
|
br bool %B, label %oops, label %then1
|
|
|
|
oops:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
}
|
|
|
|
void %select1(int %x) {
|
|
entry:
|
|
%A = seteq int %x, 10
|
|
%B = select bool %A, int 1, int 2
|
|
%C = seteq int %B, 1
|
|
br bool %C, label %then, label %else
|
|
|
|
then:
|
|
br bool %A, label %return, label %oops
|
|
|
|
else:
|
|
br bool %A, label %oops, label %return
|
|
|
|
oops:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
|
|
return:
|
|
ret void
|
|
}
|
|
|
|
void %select2(int %x) {
|
|
entry:
|
|
%A = seteq int %x, 10
|
|
%B = select bool %A, int 1, int 2
|
|
%C = seteq int %B, 1
|
|
br bool %A, label %then, label %else
|
|
|
|
then:
|
|
br bool %C, label %return, label %oops
|
|
|
|
else:
|
|
br bool %C, label %oops, label %return
|
|
|
|
oops:
|
|
call void (...)* %fail( )
|
|
ret void
|
|
|
|
return:
|
|
ret void
|
|
}
|
|
|
|
declare void %fail(...)
|
|
|
|
declare void %pass(...)
|