[NFC] Add some tests on mustexec

llvm-svn: 339219
This commit is contained in:
Max Kazantsev 2018-08-08 04:40:47 +00:00
parent 77e898cbd0
commit c9dca6df78
1 changed files with 149 additions and 0 deletions

View File

@ -280,3 +280,152 @@ fail:
call void @f()
ret i32 -1
}
declare void @may_throw() inaccessiblememonly
; Test that we can sink a mustexecute load from loop header even in presence of
; throwing instructions after it.
define void @test_hoist_from_header_01(i32* %p, i32 %n) {
; CHECK-LABEL: @test_hoist_from_header_01(
; CHECK: entry:
; CHECK-NEXT: %load = load i32, i32* %p
; CHECK-NOT: load i32
entry:
br label %loop
loop:
%iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
%dummy = phi i32 [ 0, %entry ], [ %merge, %backedge ]
%load = load i32, i32* %p
call void @may_throw()
%cond = icmp slt i32 %iv, %n
br i1 %cond, label %if.true, label %if.false
if.true:
%a = add i32 %iv, %iv
br label %backedge
if.false:
%b = mul i32 %iv, %iv
br label %backedge
backedge:
%merge = phi i32 [ %a, %if.true ], [ %b, %if.false ]
%iv.next = add i32 %iv, %merge
%loop.cond = icmp ult i32 %iv.next, %load
br i1 %loop.cond, label %loop, label %exit
exit:
ret void
}
define void @test_hoist_from_header_02(i32* %p, i32 %n) {
; CHECK-LABEL: @test_hoist_from_header_02(
; CHECK: entry:
; CHECK-NEXT: %load = load i32, i32* %p
; CHECK-NOT: load i32
entry:
br label %loop
loop:
%iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
%dummy = phi i32 [ 0, %entry ], [ %merge, %backedge ]
%load = load i32, i32* %p
%cond = icmp slt i32 %iv, %n
br i1 %cond, label %if.true, label %if.false
if.true:
call void @may_throw()
%a = add i32 %iv, %iv
br label %backedge
if.false:
%b = mul i32 %iv, %iv
br label %backedge
backedge:
%merge = phi i32 [ %a, %if.true ], [ %b, %if.false ]
%iv.next = add i32 %iv, %merge
%loop.cond = icmp ult i32 %iv.next, %load
br i1 %loop.cond, label %loop, label %exit
exit:
ret void
}
define void @test_hoist_from_header_03(i32* %p, i32 %n) {
; CHECK-LABEL: @test_hoist_from_header_03(
; CHECK: entry:
; CHECK-NEXT: %load = load i32, i32* %p
; CHECK-NOT: load i32
entry:
br label %loop
loop:
%iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
%dummy = phi i32 [ 0, %entry ], [ %merge, %backedge ]
%load = load i32, i32* %p
%cond = icmp slt i32 %iv, %n
br i1 %cond, label %if.true, label %if.false
if.true:
%a = add i32 %iv, %iv
br label %backedge
if.false:
%b = mul i32 %iv, %iv
br label %backedge
backedge:
%merge = phi i32 [ %a, %if.true ], [ %b, %if.false ]
call void @may_throw()
%iv.next = add i32 %iv, %merge
%loop.cond = icmp ult i32 %iv.next, %load
br i1 %loop.cond, label %loop, label %exit
exit:
ret void
}
; Check that a throwing instruction prohibits hoisting across it.
define void @test_hoist_from_header_04(i32* %p, i32 %n) {
; CHECK-LABEL: @test_hoist_from_header_04(
; CHECK: entry:
; CHECK: loop:
; CHECK: %load = load i32, i32* %p
entry:
br label %loop
loop:
%iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
%dummy = phi i32 [ 0, %entry ], [ %merge, %backedge ]
call void @may_throw()
%load = load i32, i32* %p
%cond = icmp slt i32 %iv, %n
br i1 %cond, label %if.true, label %if.false
if.true:
%a = add i32 %iv, %iv
br label %backedge
if.false:
%b = mul i32 %iv, %iv
br label %backedge
backedge:
%merge = phi i32 [ %a, %if.true ], [ %b, %if.false ]
%iv.next = add i32 %iv, %merge
%loop.cond = icmp ult i32 %iv.next, %load
br i1 %loop.cond, label %loop, label %exit
exit:
ret void
}