mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-26 12:20:42 +00:00
enhance the "change or icmp's into switch" xform to handle one value in an
'or sequence' that it doesn't understand. This allows us to optimize
something insane like this:
int crud (unsigned char c, unsigned x)
{
if(((((((((( (int) c <= 32 ||
(int) c == 46) || (int) c == 44)
|| (int) c == 58) || (int) c == 59) || (int) c == 60)
|| (int) c == 62) || (int) c == 34) || (int) c == 92)
|| (int) c == 39) != 0)
foo();
}
into:
define i32 @crud(i8 zeroext %c, i32 %x) nounwind ssp noredzone {
entry:
%cmp = icmp ult i8 %c, 33
br i1 %cmp, label %if.then, label %switch.early.test
switch.early.test: ; preds = %entry
switch i8 %c, label %if.end [
i8 39, label %if.then
i8 44, label %if.then
i8 58, label %if.then
i8 59, label %if.then
i8 60, label %if.then
i8 62, label %if.then
i8 46, label %if.then
i8 92, label %if.then
i8 34, label %if.then
]
by pulling the < comparison out ahead of the newly formed switch.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121680 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -149,7 +149,30 @@ UnifiedReturnBlock: ; preds = %shortcirc_done.4, %shortcirc_next.4
|
||||
; CHECK: i32 18, label %UnifiedReturnBlock
|
||||
; CHECK: i32 19, label %switch.edge
|
||||
; CHECK: ]
|
||||
|
||||
}
|
||||
|
||||
define void @test7(i8 zeroext %c, i32 %x) nounwind ssp noredzone {
|
||||
entry:
|
||||
%cmp = icmp ult i32 %x, 32
|
||||
%cmp4 = icmp eq i8 %c, 97
|
||||
%or.cond = or i1 %cmp, %cmp4
|
||||
%cmp9 = icmp eq i8 %c, 99
|
||||
%or.cond11 = or i1 %or.cond, %cmp9
|
||||
br i1 %or.cond11, label %if.then, label %if.end
|
||||
|
||||
if.then: ; preds = %entry
|
||||
tail call void @foo1() nounwind noredzone
|
||||
ret void
|
||||
|
||||
if.end: ; preds = %entry
|
||||
ret void
|
||||
|
||||
; CHECK: @test7
|
||||
; CHECK: %cmp = icmp ult i32 %x, 32
|
||||
; CHECK: br i1 %cmp, label %if.then, label %switch.early.test
|
||||
; CHECK: switch.early.test:
|
||||
; CHECK: switch i8 %c, label %if.end [
|
||||
; CHECK: i8 99, label %if.then
|
||||
; CHECK: i8 97, label %if.then
|
||||
; CHECK: ]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user