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