1 // RUN: %clang_cc1 -emit-llvm -O1 -o - %s | FileCheck %s
2 // RUN: %clang_cc1 -emit-llvm -O1 -fexceptions -o - %s | FileCheck --check-prefix=CHECK-EH %s
4 // Test code generation for the named return value optimization.
12 // CHECK: define void @_Z5test0v
13 // CHECK-EH: define void @_Z5test0v
16 // CHECK: call void @_ZN1XC1Ev
17 // CHECK-NEXT: ret void
19 // CHECK-EH: call void @_ZN1XC1Ev
20 // CHECK-EH-NEXT: ret void
24 // CHECK: define void @_Z5test1b(
25 // CHECK-EH: define void @_Z5test1b(
27 // CHECK: tail call void @_ZN1XC1Ev
28 // CHECK-NEXT: ret void
33 // CHECK-EH: tail call void @_ZN1XC1Ev
34 // CHECK-EH-NEXT: ret void
37 // CHECK: define void @_Z5test2b
38 // CHECK-EH: define void @_Z5test2b
48 // CHECK: call void @_ZN1XC1Ev
49 // CHECK-NEXT: call void @_ZN1XC1Ev
50 // CHECK: call void @_ZN1XC1ERKS_
51 // CHECK: call void @_ZN1XC1ERKS_
52 // CHECK: call void @_ZN1XD1Ev
53 // CHECK: call void @_ZN1XD1Ev
56 // The block ordering in the -fexceptions IR is unfortunate.
58 // CHECK-EH: call void @_ZN1XC1Ev
59 // CHECK-EH-NEXT: invoke void @_ZN1XC1Ev
60 // -> %invoke.cont, %lpad
64 // -> %if.then, %if.end
66 // %if.then: returning 'x'
67 // CHECK-EH: invoke void @_ZN1XC1ERKS_
68 // -> %cleanup, %lpad1
70 // %lpad: landing pad for ctor of 'y', dtor of 'y'
71 // CHECK-EH: call i8* @llvm.eh.exception()
72 // CHECK-EH: call i32 (i8*, i8*, ...)* @llvm.eh.selector
73 // CHECK-EH-NEXT: br label
76 // %lpad1: landing pad for return copy ctors, EH cleanup for 'y'
77 // CHECK-EH: invoke void @_ZN1XD1Ev
78 // -> %eh.cleanup, %terminate.lpad
80 // %if.end: returning 'y'
81 // CHECK-EH: invoke void @_ZN1XC1ERKS_
82 // -> %cleanup, %lpad1
84 // %cleanup: normal cleanup for 'y'
85 // CHECK-EH: invoke void @_ZN1XD1Ev
86 // -> %invoke.cont11, %lpad
88 // %invoke.cont11: normal cleanup for 'x'
89 // CHECK-EH: call void @_ZN1XD1Ev
90 // CHECK-EH-NEXT: ret void
92 // %eh.cleanup: EH cleanup for 'x'
93 // CHECK-EH: invoke void @_ZN1XD1Ev
94 // -> %invoke.cont17, %terminate.lpad
96 // %invoke.cont17: rethrow block for %eh.cleanup.
97 // This really should be elsewhere in the function.
98 // CHECK-EH: call void @_Unwind_Resume_or_Rethrow
99 // CHECK-EH-NEXT: unreachable
101 // %terminate.lpad: terminate landing pad.
102 // CHECK-EH: call i8* @llvm.eh.exception()
103 // CHECK-EH-NEXT: call i32 (i8*, i8*, ...)* @llvm.eh.selector
104 // CHECK-EH-NEXT: call void @_ZSt9terminatev()
105 // CHECK-EH-NEXT: unreachable
110 // FIXME: We don't manage to apply NRVO here, although we could.
119 extern "C" void exit(int) throw();
121 // CHECK: define void @_Z5test4b
124 // CHECK: tail call void @_ZN1XC1Ev
130 // CHECK: tail call void @_ZN1XD1Ev
131 // CHECK: tail call void @exit(i32 1)