xref: /llvm-project/llvm/test/Transforms/InstCombine/sink-into-resume-block.ll (revision 4ab40eca080965c65802710e39adbb78c4ce7bde)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=instcombine -S < %s | FileCheck %s
3
4; Check that InstCombine can sink instructions to the landingpad of the invoke.
5
6define void @t0_noop(i32 %arg) personality ptr @__gxx_personality_v0 {
7; CHECK-LABEL: @t0_noop(
8; CHECK-NEXT:  entry:
9; CHECK-NEXT:    [[C:%.*]] = call i1 @cond()
10; CHECK-NEXT:    br i1 [[C]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
11; CHECK:       if.then:
12; CHECK-NEXT:    invoke void @simple_throw()
13; CHECK-NEXT:    to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
14; CHECK:       invoke.cont:
15; CHECK-NEXT:    unreachable
16; CHECK:       lpad:
17; CHECK-NEXT:    [[EH:%.*]] = landingpad { ptr, i32 }
18; CHECK-NEXT:    cleanup
19; CHECK-NEXT:    [[V0:%.*]] = add i32 [[ARG:%.*]], 42
20; CHECK-NEXT:    call void @consume(i32 [[V0]])
21; CHECK-NEXT:    call void @destructor()
22; CHECK-NEXT:    resume { ptr, i32 } [[EH]]
23; CHECK:       if.end:
24; CHECK-NEXT:    [[V1:%.*]] = add i32 [[ARG]], 24
25; CHECK-NEXT:    call void @consume(i32 [[V1]])
26; CHECK-NEXT:    call void @sideeffect()
27; CHECK-NEXT:    ret void
28;
29entry:
30  %c = call i1 @cond()
31  %v0 = add i32 %arg, 42
32  %v1 = add i32 %arg, 24
33  br i1 %c, label %if.then, label %if.end
34
35if.then:
36  invoke void @simple_throw() to label %invoke.cont unwind label %lpad
37
38invoke.cont:
39  unreachable
40
41lpad:
42  %eh = landingpad { ptr, i32 } cleanup
43  call void @consume(i32 %v0)
44  call void @destructor()
45  resume { ptr, i32 } %eh
46
47if.end:
48  call void @consume(i32 %v1)
49  call void @sideeffect()
50  ret void
51}
52
53declare i1 @cond()
54
55declare void @sideeffect()
56
57declare void @simple_throw() noreturn
58
59declare void @destructor()
60
61declare void @consume(i32)
62
63declare dso_local i32 @__gxx_personality_v0(...)
64