forked from OSchip/llvm-project
Update to use references to attribute groups instead of listing the attributes on the call/invoke instructions.
llvm-svn: 175878
This commit is contained in:
parent
a032374ea0
commit
e1c4a1babd
clang/test
CXX/except/except.spec
CodeGen
builtin-attributes.ccatch-undef-behavior.cfunction-attributes.cmips-constraint-regs.cms-declspecs.cms-inline-asm-64.cms-inline-asm.c
CodeGenCXX
2009-05-04-PureConstNounwind.cppcatch-undef-behavior.cppdebug-info-globalinit.cppdelete.cppdestructors.cppdynamic-cast-always-null.cppdynamic-cast.cppeh.cppexceptions.cppmicrosoft-abi-structors.cppnrvo.cppsizeof-unwind-exception.cpptypeid.cpp
CodeGenObjC
arc-block-copy-escape.marc-blocks.marc-exceptions.marc-foreach.marc-no-arc-exceptions.marc-property.marc-ternary-op.marc-unoptimized-byref-var.marc-with-atthrow.marc.mdebug-info-block-line.mgc.mns_consume_null_check.mobjc-arc-container-subscripting.m
CodeGenObjCXX
|
@ -27,12 +27,12 @@ struct X5 : X0, X4 { };
|
|||
|
||||
void test(X2 x2, X3 x3, X5 x5) {
|
||||
// CHECK: define linkonce_odr void @_ZN2X2C1ERKS_(%struct.X2* %this, %struct.X2*) unnamed_addr
|
||||
// CHECK: call void @_ZN2X2C2ERKS_({{.*}}) nounwind
|
||||
// CHECK: call void @_ZN2X2C2ERKS_({{.*}}) [[NUW:#[0-9]+]]
|
||||
// CHECK-NEXT: ret void
|
||||
// CHECK-NEXT: }
|
||||
X2 x2a(x2);
|
||||
// CHECK: define linkonce_odr void @_ZN2X3C1ERKS_(%struct.X3* %this, %struct.X3*) unnamed_addr
|
||||
// CHECK: call void @_ZN2X3C2ERKS_({{.*}}) nounwind
|
||||
// CHECK: call void @_ZN2X3C2ERKS_({{.*}}) [[NUW]]
|
||||
// CHECK-NEXT: ret void
|
||||
// CHECK-NEXT: }
|
||||
X3 x3a(x3);
|
||||
|
@ -56,7 +56,7 @@ struct X9 : X6, X7 { };
|
|||
|
||||
void test() {
|
||||
// CHECK: define linkonce_odr void @_ZN2X8C1Ev(%struct.X8* %this) unnamed_addr
|
||||
// CHECK: call void @_ZN2X8C2Ev({{.*}}) nounwind
|
||||
// CHECK: call void @_ZN2X8C2Ev({{.*}}) [[NUW]]
|
||||
// CHECK-NEXT: ret void
|
||||
X8();
|
||||
|
||||
|
@ -67,13 +67,15 @@ void test() {
|
|||
X9();
|
||||
|
||||
// CHECK: define linkonce_odr void @_ZN2X9C2Ev(%struct.X9* %this) unnamed_addr
|
||||
// CHECK: call void @_ZN2X6C2Ev({{.*}}) nounwind
|
||||
// CHECK: call void @_ZN2X6C2Ev({{.*}}) [[NUW]]
|
||||
// FIXME: and here:
|
||||
// CHECK-NEXT: bitcast
|
||||
// CHECK-NEXT: call void @_ZN2X7C2Ev({{.*}})
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define linkonce_odr void @_ZN2X8C2Ev(%struct.X8* %this) unnamed_addr
|
||||
// CHECK: call void @_ZN2X6C2Ev({{.*}}) nounwind
|
||||
// CHECK: call void @_ZN2X6C2Ev({{.*}}) [[NUW]]
|
||||
// CHECK-NEXT: ret void
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind{{.*}} }
|
||||
|
|
|
@ -10,7 +10,7 @@ void target() noexcept
|
|||
// CHECK: [[T0:%.*]] = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
||||
// CHECK-NEXT: catch i8* null
|
||||
// CHECK-NEXT: [[T1:%.*]] = extractvalue { i8*, i32 } [[T0]], 0
|
||||
// CHECK-NEXT: call void @__clang_call_terminate(i8* [[T1]]) noreturn nounwind
|
||||
// CHECK-NEXT: call void @__clang_call_terminate(i8* [[T1]]) [[NR_NUW:#[0-9]+]]
|
||||
// CHECK-NEXT: unreachable
|
||||
|
||||
void reverse() noexcept(false)
|
||||
|
@ -18,3 +18,5 @@ void reverse() noexcept(false)
|
|||
// CHECK: call void @_Z8externalv()
|
||||
external();
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NR_NUW]] = { noreturn nounwind }
|
||||
|
|
|
@ -12,7 +12,7 @@ void f1() {
|
|||
exit(1);
|
||||
}
|
||||
|
||||
// CHECK: call i8* @strstr{{.*}} nounwind
|
||||
// CHECK: call i8* @strstr{{.*}} [[NUW:#[0-9]+]]
|
||||
char* f2(char* a, char* b) {
|
||||
return __builtin_strstr(a, b);
|
||||
}
|
||||
|
@ -57,3 +57,6 @@ int f3(double x) {
|
|||
__builtin_remquol(x, x, &e);
|
||||
return e;
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
// CHECK: attributes #1 = { noreturn }
|
||||
|
|
|
@ -58,7 +58,7 @@ void foo() {
|
|||
// CHECK: %[[ARG:.*]] = ptrtoint {{.*}} %[[PTR]] to i64
|
||||
// CHECK-NEXT: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_100]] to i8*), i64 %[[ARG]])
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW:#[0-9]+]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
|
||||
// With -fsanitize=null, only perform the null check.
|
||||
|
@ -89,7 +89,7 @@ int bar(int *a) {
|
|||
// CHECK: %[[ARG:.*]] = ptrtoint
|
||||
// CHECK-NEXT: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_200]] to i8*), i64 %[[ARG]])
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
|
||||
#line 200
|
||||
|
@ -116,7 +116,7 @@ int lsh_overflow(int a, int b) {
|
|||
// CHECK-NEXT: %[[ARG2:.*]] = zext
|
||||
// CHECK-NEXT: call void @__ubsan_handle_shift_out_of_bounds(i8* bitcast ({{.*}} @[[LINE_300_A]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]])
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
|
||||
// CHECK: %[[SHIFTED_OUT_WIDTH:.*]] = sub nuw nsw i32 31, %[[RHS]]
|
||||
|
@ -133,7 +133,7 @@ int lsh_overflow(int a, int b) {
|
|||
// CHECK-NEXT: %[[ARG2:.*]] = zext
|
||||
// CHECK-NEXT: call void @__ubsan_handle_shift_out_of_bounds(i8* bitcast ({{.*}} @[[LINE_300_B]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]])
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
|
||||
// CHECK: %[[RET:.*]] = shl i32 %[[LHS]], %[[RHS]]
|
||||
|
@ -158,7 +158,7 @@ int rsh_inbounds(int a, int b) {
|
|||
// CHECK-NEXT: %[[ARG2:.*]] = zext
|
||||
// CHECK-NEXT: call void @__ubsan_handle_shift_out_of_bounds(i8* bitcast ({{.*}} @[[LINE_400]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]])
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
|
||||
// CHECK: %[[RET:.*]] = ashr i32 %[[LHS]], %[[RHS]]
|
||||
|
@ -175,7 +175,7 @@ int rsh_inbounds(int a, int b) {
|
|||
int load(int *p) {
|
||||
// CHECK: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_500]] to i8*), i64 %{{.*}})
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
#line 500
|
||||
return *p;
|
||||
|
@ -186,7 +186,7 @@ int load(int *p) {
|
|||
void store(int *p, int q) {
|
||||
// CHECK: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_600]] to i8*), i64 %{{.*}})
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
#line 600
|
||||
*p = q;
|
||||
|
@ -199,7 +199,7 @@ struct S { int k; };
|
|||
int *member_access(struct S *p) {
|
||||
// CHECK: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_700]] to i8*), i64 %{{.*}})
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
#line 700
|
||||
return &p->k;
|
||||
|
@ -212,7 +212,7 @@ int signed_overflow(int a, int b) {
|
|||
// CHECK-NEXT: %[[ARG2:.*]] = zext
|
||||
// CHECK-NEXT: call void @__ubsan_handle_add_overflow(i8* bitcast ({{.*}} @[[LINE_800]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]])
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
#line 800
|
||||
return a + b;
|
||||
|
@ -259,7 +259,7 @@ float int_float_overflow(unsigned __int128 n) {
|
|||
// CHECK-TRAP: %[[INBOUNDS:.*]] = icmp ule i128 %{{.*}}, -20282409603651670423947251286016
|
||||
// CHECK-TRAP-NEXT: br i1 %[[INBOUNDS]]
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
return n;
|
||||
}
|
||||
|
@ -277,7 +277,7 @@ void int_fp16_overflow(int n, __fp16 *p) {
|
|||
// CHECK-TRAP: %[[INBOUNDS:.*]] = and i1 %[[GE]], %[[LE]]
|
||||
// CHECK-TRAP-NEXT: br i1 %[[INBOUNDS]]
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
*p = n;
|
||||
}
|
||||
|
@ -295,7 +295,7 @@ int float_int_overflow(float f) {
|
|||
// CHECK-TRAP: %[[INBOUNDS:.*]] = and i1 %[[GE]], %[[LE]]
|
||||
// CHECK-TRAP-NEXT: br i1 %[[INBOUNDS]]
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
return f;
|
||||
}
|
||||
|
@ -313,7 +313,7 @@ unsigned float_uint_overflow(float f) {
|
|||
// CHECK-TRAP: %[[INBOUNDS:.*]] = and i1 %[[GE]], %[[LE]]
|
||||
// CHECK-TRAP-NEXT: br i1 %[[INBOUNDS]]
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
return f;
|
||||
}
|
||||
|
@ -331,7 +331,7 @@ signed char fp16_char_overflow(__fp16 *p) {
|
|||
// CHECK-TRAP: %[[INBOUNDS:.*]] = and i1 %[[GE]], %[[LE]]
|
||||
// CHECK-TRAP-NEXT: br i1 %[[INBOUNDS]]
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
return *p;
|
||||
}
|
||||
|
@ -349,7 +349,7 @@ float float_float_overflow(double f) {
|
|||
// CHECK-TRAP: %[[INBOUNDS:.*]] = and i1 %[[GE]], %[[LE]]
|
||||
// CHECK-TRAP-NEXT: br i1 %[[INBOUNDS]]
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP-NEXT: unreachable
|
||||
return f;
|
||||
}
|
||||
|
@ -381,7 +381,7 @@ int int_divide_overflow(int a, int b) {
|
|||
// CHECK-TRAP: %[[OK:.*]] = and i1 %[[ZERO]], %[[OVER]]
|
||||
// CHECK-TRAP: br i1 %[[OK]]
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP: unreachable
|
||||
return a / b;
|
||||
|
||||
|
@ -399,9 +399,11 @@ _Bool sour_bool(_Bool *p) {
|
|||
// CHECK-TRAP: %[[OK:.*]] = icmp ule i8 {{.*}}, 1
|
||||
// CHECK-TRAP: br i1 %[[OK]]
|
||||
|
||||
// CHECK-TRAP: call void @llvm.trap() noreturn nounwind
|
||||
// CHECK-TRAP: call void @llvm.trap() [[NR_NUW]]
|
||||
// CHECK-TRAP: unreachable
|
||||
return *p;
|
||||
}
|
||||
|
||||
// CHECK: ![[WEIGHT_MD]] = metadata !{metadata !"branch_weights", i32 1048575, i32 1}
|
||||
|
||||
// CHECK-TRAP: attributes [[NR_NUW]] = { noreturn nounwind }
|
||||
|
|
|
@ -30,20 +30,20 @@ void f7(unsigned short x) { }
|
|||
void __attribute__((always_inline)) f8(void) { }
|
||||
|
||||
// CHECK: call void @f9_t()
|
||||
// CHECK: noreturn
|
||||
// CHECK: #2
|
||||
// CHECK: }
|
||||
void __attribute__((noreturn)) f9_t(void);
|
||||
void f9(void) { f9_t(); }
|
||||
|
||||
// CHECK: call void @f9a()
|
||||
// CHECK: noreturn
|
||||
// CHECK: #2
|
||||
// CHECK: }
|
||||
_Noreturn void f9a(void);
|
||||
void f9b(void) { f9a(); }
|
||||
|
||||
// FIXME: We should be setting nounwind on calls.
|
||||
// CHECK: call i32 @f10_t()
|
||||
// CHECK: readnone
|
||||
// CHECK: #0
|
||||
// CHECK: {
|
||||
int __attribute__((const)) f10_t(void);
|
||||
int f10(void) { return f10_t(); }
|
||||
|
@ -99,7 +99,7 @@ void __attribute__((force_align_arg_pointer)) f16(void) {
|
|||
// CHECK: #7
|
||||
// CHECK: {
|
||||
// CHECK: call void @f17()
|
||||
// CHECK: returns_twice
|
||||
// CHECK: #7
|
||||
// CHECK: ret void
|
||||
__attribute__ ((returns_twice)) void f17(void);
|
||||
__attribute__ ((returns_twice)) void f18(void) {
|
||||
|
@ -109,7 +109,7 @@ __attribute__ ((returns_twice)) void f18(void) {
|
|||
// CHECK: define void @f19()
|
||||
// CHECK: {
|
||||
// CHECK: call i32 @setjmp(i32* null)
|
||||
// CHECK: returns_twice
|
||||
// CHECK: #7
|
||||
// CHECK: ret void
|
||||
typedef int jmp_buf[((9 * 2) + 3 + 16)];
|
||||
int setjmp(jmp_buf);
|
||||
|
|
|
@ -11,7 +11,7 @@ int main()
|
|||
// 'c': 16 bit address register for Mips16, GPR for all others
|
||||
// I am using 'c' to constrain both the target and one of the source
|
||||
// registers. We are looking for syntactical correctness.
|
||||
// CHECK: %{{[0-9]+}} = call i32 asm sideeffect "addi $0,$1,$2 \0A\09\09", "=c,c,I"(i32 %{{[0-9]+}}, i32 %{{[0-9]+}}) nounwind, !srcloc !{{[0-9]+}}
|
||||
// CHECK: %{{[0-9]+}} = call i32 asm sideeffect "addi $0,$1,$2 \0A\09\09", "=c,c,I"(i32 %{{[0-9]+}}, i32 %{{[0-9]+}}) [[NUW:#[0-9]+]], !srcloc !{{[0-9]+}}
|
||||
int __s, __v = 17;
|
||||
int __t;
|
||||
__asm__ __volatile__(
|
||||
|
@ -22,7 +22,7 @@ int main()
|
|||
// 'l': lo register
|
||||
// We are making it clear that destination register is lo with the
|
||||
// use of the 'l' constraint ("=l").
|
||||
// CHECK: %{{[0-9]+}} = call i32 asm sideeffect "mtlo $1 \0A\09\09", "=l,r,~{lo}"(i32 %{{[0-9]+}}) nounwind, !srcloc !{{[0-9]+}}
|
||||
// CHECK: %{{[0-9]+}} = call i32 asm sideeffect "mtlo $1 \0A\09\09", "=l,r,~{lo}"(i32 %{{[0-9]+}}) [[NUW]], !srcloc !{{[0-9]+}}
|
||||
int i_temp = 44;
|
||||
int i_result;
|
||||
__asm__ __volatile__(
|
||||
|
@ -34,7 +34,7 @@ int main()
|
|||
// 'x': Combined lo/hi registers
|
||||
// We are specifying that destination registers are the hi/lo pair with the
|
||||
// use of the 'x' constraint ("=x").
|
||||
// CHECK: %{{[0-9]+}} = call i64 asm sideeffect "mthi $1 \0A\09\09mtlo $2 \0A\09\09", "=x,r,r"(i32 %{{[0-9]+}}, i32 %{{[0-9]+}}) nounwind, !srcloc !{{[0-9]+}}
|
||||
// CHECK: %{{[0-9]+}} = call i64 asm sideeffect "mthi $1 \0A\09\09mtlo $2 \0A\09\09", "=x,r,r"(i32 %{{[0-9]+}}, i32 %{{[0-9]+}}) [[NUW]], !srcloc !{{[0-9]+}}
|
||||
int i_hi = 3;
|
||||
int i_lo = 2;
|
||||
long long ll_result = 0;
|
||||
|
@ -47,3 +47,5 @@ int main()
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -18,11 +18,11 @@ void t22() {}
|
|||
// CHECK: define void @t2() #2 {
|
||||
__declspec(noinline) void t2() {}
|
||||
|
||||
// CHECK: call void @f20_t() noreturn
|
||||
// CHECK: call void @f20_t() [[NR:#[0-9]+]]
|
||||
__declspec(noreturn) void f20_t(void);
|
||||
void f20(void) { f20_t(); }
|
||||
|
||||
// CHECK: attributes #0 = { naked noinline nounwind "target-features"={{.*}} }
|
||||
// CHECK: attributes #1 = { nounwind "target-features"={{.*}} }
|
||||
// CHECK: attributes #2 = { noinline nounwind "target-features"={{.*}} }
|
||||
// CHECK: attributes #3 = { noreturn "target-features"={{.*}} }
|
||||
// CHECK: attributes [[NR]] = { noreturn "target-features"={{.*}} }
|
||||
|
|
|
@ -5,12 +5,14 @@ void t1() {
|
|||
int var = 10;
|
||||
__asm mov rax, offset var ; rax = address of myvar
|
||||
// CHECK: t1
|
||||
// CHECK: call void asm sideeffect inteldialect "mov rax, $0", "r,~{rax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov rax, $0", "r,~{rax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) [[NUW:#[0-9]+]]
|
||||
}
|
||||
|
||||
void t2() {
|
||||
int var = 10;
|
||||
__asm mov [eax], offset var
|
||||
// CHECK: t2
|
||||
// CHECK: call void asm sideeffect inteldialect "mov [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) [[NUW]]
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -3,16 +3,16 @@
|
|||
|
||||
void t1() {
|
||||
// CHECK: @t1
|
||||
// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() [[NUW:#[0-9]+]]
|
||||
// CHECK: ret void
|
||||
__asm {}
|
||||
}
|
||||
|
||||
void t2() {
|
||||
// CHECK: @t2
|
||||
// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: ret void
|
||||
__asm nop
|
||||
__asm nop
|
||||
|
@ -21,15 +21,15 @@ void t2() {
|
|||
|
||||
void t3() {
|
||||
// CHECK: @t3
|
||||
// CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: ret void
|
||||
__asm nop __asm nop __asm nop
|
||||
}
|
||||
|
||||
void t4(void) {
|
||||
// CHECK: @t4
|
||||
// CHECK: call void asm sideeffect inteldialect "mov ebx, eax", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov ecx, ebx", "~{ecx},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov ebx, eax", "~{ebx},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov ecx, ebx", "~{ecx},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: ret void
|
||||
__asm mov ebx, eax
|
||||
__asm mov ecx, ebx
|
||||
|
@ -37,7 +37,7 @@ void t4(void) {
|
|||
|
||||
void t5(void) {
|
||||
// CHECK: @t5
|
||||
// CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0A\09mov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0A\09mov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: ret void
|
||||
__asm mov ebx, eax __asm mov ecx, ebx
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ void t5(void) {
|
|||
void t6(void) {
|
||||
__asm int 0x2c
|
||||
// CHECK: t6
|
||||
// CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
void t7() {
|
||||
|
@ -54,8 +54,8 @@ void t7() {
|
|||
}
|
||||
__asm {}
|
||||
// CHECK: t7
|
||||
// CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
int t8() {
|
||||
|
@ -64,9 +64,9 @@ int t8() {
|
|||
__asm int 4
|
||||
return 10;
|
||||
// CHECK: t8
|
||||
// CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "int $$4", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: ret i32 10
|
||||
}
|
||||
|
||||
|
@ -77,7 +77,7 @@ void t9() {
|
|||
pop ebx
|
||||
}
|
||||
// CHECK: t9
|
||||
// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
unsigned t10(void) {
|
||||
|
@ -91,7 +91,7 @@ unsigned t10(void) {
|
|||
// CHECK: [[I:%[a-zA-Z0-9]+]] = alloca i32, align 4
|
||||
// CHECK: [[J:%[a-zA-Z0-9]+]] = alloca i32, align 4
|
||||
// CHECK: store i32 1, i32* [[I]], align 4
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $1\0A\09mov dword ptr $0, eax", "=*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $1\0A\09mov dword ptr $0, eax", "=*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}) [[NUW]]
|
||||
// CHECK: [[RET:%[a-zA-Z0-9]+]] = load i32* [[J]], align 4
|
||||
// CHECK: ret i32 [[RET]]
|
||||
}
|
||||
|
@ -99,7 +99,7 @@ unsigned t10(void) {
|
|||
void t11(void) {
|
||||
__asm mov eax, 1
|
||||
// CHECK: t11
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
unsigned t12(void) {
|
||||
|
@ -112,7 +112,7 @@ unsigned t12(void) {
|
|||
}
|
||||
return j + m;
|
||||
// CHECK: t12
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $2\0A\09mov dword ptr $0, eax\0A\09mov eax, dword ptr $3\0A\09mov dword ptr $1, eax", "=*m,=*m,*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $2\0A\09mov dword ptr $0, eax\0A\09mov eax, dword ptr $3\0A\09mov dword ptr $1, eax", "=*m,=*m,*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}) [[NUW]]
|
||||
}
|
||||
|
||||
void t13() {
|
||||
|
@ -121,8 +121,8 @@ void t13() {
|
|||
__asm movzx eax, i
|
||||
__asm movzx eax, j
|
||||
// CHECK: t13
|
||||
// CHECK: call void asm sideeffect inteldialect "movzx eax, byte ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i8* %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "movzx eax, word ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i16* %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "movzx eax, byte ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i8* %{{.*}}) [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "movzx eax, word ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i16* %{{.*}}) [[NUW]]
|
||||
}
|
||||
|
||||
void t14() {
|
||||
|
@ -135,7 +135,7 @@ void t14() {
|
|||
.endif
|
||||
}
|
||||
// CHECK: t14
|
||||
// CHECK: call void asm sideeffect inteldialect ".if 1\0A\09mov eax, dword ptr $0\0A\09.else\0A\09mov ebx, j\0A\09.endif", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect ".if 1\0A\09mov eax, dword ptr $0\0A\09.else\0A\09mov ebx, j\0A\09.endif", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) [[NUW]]
|
||||
}
|
||||
|
||||
int gvar = 10;
|
||||
|
@ -145,16 +145,16 @@ void t15() {
|
|||
__asm mov eax, offset lvar ; eax = address of lvar
|
||||
__asm mov eax, offset gvar ; eax = address of gvar
|
||||
// CHECK: t15
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* @{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* @{{.*}}) [[NUW]]
|
||||
}
|
||||
|
||||
void t16() {
|
||||
int var = 10;
|
||||
__asm mov [eax], offset var
|
||||
// CHECK: t16
|
||||
// CHECK: call void asm sideeffect inteldialect "mov [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) [[NUW]]
|
||||
}
|
||||
|
||||
void t17() {
|
||||
|
@ -163,10 +163,10 @@ void t17() {
|
|||
__asm _emit 0x4B
|
||||
__asm _EMIT 0x4B
|
||||
// CHECK: t17
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0x4A", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0x43", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0x4A", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0x43", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0x4B", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
struct t18_type { int a, b; };
|
||||
|
@ -182,7 +182,7 @@ int t18() {
|
|||
}
|
||||
return foo.b;
|
||||
// CHECK: t18
|
||||
// CHECK: call void asm sideeffect inteldialect "lea ebx, foo\0A\09mov eax, [ebx].0\0A\09mov [ebx].4, ecx", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "lea ebx, foo\0A\09mov eax, [ebx].0\0A\09mov [ebx].4, ecx", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
int t19() {
|
||||
|
@ -196,7 +196,7 @@ int t19() {
|
|||
}
|
||||
return foo.b;
|
||||
// CHECK: t19
|
||||
// CHECK: call void asm sideeffect inteldialect "lea ebx, foo\0A\09mov eax, [ebx].0\0A\09mov [ebx].4, ecx", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "lea ebx, foo\0A\09mov eax, [ebx].0\0A\09mov [ebx].4, ecx", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
void t20() {
|
||||
|
@ -210,28 +210,28 @@ void t20() {
|
|||
__asm mov eax, LENGTH _foo
|
||||
__asm mov eax, LENGTH _bar
|
||||
// CHECK: t20
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
|
||||
__asm mov eax, TYPE foo
|
||||
__asm mov eax, TYPE bar
|
||||
__asm mov eax, TYPE _foo
|
||||
__asm mov eax, TYPE _bar
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
|
||||
__asm mov eax, SIZE foo
|
||||
__asm mov eax, SIZE bar
|
||||
__asm mov eax, SIZE _foo
|
||||
__asm mov eax, SIZE _bar
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$16", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$4", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$16", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
void t21() {
|
||||
|
@ -241,7 +241,7 @@ void t21() {
|
|||
__asm pop ebx
|
||||
}
|
||||
// CHECK: t21
|
||||
// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
extern void t22_helper(int x);
|
||||
|
@ -257,9 +257,9 @@ void t22() {
|
|||
__asm pop ebx
|
||||
}
|
||||
// CHECK: t22
|
||||
// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, esp", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, esp", "~{ebx},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void @t22_helper
|
||||
// CHECK: call void asm sideeffect inteldialect "mov esp, ebx\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov esp, ebx\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
void t23() {
|
||||
|
@ -267,14 +267,14 @@ void t23() {
|
|||
the_label:
|
||||
}
|
||||
// CHECK: t23
|
||||
// CHECK: call void asm sideeffect inteldialect "the_label:", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "the_label:", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
void t24_helper(void) {}
|
||||
void t24() {
|
||||
__asm call t24_helper
|
||||
// CHECK: t24
|
||||
// CHECK: call void asm sideeffect inteldialect "call $0", "r,~{dirflag},~{fpsr},~{flags}"(void ()* @t24_helper) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "call $0", "r,~{dirflag},~{fpsr},~{flags}"(void ()* @t24_helper) [[NUW]]
|
||||
}
|
||||
|
||||
void t25() {
|
||||
|
@ -284,11 +284,11 @@ void t25() {
|
|||
__asm mov eax, 0xa2h
|
||||
__asm mov eax, 0xa2
|
||||
// CHECK: t25
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$0ffffffffh", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$0fh", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$0a2h", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2h", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$0ffffffffh", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$0fh", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$0a2h", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2h", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$0xa2", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
void t26() {
|
||||
|
@ -299,18 +299,18 @@ void t26() {
|
|||
__asm __EMIT 0a2h
|
||||
__asm popad
|
||||
// CHECK: t26
|
||||
// CHECK: call void asm sideeffect inteldialect "pushad", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$0", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0fh", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "popad", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "pushad", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, $$0", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0fh", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect ".byte 0a2h", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "popad", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
void t27() {
|
||||
__asm mov eax, fs:[0h]
|
||||
// CHECK: t27
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, fs:[0h]", "~{eax},~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov eax, fs:[0h]", "~{eax},~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
void t28() {
|
||||
|
@ -319,10 +319,10 @@ void t28() {
|
|||
__asm align 128;
|
||||
__asm ALIGN 256;
|
||||
// CHECK: t28
|
||||
// CHECK: call void asm sideeffect inteldialect ".align 3", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect ".align 4", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect ".align 7", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect ".align 8", "~{dirflag},~{fpsr},~{flags}"() nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect ".align 3", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect ".align 4", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect ".align 7", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect ".align 8", "~{dirflag},~{fpsr},~{flags}"() [[NUW]]
|
||||
}
|
||||
|
||||
void t29() {
|
||||
|
@ -332,9 +332,9 @@ void t29() {
|
|||
__asm mov osize, SIZE arr
|
||||
__asm mov otype, TYPE arr
|
||||
// CHECK: t29
|
||||
// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$2", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$8", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$4", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$2", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$8", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, $$4", "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) [[NUW]]
|
||||
}
|
||||
|
||||
int results[2] = {13, 37};
|
||||
|
@ -345,6 +345,8 @@ int *t30()
|
|||
__asm mov res, edi
|
||||
return res;
|
||||
// CHECK: t30
|
||||
// CHECK: call void asm sideeffect inteldialect "lea edi, dword ptr $0", "*m,~{edi},~{dirflag},~{fpsr},~{flags}"([2 x i32]* @{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, edi", "=*m,~{dirflag},~{fpsr},~{flags}"(i32** %{{.*}}) nounwind
|
||||
// CHECK: call void asm sideeffect inteldialect "lea edi, dword ptr $0", "*m,~{edi},~{dirflag},~{fpsr},~{flags}"([2 x i32]* @{{.*}}) [[NUW]]
|
||||
// CHECK: call void asm sideeffect inteldialect "mov dword ptr $0, edi", "=*m,~{dirflag},~{fpsr},~{flags}"(i32** %{{.*}}) [[NUW]]
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -5,15 +5,15 @@ int t(void);
|
|||
|
||||
// CHECK: define i32 @_Z1fv() {{.*}} {
|
||||
int f(void) {
|
||||
// CHECK: call i32 @_Z1cv() nounwind readnone
|
||||
// CHECK: call i32 @_Z1pv() nounwind readonly
|
||||
// CHECK: call i32 @_Z1cv() [[NUW_RN:#[0-9]+]]
|
||||
// CHECK: call i32 @_Z1pv() [[NUW_RO:#[0-9]+]]
|
||||
return c() + p() + t();
|
||||
}
|
||||
|
||||
// CHECK: declare i32 @_Z1cv() #1
|
||||
// CHECK: declare i32 @_Z1pv() #2
|
||||
// CHECK: declare i32 @_Z1cv() [[NUW_RN]]
|
||||
// CHECK: declare i32 @_Z1pv() [[NUW_RO]]
|
||||
// CHECK: declare i32 @_Z1tv() #0
|
||||
|
||||
// CHECK: attributes #0 = { "target-features"={{.*}} }
|
||||
// CHECK: attributes #1 = { nounwind readnone "target-features"={{.*}} }
|
||||
// CHECK: attributes #2 = { nounwind readonly "target-features"={{.*}} }
|
||||
// CHECK: attributes [[NUW_RN]] = { nounwind readnone "target-features"={{.*}} }
|
||||
// CHECK: attributes [[NUW_RO]] = { nounwind readonly "target-features"={{.*}} }
|
||||
|
|
|
@ -139,7 +139,7 @@ int lsh_overflow(int a, int b) {
|
|||
|
||||
// CHECK: @_Z9no_return
|
||||
int no_return() {
|
||||
// CHECK: call void @__ubsan_handle_missing_return(i8* bitcast ({{.*}}* @{{.*}} to i8*)) noreturn nounwind
|
||||
// CHECK: call void @__ubsan_handle_missing_return(i8* bitcast ({{.*}}* @{{.*}} to i8*)) [[NR_NUW:#[0-9]+]]
|
||||
// CHECK-NEXT: unreachable
|
||||
}
|
||||
|
||||
|
@ -219,3 +219,5 @@ void bad_downcast_reference(S &p) {
|
|||
// CHECK: br label
|
||||
(void) static_cast<T&>(p);
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NR_NUW]] = { noreturn nounwind }
|
||||
|
|
|
@ -17,7 +17,7 @@ int main(void) {}
|
|||
|
||||
// CHECK: define internal void @__cxx_global_var_init()
|
||||
// CHECK-NOT: __cxx_global_var_init
|
||||
// CHECK: %[[C0:.+]] = call i32 @_Z4testv() "target-features"={{.*}}, !dbg ![[LINE:.*]]
|
||||
// CHECK: %[[C0:.+]] = call i32 @_Z4testv() [[TF:#[0-9]+]], !dbg ![[LINE:.*]]
|
||||
// CHECK-NOT: __cxx_global_var_init
|
||||
// CHECK: store i32 %[[C0]], i32* @_ZL1i, align 4, !dbg
|
||||
//
|
||||
|
@ -27,4 +27,6 @@ int main(void) {}
|
|||
// CHECK-NOT: dbg
|
||||
// CHECK: store i32 %[[C1]], i32* @_ZL1j, align 4
|
||||
//
|
||||
// CHECK: attributes [[TF]] = { "target-features"={{.*}} }
|
||||
//
|
||||
// CHECK: ![[LINE]] = metadata !{i32 13, i32
|
||||
|
|
|
@ -129,7 +129,7 @@ namespace test4 {
|
|||
// CHECK-NEXT: [[DTOR:%.*]] = load void ([[X]]*)** [[T0]]
|
||||
// CHECK-NEXT: call void [[DTOR]]([[X]]* [[OBJ:%.*]])
|
||||
// Call the global operator delete.
|
||||
// CHECK-NEXT: call void @_ZdlPv(i8* [[ALLOCATED]]) nounwind
|
||||
// CHECK-NEXT: call void @_ZdlPv(i8* [[ALLOCATED]]) [[NUW:#[0-9]+]]
|
||||
::delete xp;
|
||||
}
|
||||
}
|
||||
|
@ -144,3 +144,5 @@ namespace test5 {
|
|||
delete [] p2;
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind{{.*}} }
|
||||
|
|
|
@ -370,11 +370,11 @@ namespace test9 {
|
|||
|
||||
// CHECK: define internal void @_ZN5test312_GLOBAL__N_11DD0Ev(%"struct.test3::<anonymous namespace>::D"* %this) unnamed_addr
|
||||
// CHECK: invoke void @_ZN5test312_GLOBAL__N_11DD1Ev(
|
||||
// CHECK: call void @_ZdlPv({{.*}}) nounwind
|
||||
// CHECK: call void @_ZdlPv({{.*}}) [[NUW:#[0-9]+]]
|
||||
// CHECK: ret void
|
||||
// CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
||||
// CHECK-NEXT: cleanup
|
||||
// CHECK: call void @_ZdlPv({{.*}}) nounwind
|
||||
// CHECK: call void @_ZdlPv({{.*}}) [[NUW]]
|
||||
// CHECK: resume { i8*, i32 }
|
||||
|
||||
// Checked at top of file:
|
||||
|
@ -401,11 +401,11 @@ namespace test9 {
|
|||
|
||||
// CHECK: define internal void @_ZN5test312_GLOBAL__N_11CD0Ev(%"struct.test3::<anonymous namespace>::C"* %this) unnamed_addr
|
||||
// CHECK: invoke void @_ZN5test312_GLOBAL__N_11CD1Ev(
|
||||
// CHECK: call void @_ZdlPv({{.*}}) nounwind
|
||||
// CHECK: call void @_ZdlPv({{.*}}) [[NUW]]
|
||||
// CHECK: ret void
|
||||
// CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
||||
// CHECK-NEXT: cleanup
|
||||
// CHECK: call void @_ZdlPv({{.*}}) nounwind
|
||||
// CHECK: call void @_ZdlPv({{.*}}) [[NUW]]
|
||||
// CHECK: resume { i8*, i32 }
|
||||
|
||||
// CHECK: define internal void @_ZThn8_N5test312_GLOBAL__N_11CD1Ev(
|
||||
|
@ -417,3 +417,5 @@ namespace test9 {
|
|||
// CHECK: getelementptr inbounds i8* {{.*}}, i64 -8
|
||||
// CHECK: call void @_ZN5test312_GLOBAL__N_11CD0Ev(
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind{{.*}} }
|
||||
|
|
|
@ -13,7 +13,7 @@ C *f(B* b) {
|
|||
// CHECK: @_Z1fR1B
|
||||
C &f(B& b) {
|
||||
// CHECK-NOT: call i8* @__dynamic_cast
|
||||
// CHECK: call void @__cxa_bad_cast() noreturn
|
||||
// CHECK: call void @__cxa_bad_cast() [[NR:#[0-9]+]]
|
||||
// CHECK: ret %struct.C* undef
|
||||
return dynamic_cast<C&>(b);
|
||||
}
|
||||
|
@ -22,3 +22,5 @@ void dont_crash() {
|
|||
(void) dynamic_cast<void*>((A*)0);
|
||||
(void) dynamic_cast<void*>((B*)0);
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NR]] = { noreturn }
|
||||
|
|
|
@ -8,7 +8,7 @@ const B& f(A *a) {
|
|||
try {
|
||||
// CHECK: call i8* @__dynamic_cast
|
||||
// CHECK: br i1
|
||||
// CHECK: invoke void @__cxa_bad_cast() noreturn
|
||||
// CHECK: invoke void @__cxa_bad_cast() [[NR:#[0-9]+]]
|
||||
dynamic_cast<const B&>(*a);
|
||||
} catch (...) {
|
||||
// CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
||||
|
@ -19,6 +19,4 @@ const B& f(A *a) {
|
|||
|
||||
// CHECK: declare i8* @__dynamic_cast(i8*, i8*, i8*, i64) #2
|
||||
|
||||
// CHECK: attributes #0 = { inlinehint nounwind "target-features"={{.*}} }
|
||||
// CHECK: attributes #1 = { "target-features"={{.*}} }
|
||||
// CHECK: attributes #2 = { nounwind readonly }
|
||||
// CHECK: attributes [[NR]] = { noreturn }
|
||||
|
|
|
@ -14,7 +14,7 @@ void test1() {
|
|||
// CHECK-NEXT: [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[DSTAR:%[^*]*\*]]
|
||||
// CHECK-NEXT: [[EXN2:%.*]] = bitcast [[DSTAR]] [[EXN]] to i8*
|
||||
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[EXN2]], i8* bitcast ([[DSTAR]] @d1 to i8*), i64 8, i32 8, i1 false)
|
||||
// CHECK-NEXT: call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({ i8*, i8* }* @_ZTI7test1_D to i8*), i8* null) noreturn
|
||||
// CHECK-NEXT: call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({ i8*, i8* }* @_ZTI7test1_D to i8*), i8* null) [[NR:#[0-9]+]]
|
||||
// CHECK-NEXT: unreachable
|
||||
|
||||
|
||||
|
@ -37,7 +37,7 @@ void test2() {
|
|||
// CHECK-NEXT: invoke void @_ZN7test2_DC1ERKS_([[DSTAR]] [[EXN]], [[DSTAR]] @d2)
|
||||
// CHECK-NEXT: to label %[[CONT:.*]] unwind label %{{.*}}
|
||||
// : [[CONT]]: (can't check this in Release-Asserts builds)
|
||||
// CHECK: call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({{.*}}* @_ZTI7test2_D to i8*), i8* null) noreturn
|
||||
// CHECK: call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({{.*}}* @_ZTI7test2_D to i8*), i8* null) [[NR]]
|
||||
// CHECK-NEXT: unreachable
|
||||
|
||||
|
||||
|
@ -55,7 +55,7 @@ void test3() {
|
|||
// CHECK: [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 8)
|
||||
// CHECK-NEXT: [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[D:%[^*]+]]**
|
||||
// CHECK-NEXT: store [[D]]* null, [[D]]** [[EXN]]
|
||||
// CHECK-NEXT: call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({ i8*, i8*, i32, i8* }* @_ZTIPV7test3_D to i8*), i8* null) noreturn
|
||||
// CHECK-NEXT: call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({ i8*, i8*, i32, i8* }* @_ZTIPV7test3_D to i8*), i8* null) [[NR]]
|
||||
// CHECK-NEXT: unreachable
|
||||
|
||||
|
||||
|
@ -64,7 +64,7 @@ void test4() {
|
|||
}
|
||||
|
||||
// CHECK: define void @_Z5test4v()
|
||||
// CHECK: call void @__cxa_rethrow() noreturn
|
||||
// CHECK: call void @__cxa_rethrow() [[NR]]
|
||||
// CHECK-NEXT: unreachable
|
||||
|
||||
|
||||
|
@ -83,7 +83,7 @@ namespace test5 {
|
|||
// CHECK: [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 1)
|
||||
// CHECK: [[EXNCAST:%.*]] = bitcast i8* [[EXNOBJ]] to [[A:%[^*]*]]*
|
||||
// CHECK-NEXT: invoke void @_ZN5test51AC1Ev([[A]]* [[EXNCAST]])
|
||||
// CHECK: invoke void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({{.*}}* @_ZTIN5test51AE to i8*), i8* bitcast (void ([[A]]*)* @_ZN5test51AD1Ev to i8*)) noreturn
|
||||
// CHECK: invoke void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({{.*}}* @_ZTIN5test51AE to i8*), i8* bitcast (void ([[A]]*)* @_ZN5test51AD1Ev to i8*)) [[NR]]
|
||||
// CHECK-NEXT: to label {{%.*}} unwind label %[[HANDLER:[^ ]*]]
|
||||
// : [[HANDLER]]: (can't check this in Release-Asserts builds)
|
||||
// CHECK: {{%.*}} = call i32 @llvm.eh.typeid.for(i8* bitcast ({{.*}}* @_ZTIN5test51AE to i8*))
|
||||
|
@ -222,7 +222,7 @@ namespace test10 {
|
|||
// CHECK-NEXT: bitcast
|
||||
// CHECK-NEXT: load i32*
|
||||
// CHECK-NEXT: store i32
|
||||
// CHECK-NEXT: call void @__cxa_end_catch() nounwind
|
||||
// CHECK-NEXT: call void @__cxa_end_catch() [[NUW:#[0-9]+]]
|
||||
} catch (B a) {
|
||||
// CHECK: call i8* @__cxa_begin_catch
|
||||
// CHECK-NEXT: bitcast
|
||||
|
@ -251,11 +251,11 @@ namespace test11 {
|
|||
opaque();
|
||||
} catch (int**&p) {
|
||||
// CHECK: [[EXN:%.*]] = load i8**
|
||||
// CHECK-NEXT: call i8* @__cxa_begin_catch(i8* [[EXN]]) nounwind
|
||||
// CHECK-NEXT: call i8* @__cxa_begin_catch(i8* [[EXN]]) [[NUW]]
|
||||
// CHECK-NEXT: [[ADJ1:%.*]] = getelementptr i8* [[EXN]], i32 32
|
||||
// CHECK-NEXT: [[ADJ2:%.*]] = bitcast i8* [[ADJ1]] to i32***
|
||||
// CHECK-NEXT: store i32*** [[ADJ2]], i32**** [[P:%.*]]
|
||||
// CHECK-NEXT: call void @__cxa_end_catch() nounwind
|
||||
// CHECK-NEXT: call void @__cxa_end_catch() [[NUW]]
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -272,11 +272,11 @@ namespace test11 {
|
|||
opaque();
|
||||
} catch (A*&p) {
|
||||
// CHECK: [[EXN:%.*]] = load i8** [[EXNSLOT]]
|
||||
// CHECK-NEXT: [[ADJ1:%.*]] = call i8* @__cxa_begin_catch(i8* [[EXN]]) nounwind
|
||||
// CHECK-NEXT: [[ADJ1:%.*]] = call i8* @__cxa_begin_catch(i8* [[EXN]]) [[NUW]]
|
||||
// CHECK-NEXT: [[ADJ2:%.*]] = bitcast i8* [[ADJ1]] to [[A]]*
|
||||
// CHECK-NEXT: store [[A]]* [[ADJ2]], [[A]]** [[TMP]]
|
||||
// CHECK-NEXT: store [[A]]** [[TMP]], [[A]]*** [[P]]
|
||||
// CHECK-NEXT: call void @__cxa_end_catch() nounwind
|
||||
// CHECK-NEXT: call void @__cxa_end_catch() [[NUW]]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -444,3 +444,6 @@ namespace test16 {
|
|||
// CHECK-NEXT: br label
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
// CHECK: attributes [[NR]] = { noreturn }
|
||||
|
|
|
@ -72,8 +72,8 @@ namespace test1 {
|
|||
// rdar://11904428
|
||||
// Terminate landing pads should call __cxa_begin_catch first.
|
||||
// CHECK: define linkonce_odr hidden void @__clang_call_terminate(i8*) #2
|
||||
// CHECK-NEXT: [[T0:%.*]] = call i8* @__cxa_begin_catch(i8* %0) nounwind
|
||||
// CHECK-NEXT: call void @_ZSt9terminatev() noreturn nounwind
|
||||
// CHECK-NEXT: [[T0:%.*]] = call i8* @__cxa_begin_catch(i8* %0) [[NUW:#[0-9]+]]
|
||||
// CHECK-NEXT: call void @_ZSt9terminatev() [[NR_NUW:#[0-9]+]]
|
||||
// CHECK-NEXT: unreachable
|
||||
|
||||
A *d() {
|
||||
|
@ -164,7 +164,7 @@ namespace test2 {
|
|||
// CHECK-NEXT: invoke void @_ZN5test21AC1Ei([[A]]* [[CAST]], i32 5)
|
||||
// CHECK: ret [[A]]* [[CAST]]
|
||||
// CHECK: invoke void @_ZN5test21AdlEPvm(i8* [[NEW]], i64 8)
|
||||
// CHECK: call void @__clang_call_terminate(i8* {{%.*}}) noreturn nounwind
|
||||
// CHECK: call void @__clang_call_terminate(i8* {{%.*}}) [[NR_NUW]]
|
||||
return new A(5);
|
||||
}
|
||||
}
|
||||
|
@ -190,7 +190,7 @@ namespace test3 {
|
|||
// CHECK-NEXT: invoke void @_ZN5test31AC1Ei([[A]]* [[CAST]], i32 5)
|
||||
// CHECK: ret [[A]]* [[CAST]]
|
||||
// CHECK: invoke void @_ZN5test31AdlEPvS1_d(i8* [[NEW]], i8* [[FOO]], double [[BAR]])
|
||||
// CHECK: call void @__clang_call_terminate(i8* {{%.*}}) noreturn nounwind
|
||||
// CHECK: call void @__clang_call_terminate(i8* {{%.*}}) [[NR_NUW]]
|
||||
return new(foo(),bar()) A(5);
|
||||
}
|
||||
|
||||
|
@ -281,7 +281,7 @@ namespace test5 {
|
|||
// CHECK-NEXT: invoke void @_ZN5test51TC1Ev([[T_T]]* [[T]])
|
||||
// CHECK: invoke void @_ZN5test51AC1ERKS0_RKNS_1TE([[A_T]]* [[A]], [[A_T]]* [[SRC]], [[T_T]]* [[T]])
|
||||
// CHECK: invoke void @_ZN5test51TD1Ev([[T_T]]* [[T]])
|
||||
// CHECK: call i8* @__cxa_begin_catch(i8* [[EXN]]) nounwind
|
||||
// CHECK: call i8* @__cxa_begin_catch(i8* [[EXN]]) [[NUW]]
|
||||
// CHECK-NEXT: invoke void @_ZN5test51AD1Ev([[A_T]]* [[A]])
|
||||
// CHECK: call void @__cxa_end_catch()
|
||||
void test() {
|
||||
|
@ -530,3 +530,6 @@ namespace test11 {
|
|||
// CHECK: attributes #1 = { nounwind "target-features"={{.*}} }
|
||||
// CHECK: attributes #2 = { noinline noreturn nounwind }
|
||||
// CHECK: attributes #3 = { nounwind readnone }
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
// CHECK: attributes [[NR_NUW]] = { noreturn nounwind }
|
||||
|
|
|
@ -44,7 +44,7 @@ struct B {
|
|||
//
|
||||
// DTORS: [[CALL_DELETE_LABEL]]
|
||||
// DTORS-NEXT: %[[THIS_AS_VOID:[0-9a-z]+]] = bitcast %struct.B* %[[THIS]] to i8*
|
||||
// DTORS-NEXT: call void @"\01??3@YAXPAX@Z"(i8* %[[THIS_AS_VOID]]) nounwind
|
||||
// DTORS-NEXT: call void @"\01??3@YAXPAX@Z"(i8* %[[THIS_AS_VOID]]) [[NUW:#[0-9]+]]
|
||||
// DTORS-NEXT: br label %[[CONTINUE_LABEL]]
|
||||
//
|
||||
// DTORS: [[CONTINUE_LABEL]]
|
||||
|
@ -104,3 +104,5 @@ struct C {
|
|||
};
|
||||
|
||||
void use_C() { C c; }
|
||||
|
||||
// DTORS: attributes [[NUW]] = { nounwind{{.*}} }
|
||||
|
|
|
@ -103,7 +103,7 @@ X test2(bool B) {
|
|||
// CHECK-EH: [[T0:%.*]] = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
||||
// CHECK-EH-NEXT: catch i8* null
|
||||
// CHECK-EH-NEXT: [[T1:%.*]] = extractvalue { i8*, i32 } [[T0]], 0
|
||||
// CHECK-EH-NEXT: call void @__clang_call_terminate(i8* [[T1]]) noreturn nounwind
|
||||
// CHECK-EH-NEXT: call void @__clang_call_terminate(i8* [[T1]]) [[NR_NUW:#[0-9]+]]
|
||||
// CHECK-EH-NEXT: unreachable
|
||||
|
||||
}
|
||||
|
@ -160,3 +160,5 @@ X test6() {
|
|||
// CHECK-NEXT: call {{.*}} @_ZN1XD1Ev([[X]]* [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
}
|
||||
|
||||
// CHECK-EH: attributes [[NR_NUW]] = { noreturn nounwind }
|
||||
|
|
|
@ -15,14 +15,19 @@ void test() {
|
|||
|
||||
// PR10789: different platforms have different sizes for struct UnwindException.
|
||||
|
||||
// X86-64: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) nounwind
|
||||
// X86-64: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) [[NUW:#[0-9]+]]
|
||||
// X86-64-NEXT: [[T1:%.*]] = getelementptr i8* [[EXN]], i64 32
|
||||
// X86-32: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) nounwind
|
||||
// X86-32: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) [[NUW:#[0-9]+]]
|
||||
// X86-32-NEXT: [[T1:%.*]] = getelementptr i8* [[EXN]], i64 32
|
||||
// ARM-DARWIN: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) nounwind
|
||||
// ARM-DARWIN: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) [[NUW:#[0-9]+]]
|
||||
// ARM-DARWIN-NEXT: [[T1:%.*]] = getelementptr i8* [[EXN]], i64 32
|
||||
// ARM-EABI: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) nounwind
|
||||
// ARM-EABI: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) [[NUW:#[0-9]+]]
|
||||
// ARM-EABI-NEXT: [[T1:%.*]] = getelementptr i8* [[EXN]], i32 88
|
||||
// MIPS: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) nounwind
|
||||
// MIPS: [[T0:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[EXN:%.*]]) [[NUW:#[0-9]+]]
|
||||
// MIPS-NEXT: [[T1:%.*]] = getelementptr i8* [[EXN]], i32 24
|
||||
|
||||
// X86-64: attributes [[NUW]] = { nounwind }
|
||||
// X86-32: attributes [[NUW]] = { nounwind }
|
||||
// ARM-DARWIN: attributes [[NUW]] = { nounwind }
|
||||
// ARM-EABI: attributes [[NUW]] = { nounwind }
|
||||
// MIPS: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -31,7 +31,7 @@ const std::type_info &a_ti = typeid(a);
|
|||
const char *f() {
|
||||
try {
|
||||
// CHECK: br i1
|
||||
// CHECK: invoke void @__cxa_bad_typeid() noreturn
|
||||
// CHECK: invoke void @__cxa_bad_typeid() [[NR:#[0-9]+]]
|
||||
return typeid(*static_cast<A *>(0)).name();
|
||||
} catch (...) {
|
||||
// CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
||||
|
@ -43,5 +43,4 @@ const char *f() {
|
|||
|
||||
}
|
||||
|
||||
// CHECK: attributes #0 = { "target-features"={{.*}} }
|
||||
// CHECK: attributes #1 = { nounwind "target-features"={{.*}} }
|
||||
// CHECK: attributes [[NR]] = { noreturn }
|
||||
|
|
|
@ -9,14 +9,16 @@ void use_int(int);
|
|||
void test0(int i) {
|
||||
block_t block = ^{ use_int(i); };
|
||||
// CHECK: define void @test0(
|
||||
// CHECK: call i8* @objc_retainBlock(i8* {{%.*}}) nounwind, !clang.arc.copy_on_escape
|
||||
// CHECK: call i8* @objc_retainBlock(i8* {{%.*}}) [[NUW:#[0-9]+]], !clang.arc.copy_on_escape
|
||||
// CHECK: ret void
|
||||
}
|
||||
|
||||
void test1(int i) {
|
||||
id block = ^{ use_int(i); };
|
||||
// CHECK: define void @test1(
|
||||
// CHECK: call i8* @objc_retainBlock(i8* {{%.*}}) nounwind
|
||||
// CHECK: call i8* @objc_retainBlock(i8* {{%.*}}) [[NUW]]
|
||||
// CHECK-NOT: !clang.arc.copy_on_escape
|
||||
// CHECK: ret void
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -13,10 +13,10 @@ int (^test1(int x))(void) {
|
|||
// CHECK-NEXT: store i32 {{%.*}}, i32* [[X]]
|
||||
// CHECK: [[T0:%.*]] = bitcast [[BLOCK_T]]* [[BLOCK]] to i32 ()*
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast i32 ()* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T2:%.*]] = call i8* @objc_retainBlock(i8* [[T1]]) nounwind
|
||||
// CHECK-NEXT: [[T2:%.*]] = call i8* @objc_retainBlock(i8* [[T1]]) [[NUW:#[0-9]+]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast i8* [[T2]] to i32 ()*
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i32 ()* [[T3]] to i8*
|
||||
// CHECK-NEXT: [[T5:%.*]] = tail call i8* @objc_autoreleaseReturnValue(i8* [[T4]]) nounwind
|
||||
// CHECK-NEXT: [[T5:%.*]] = tail call i8* @objc_autoreleaseReturnValue(i8* [[T4]]) [[NUW]]
|
||||
// CHECK-NEXT: [[T6:%.*]] = bitcast i8* [[T5]] to i32 ()*
|
||||
// CHECK-NEXT: ret i32 ()* [[T6]]
|
||||
return ^{ return x; };
|
||||
|
@ -36,9 +36,9 @@ void test2(id x) {
|
|||
// CHECK-NEXT: bitcast
|
||||
// CHECK-NEXT: call void @test2_helper(
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[SLOTREL]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]], !clang.imprecise_release
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[X]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]], !clang.imprecise_release
|
||||
// CHECK-NEXT: ret void
|
||||
extern void test2_helper(id (^)(void));
|
||||
test2_helper(^{ return x; });
|
||||
|
@ -50,7 +50,7 @@ void test2(id x) {
|
|||
// CHECK-NEXT: [[DST:%.*]] = bitcast i8* [[T0]] to [[BLOCK_T]]*
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[SRC]], i32 0, i32 5
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i8** [[T0]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = call i8* @objc_retain(i8* [[T1]]) nounwind
|
||||
// CHECK-NEXT: [[T2:%.*]] = call i8* @objc_retain(i8* [[T1]]) [[NUW]]
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
// CHECK: define internal void @__destroy_helper_block_
|
||||
|
@ -623,8 +623,8 @@ void test18(id x) {
|
|||
// CHECK-UNOPT-NEXT: store i8* [[T1]], i8** [[SLOT]],
|
||||
// CHECK-UNOPT-NEXT: bitcast
|
||||
// CHECK-UNOPT-NEXT: call void @test18_helper(
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[SLOTREL]], i8* null) nounwind
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[X]], i8* null) nounwind
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[SLOTREL]], i8* null) [[NUW:#[0-9]+]]
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[X]], i8* null) [[NUW]]
|
||||
// CHECK-UNOPT-NEXT: ret void
|
||||
extern void test18_helper(id (^)(void));
|
||||
test18_helper(^{ return x; });
|
||||
|
@ -638,7 +638,7 @@ void test18(id x) {
|
|||
// CHECK-UNOPT-NEXT: [[T1:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[DST]], i32 0, i32 5
|
||||
// CHECK-UNOPT-NEXT: [[T2:%.*]] = load i8** [[T0]]
|
||||
// CHECK-UNOPT-NEXT: store i8* null, i8** [[T1]]
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[T1]], i8* [[T2]]) nounwind
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[T1]], i8* [[T2]]) [[NUW]]
|
||||
// CHECK-UNOPT-NEXT: ret void
|
||||
|
||||
// CHECK-UNOPT: define internal void @__destroy_helper_block_
|
||||
|
@ -648,3 +648,6 @@ void test18(id x) {
|
|||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[T2]], i8* null)
|
||||
// CHECK-UNOPT-NEXT: ret void
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
// CHECK-UNOPT: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -17,12 +17,12 @@ void test0(void) {
|
|||
// CHECK: [[T0:%.*]] = call i8* @objc_begin_catch(
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to [[ETY]]*
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[ETY]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = call i8* @objc_retain(i8* [[T2]]) nounwind
|
||||
// CHECK-NEXT: [[T3:%.*]] = call i8* @objc_retain(i8* [[T2]]) [[NUW:#[0-9]+]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to [[ETY]]*
|
||||
// CHECK-NEXT: store [[ETY]]* [[T4]], [[ETY]]** [[E]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[ETY]]** [[E]] to i8**
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T0]], i8* null) nounwind
|
||||
// CHECK-NEXT: call void @objc_end_catch() nounwind
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T0]], i8* null) [[NUW]]
|
||||
// CHECK-NEXT: call void @objc_end_catch() [[NUW]]
|
||||
|
||||
void test1_helper(void);
|
||||
void test1(void) {
|
||||
|
@ -38,7 +38,9 @@ void test1(void) {
|
|||
// CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to [[ETY]]*
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[ETY]]** [[E]] to i8**
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast [[ETY]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: call i8* @objc_initWeak(i8** [[T2]], i8* [[T3]]) nounwind
|
||||
// CHECK-NEXT: call i8* @objc_initWeak(i8** [[T2]], i8* [[T3]]) [[NUW]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[ETY]]** [[E]] to i8**
|
||||
// CHECK-NEXT: call void @objc_destroyWeak(i8** [[T0]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_end_catch() nounwind
|
||||
// CHECK-NEXT: call void @objc_destroyWeak(i8** [[T0]]) [[NUW]]
|
||||
// CHECK-NEXT: call void @objc_end_catch() [[NUW]]
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -33,7 +33,7 @@ void test0(NSArray *array) {
|
|||
// CHECK-LP64-NEXT: store [[ARRAY_T]]* null, [[ARRAY_T]]** [[ARRAY]]
|
||||
// CHECK-LP64-NEXT: [[ZERO:%.*]] = bitcast [[ARRAY_T]]** [[ARRAY]] to i8**
|
||||
// CHECK-LP64-NEXT: [[ONE:%.*]] = bitcast [[ARRAY_T]]* {{%.*}} to i8*
|
||||
// CHECK-LP64-NEXT: call void @objc_storeStrong(i8** [[ZERO]], i8* [[ONE]]) nounwind
|
||||
// CHECK-LP64-NEXT: call void @objc_storeStrong(i8** [[ZERO]], i8* [[ONE]]) [[NUW:#[0-9]+]]
|
||||
|
||||
// Initialize the fast enumaration state.
|
||||
// CHECK-LP64-NEXT: [[T0:%.*]] = bitcast [[STATE_T]]* [[STATE]] to i8*
|
||||
|
@ -170,3 +170,5 @@ void test3(NSArray *array) {
|
|||
// CHECK-LP64-NEXT: call void @use(i8* [[T0]])
|
||||
// CHECK-LP64-NEXT: br label [[L]]
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -9,8 +9,8 @@ void thrower(void);
|
|||
void not(void) __attribute__((nothrow));
|
||||
|
||||
// CHECK: define void @test0(
|
||||
// CHECK: call void @thrower() "target-features"={{.*}}, !clang.arc.no_objc_arc_exceptions !
|
||||
// CHECK: call void @not() nounwind "target-features"={{.*}}, !clang.arc.no_objc_arc_exceptions !
|
||||
// CHECK: call void @thrower() [[TF:#[0-9]+]], !clang.arc.no_objc_arc_exceptions !
|
||||
// CHECK: call void @not() [[NUW:#[0-9]+]], !clang.arc.no_objc_arc_exceptions !
|
||||
// NO-METADATA: define void @test0(
|
||||
// NO-METADATA-NOT: !clang.arc.no_objc_arc_exceptions
|
||||
// NO-METADATA: }
|
||||
|
@ -20,8 +20,8 @@ void test0(void) {
|
|||
}
|
||||
|
||||
// CHECK: define void @test1(
|
||||
// CHECK: call void @thrower() "target-features"={{.*}}, !clang.arc.no_objc_arc_exceptions !
|
||||
// CHECK: call void @not() nounwind "target-features"={{.*}}, !clang.arc.no_objc_arc_exceptions !
|
||||
// CHECK: call void @thrower() [[TF]], !clang.arc.no_objc_arc_exceptions !
|
||||
// CHECK: call void @not() [[NUW]], !clang.arc.no_objc_arc_exceptions !
|
||||
// NO-METADATA: define void @test1(
|
||||
// NO-METADATA-NOT: !clang.arc.no_objc_arc_exceptions
|
||||
// NO-METADATA: }
|
||||
|
@ -76,3 +76,5 @@ void test4(void) {
|
|||
b();
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind{{.*}} }
|
||||
|
|
|
@ -62,7 +62,7 @@ static Class theGlobalClass;
|
|||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[TEST2]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8* [[T2]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i8**
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T4]], i8* [[T0]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T4]], i8* [[T0]]) [[NUW:#[0-9]+]]
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
// CHECK: define internal i8* @"\01-[Test2 theClass]"(
|
||||
|
@ -83,5 +83,7 @@ static Class theGlobalClass;
|
|||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST2]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds i8* [[T1]], i64 [[OFFSET]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast i8* [[T2]] to i8**
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T3]], i8* null) nounwind
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T3]], i8* null) [[NUW]]
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -20,15 +20,15 @@ void test0(_Bool cond) {
|
|||
// CHECK-NEXT: store i1 true, i1* [[RELCOND]]
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[T0:%.*]] = phi i8* [ null, {{%.*}} ], [ [[CALL]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retain(i8* [[T0]]) nounwind
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retain(i8* [[T0]]) [[NUW:#[0-9]+]]
|
||||
// CHECK-NEXT: store i8* [[T1]], i8** [[X]],
|
||||
// CHECK-NEXT: [[REL:%.*]] = load i1* [[RELCOND]]
|
||||
// CHECK-NEXT: br i1 [[REL]],
|
||||
// CHECK: [[T0:%.*]] = load i8** [[RELVAL]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]]
|
||||
// CHECK-NEXT: br label
|
||||
// CHECK: [[T0:%.*]] = load i8** [[X]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]]
|
||||
// CHECK-NEXT: ret void
|
||||
id x = (cond ? 0 : test0_helper());
|
||||
}
|
||||
|
@ -132,3 +132,5 @@ void test2(int cond) {
|
|||
// And way down at the end of the loop:
|
||||
// CHECK: call void @objc_release(i8* [[RESULT]])
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -8,8 +8,9 @@ void test19() {
|
|||
// CHECK-UNOPT: [[X2:%.*]] = getelementptr inbounds [[BYREF_T:%.*]]* [[VAR1:%.*]], i32 0, i32 6
|
||||
// CHECK-UNOPT-NEXT: [[SIX:%.*]] = load i8** [[X2]], align 8
|
||||
// CHECK-UNOPT-NEXT: store i8* null, i8** [[X]], align 8
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[X]], i8* [[SIX]]) nounwind
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[X2]], i8* null) nounwind
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[X]], i8* [[SIX]]) [[NUW:#[0-9]+]]
|
||||
// CHECK-UNOPT-NEXT: call void @objc_storeStrong(i8** [[X2]], i8* null) [[NUW]]
|
||||
// CHECK-UNOPT-NEXT: ret void
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -13,5 +13,7 @@ void test() {
|
|||
// CHECK: [[T0:%.*]] = call i8* @make()
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[T0]])
|
||||
// CHECK-NEXT: [[T2:%.*]] = call i8* @objc_autorelease(i8* [[T1]])
|
||||
// CHECK-NEXT: call void @objc_exception_throw(i8* [[T2]]) noreturn
|
||||
// CHECK-NEXT: call void @objc_exception_throw(i8* [[T2]]) [[NR:#[0-9]+]]
|
||||
// CHECK-NEXT: unreachable
|
||||
|
||||
// CHECK: attributes [[NR]] = { noreturn }
|
||||
|
|
|
@ -116,12 +116,12 @@ void test3_unelided() {
|
|||
// CHECK-NEXT: load i8** @"\01L_OBJC_SELECTOR_REFERENCES_
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST3]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[COPY:%.*]] = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend {{.*}})(i8* [[T1]],
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[COPY]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[COPY]]) [[NUW:#[0-9]+]]
|
||||
[x copy];
|
||||
|
||||
// CHECK-NEXT: [[T0:%.*]] = load [[TEST3]]** [[X]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST3]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) [[NUW]]
|
||||
// CHECK-NEXT: ret void
|
||||
}
|
||||
|
||||
|
@ -155,13 +155,13 @@ void test3() {
|
|||
// Assignment to x.
|
||||
// CHECK-NEXT: [[TMP:%.*]] = load i8** [[X]]
|
||||
// CHECK-NEXT: store i8* [[COPY]], i8** [[X]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[TMP]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[TMP]]) [[NUW]]
|
||||
|
||||
x = [x copy];
|
||||
|
||||
// Cleanup for x.
|
||||
// CHECK-NEXT: [[TMP:%.*]] = load i8** [[X]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[TMP]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[TMP]]) [[NUW]]
|
||||
|
||||
// CHECK-NEXT: ret void
|
||||
}
|
||||
|
@ -216,7 +216,7 @@ void test5(Test5 *x, id y) {
|
|||
// CHECK-NEXT: [[VAR:%.*]] = bitcast
|
||||
// CHECK-NEXT: [[TMP:%.*]] = load i8** [[VAR]]
|
||||
// CHECK-NEXT: store i8* null, i8** [[VAR]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[TMP]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[TMP]]) [[NUW]]
|
||||
x->var = 0;
|
||||
|
||||
// CHECK-NEXT: [[YVAL:%.*]] = load i8** [[Y]]
|
||||
|
@ -225,18 +225,18 @@ void test5(Test5 *x, id y) {
|
|||
// CHECK-NEXT: bitcast
|
||||
// CHECK-NEXT: getelementptr
|
||||
// CHECK-NEXT: [[VAR:%.*]] = bitcast
|
||||
// CHECK-NEXT: [[T0:%.*]] = call i8* @objc_retain(i8* [[YVAL]]) nounwind
|
||||
// CHECK-NEXT: [[T0:%.*]] = call i8* @objc_retain(i8* [[YVAL]]) [[NUW]]
|
||||
// CHECK-NEXT: [[TMP:%.*]] = load i8** [[VAR]]
|
||||
// CHECK-NEXT: store i8* [[T0]], i8** [[VAR]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[TMP]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[TMP]]) [[NUW]]
|
||||
x->var = y;
|
||||
|
||||
// Epilogue.
|
||||
// CHECK-NEXT: [[TMP:%.*]] = load i8** [[Y]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[TMP]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[TMP]]) [[NUW]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = load [[TEST5]]** [[X]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST5]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) [[NUW]]
|
||||
// CHECK-NEXT: ret void
|
||||
}
|
||||
|
||||
|
@ -247,7 +247,7 @@ void test6() {
|
|||
// CHECK-NEXT: [[CALL:%.*]] = call i8* @test6_helper()
|
||||
// CHECK-NEXT: store i8* [[CALL]], i8** [[X]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i8** [[X]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) [[NUW]], !clang.imprecise_release
|
||||
// CHECK-NEXT: ret void
|
||||
id x = test6_helper();
|
||||
}
|
||||
|
@ -258,10 +258,10 @@ void test7() {
|
|||
// CHECK: [[X:%.*]] = alloca i8*
|
||||
// CHECK-NEXT: store i8* null, i8** [[X]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[X]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retain(i8* [[T0]]) nounwind
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retain(i8* [[T0]]) [[NUW]]
|
||||
// CHECK-NEXT: call void @test7_helper(i8* [[T1]])
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i8** [[X]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) [[NUW]], !clang.imprecise_release
|
||||
// CHECK-NEXT: ret void
|
||||
id x;
|
||||
test7_helper(x);
|
||||
|
@ -273,7 +273,7 @@ void test8() {
|
|||
// CHECK: [[X:%.*]] = alloca i8*
|
||||
// CHECK-NEXT: [[T0:%.*]] = call i8* @test8_helper()
|
||||
// CHECK-NEXT: store i8* [[T0]], i8** [[X]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]]
|
||||
// CHECK-NOT: imprecise_release
|
||||
// CHECK-NEXT: ret void
|
||||
}
|
||||
|
@ -288,10 +288,10 @@ void test9() {
|
|||
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i8** [[X]]
|
||||
// CHECK-NEXT: store i8* null, i8** [[X]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) [[NUW]], !clang.imprecise_release
|
||||
|
||||
// CHECK-NEXT: [[T1:%.*]] = load i8** [[X]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) [[NUW]]
|
||||
// CHECK-NOT: clang.imprecise_release
|
||||
|
||||
// CHECK-NEXT: ret void
|
||||
|
@ -342,7 +342,7 @@ void test11(id (*f)(void) __attribute__((ns_returns_retained))) {
|
|||
// CHECK-NEXT: [[T1:%.*]] = call i8* [[T0]]()
|
||||
// CHECK-NEXT: store i8* [[T1]], i8** [[X]], align
|
||||
// CHECK-NEXT: [[T3:%.*]] = load i8** [[X]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T3]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T3]]) [[NUW]], !clang.imprecise_release
|
||||
// CHECK-NEXT: ret void
|
||||
id x = f();
|
||||
}
|
||||
|
@ -371,7 +371,7 @@ void test12(void) {
|
|||
// CHECK-NEXT: store i8* [[T2]], i8** [[Y]], align
|
||||
|
||||
// CHECK-NEXT: [[T4:%.*]] = load i8** [[Y]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T4]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T4]]) [[NUW]], !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_destroyWeak(i8** [[X]])
|
||||
// CHECK-NEXT: ret void
|
||||
}
|
||||
|
@ -387,7 +387,7 @@ void test13(void) {
|
|||
extern fnty *test13_func;
|
||||
// CHECK-NEXT: [[FN:%.*]] = load void (i8*)** @test13_func, align
|
||||
// CHECK-NEXT: [[X_VAL:%.*]] = load i8** [[X]], align
|
||||
// CHECK-NEXT: [[X_TMP:%.*]] = call i8* @objc_retain(i8* [[X_VAL]]) nounwind
|
||||
// CHECK-NEXT: [[X_TMP:%.*]] = call i8* @objc_retain(i8* [[X_VAL]]) [[NUW]]
|
||||
// CHECK-NEXT: call void [[FN]](i8* [[X_TMP]])
|
||||
test13_func(x);
|
||||
|
||||
|
@ -397,14 +397,14 @@ void test13(void) {
|
|||
// CHECK-NEXT: [[BLOCK_FN_PTR:%.*]] = getelementptr inbounds [[BLOCKTY]]* [[BLOCK]], i32 0, i32 3
|
||||
// CHECK-NEXT: [[BLOCK_OPAQUE:%.*]] = bitcast [[BLOCKTY]]* [[BLOCK]] to i8*
|
||||
// CHECK-NEXT: [[X_VAL:%.*]] = load i8** [[X]], align
|
||||
// CHECK-NEXT: [[X_TMP:%.*]] = call i8* @objc_retain(i8* [[X_VAL]]) nounwind
|
||||
// CHECK-NEXT: [[X_TMP:%.*]] = call i8* @objc_retain(i8* [[X_VAL]]) [[NUW]]
|
||||
// CHECK-NEXT: [[BLOCK_FN_TMP:%.*]] = load i8** [[BLOCK_FN_PTR]]
|
||||
// CHECK-NEXT: [[BLOCK_FN:%.*]] = bitcast i8* [[BLOCK_FN_TMP]] to void (i8*, i8*)*
|
||||
// CHECK-NEXT: call void [[BLOCK_FN]](i8* [[BLOCK_OPAQUE]], i8* [[X_TMP]])
|
||||
test13_block(x);
|
||||
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[X]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]]
|
||||
// CHECK-NEXT: ret void
|
||||
}
|
||||
|
||||
|
@ -454,14 +454,14 @@ void test13(void) {
|
|||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[TEST16]]* [[BASE]] to i8*
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8* [[T0]], i64 [[Y_OFF]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast i8* [[T1]] to i8**
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T2]], i8* null) nounwind
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T2]], i8* null) [[NUW]]
|
||||
|
||||
// Destroy z.
|
||||
// CHECK-NEXT: [[Z_OFF:%.*]] = load i64* @"OBJC_IVAR_$_Test16.z"
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[TEST16]]* [[BASE]] to i8*
|
||||
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8* [[T0]], i64 [[Z_OFF]]
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast i8* [[T1]] to i8**
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T2]], i8* null) nounwind
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T2]], i8* null) [[NUW]]
|
||||
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
@ -488,11 +488,11 @@ void test19() {
|
|||
x[2] = test19_helper();
|
||||
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call i8* @test19_helper()
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[CALL]]) nounwind
|
||||
// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[CALL]]) [[NUW]]
|
||||
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds [5 x i8*]* [[X]], i32 0, i64 2
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[SLOT]]
|
||||
// CHECK-NEXT: store i8* [[T1]], i8** [[SLOT]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]]
|
||||
|
||||
// CHECK-NEXT: [[BEGIN:%.*]] = getelementptr inbounds [5 x i8*]* [[X]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[END:%.*]] = getelementptr inbounds i8** [[BEGIN]], i64 5
|
||||
|
@ -501,7 +501,7 @@ void test19() {
|
|||
// CHECK: [[AFTER:%.*]] = phi i8** [ [[END]], {{%.*}} ], [ [[NEXT:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds i8** [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[CUR]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]], !clang.imprecise_release
|
||||
// CHECK-NEXT: [[EQ:%.*]] = icmp eq i8** [[CUR]], [[BEGIN]]
|
||||
// CHECK-NEXT: br i1 [[EQ]],
|
||||
|
||||
|
@ -540,7 +540,7 @@ void test20(unsigned n) {
|
|||
// CHECK: [[AFTER:%.*]] = phi i8** [ [[END]], {{%.*}} ], [ [[CUR:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds i8** [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[CUR]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]], !clang.imprecise_release
|
||||
// CHECK-NEXT: [[EQ:%.*]] = icmp eq i8** [[CUR]], [[VLA]]
|
||||
// CHECK-NEXT: br i1 [[EQ]],
|
||||
|
||||
|
@ -586,7 +586,7 @@ void test21(unsigned n) {
|
|||
// CHECK: [[AFTER:%.*]] = phi i8** [ [[END]], {{%.*}} ], [ [[CUR:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[CUR:%.*]] = getelementptr inbounds i8** [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[CUR]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]], !clang.imprecise_release
|
||||
// CHECK-NEXT: [[EQ:%.*]] = icmp eq i8** [[CUR]], [[BEGIN]]
|
||||
// CHECK-NEXT: br i1 [[EQ]],
|
||||
|
||||
|
@ -705,13 +705,13 @@ static id _test29_allocator = 0;
|
|||
// Return statement.
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast i8* [[CALL]]
|
||||
// CHECK-NEXT: [[CALL:%.*]] = bitcast
|
||||
// CHECK-NEXT: [[RET:%.*]] = call i8* @objc_retain(i8* [[CALL]]) nounwind
|
||||
// CHECK-NEXT: [[RET:%.*]] = call i8* @objc_retain(i8* [[CALL]]) [[NUW]]
|
||||
// CHECK-NEXT: store i32 1, i32* [[CLEANUP]]
|
||||
|
||||
// Cleanup.
|
||||
// CHECK-NEXT: [[T0:%.*]] = load [[TEST29]]** [[SELF]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST29]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) [[NUW]], !clang.imprecise_release
|
||||
|
||||
// Return.
|
||||
// CHECK-NEXT: ret i8* [[RET]]
|
||||
|
@ -749,7 +749,7 @@ static id _test29_allocator = 0;
|
|||
// Assignment.
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast i8* [[CALL]] to [[TEST29]]*
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST29]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[T2:%.*]] = call i8* @objc_retain(i8* [[T1]]) nounwind
|
||||
// CHECK-NEXT: [[T2:%.*]] = call i8* @objc_retain(i8* [[T1]]) [[NUW]]
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast i8* [[T2]] to [[TEST29]]*
|
||||
// CHECK-NEXT: [[T4:%.*]] = load [[TEST29]]** [[SELF]], align
|
||||
// CHECK-NEXT: store [[TEST29]]* [[T3]], [[TEST29]]** [[SELF]], align
|
||||
|
@ -759,16 +759,16 @@ static id _test29_allocator = 0;
|
|||
// Return statement.
|
||||
// CHECK-NEXT: [[T0:%.*]] = load [[TEST29]]** [[SELF]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST29]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[RET:%.*]] = call i8* @objc_retain(i8* [[T1]]) nounwind
|
||||
// CHECK-NEXT: [[RET:%.*]] = call i8* @objc_retain(i8* [[T1]]) [[NUW]]
|
||||
// CHECK-NEXT: store i32 1, i32* [[CLEANUP]]
|
||||
|
||||
// Cleanup.
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[ALLOCATOR]]
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T0]]) [[NUW]], !clang.imprecise_release
|
||||
|
||||
// CHECK-NEXT: [[T0:%.*]] = load [[TEST29]]** [[SELF]]
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST29]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) [[NUW]], !clang.imprecise_release
|
||||
|
||||
// Return.
|
||||
// CHECK-NEXT: ret i8* [[RET]]
|
||||
|
@ -1263,7 +1263,7 @@ void test58a(void) {
|
|||
// CHECK-NEXT: store i8* [[T6]], i8**
|
||||
// CHECK-NEXT: [[T0:%.*]] = load [[TEST58]]**
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST58]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) nounwind, !clang.imprecise_release
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) [[NUW]], !clang.imprecise_release
|
||||
// CHECK-NEXT: ret void
|
||||
Test58 *ptr = test58_helper();
|
||||
char *c = [(ptr) interior];
|
||||
|
@ -1283,7 +1283,7 @@ void test58b(void) {
|
|||
// CHECK-NEXT: store i8* [[T3]], i8**
|
||||
// CHECK-NEXT: [[T0:%.*]] = load [[TEST58]]**
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast [[TEST58]]* [[T0]] to i8*
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T1]]) [[NUW]]
|
||||
// CHECK-NOT: clang.imprecise_release
|
||||
// CHECK-NEXT: ret void
|
||||
__attribute__((objc_precise_lifetime)) Test58 *ptr = test58_helper();
|
||||
|
@ -1431,7 +1431,7 @@ void test66(void) {
|
|||
// CHECK-NEXT: br i1 [[SIX]], label [[NULINIT:%.*]], label [[CALL:%.*]]
|
||||
// CHECK: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*)*)(i8* [[T7]], i8* [[T6]], i8* [[T5]])
|
||||
// CHECK-NEXT: br label [[CONT:%.*]]
|
||||
// CHECK: call void @objc_release(i8* [[T5]]) nounwind
|
||||
// CHECK: call void @objc_release(i8* [[T5]]) [[NUW]]
|
||||
// CHECK-NEXT: br label [[CONT:%.*]]
|
||||
// CHECK: [[T8:%.*]] = bitcast [[TEST66]]* [[T3]] to i8*
|
||||
// CHECK-NEXT: call void @objc_release(i8* [[T8]])
|
||||
|
@ -1487,4 +1487,4 @@ void test70(id i) {
|
|||
// CHECK: attributes #0 = { nounwind "target-features"={{.*}} }
|
||||
// CHECK: attributes #1 = { nonlazybind }
|
||||
// CHECK: attributes #2 = { "target-features"={{.*}} }
|
||||
// CHECK: attributes #3 = { nounwind }
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -62,14 +62,15 @@ typedef enum : NSUInteger {
|
|||
TMap *map = [TMap mapForID:mapID];
|
||||
// Make sure we do not map code generated for the block to the above line.
|
||||
// CHECK: define internal void @"__39-[TServer serverConnection:getCommand:]_block_invoke"
|
||||
// CHECK: call void @objc_storeStrong(i8** [[ZERO:%.*]], i8* [[ONE:%.*]]) nounwind
|
||||
// CHECK: call void @objc_storeStrong(i8** [[TWO:%.*]], i8* [[THREE:%.*]]) nounwind
|
||||
// CHECK: call void @objc_storeStrong(i8** [[ZERO:%.*]], i8* [[ONE:%.*]]) [[NUW:#[0-9]+]]
|
||||
// CHECK: call void @objc_storeStrong(i8** [[TWO:%.*]], i8* [[THREE:%.*]]) [[NUW]]
|
||||
// CHECK: bitcast %5** [[TMP:%.*]] to i8**
|
||||
// CHECK: call void @objc_storeStrong(i8** [[VAL1:%.*]], i8* null) nounwind, !dbg ![[MD1:.*]]
|
||||
// CHECK: call void @objc_storeStrong(i8** [[VAL1:%.*]], i8* null) [[NUW]], !dbg ![[MD1:.*]]
|
||||
// CHECK: bitcast %4** [[TMP:%.*]] to i8**
|
||||
// CHECK: call void @objc_storeStrong(i8** [[VAL2:%.*]], i8* null) nounwind, !dbg ![[MD1]]
|
||||
// CHECK: call void @objc_storeStrong(i8** [[VAL2:%.*]], i8* null) [[NUW]], !dbg ![[MD1]]
|
||||
// CHECK-NEXT: ret
|
||||
// CHECK: ![[MD1]] = metadata !{i32 86
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
// CHECK: ![[MD1]] = metadata !{i32 87
|
||||
[map dataWithCompletionBlock:^(NSData *data, NSError *error) {
|
||||
if (data) {
|
||||
NSString *encoded = [[data compressedData] encodedString:18];
|
||||
|
|
|
@ -9,6 +9,8 @@ void test0(void) {
|
|||
// CHECK-NEXT: store i8* [[T0]], i8** [[X:%.*]], align 8
|
||||
// CHECK-NEXT: call i8* @test0_helper()
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[X]], align 8
|
||||
// CHECK-NEXT: call void asm sideeffect "", "r"(i8* [[T0]]) nounwind
|
||||
// CHECK-NEXT: call void asm sideeffect "", "r"(i8* [[T0]]) [[NUW:#[0-9]+]]
|
||||
// CHECK-NEXT: ret void
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -25,7 +25,7 @@ void test0(void) {
|
|||
// CHECK-NEXT: [[EIGHT:%.*]] = bitcast i8* [[FN]]
|
||||
// CHECK-NEXT: [[CALL:%.*]] = call signext i8 [[EIGHT]]
|
||||
// CHECK-NEXT: br label [[CONT:%.*]]
|
||||
// CHECK: call void @objc_release(i8* [[FIVE]]) nounwind
|
||||
// CHECK: call void @objc_release(i8* [[FIVE]]) [[NUW:#[0-9]+]]
|
||||
// CHECK-NEXT: br label [[CONT]]
|
||||
// CHECK: phi i8 [ [[CALL]], {{%.*}} ], [ 0, {{%.*}} ]
|
||||
|
||||
|
@ -44,7 +44,7 @@ void test1(void) {
|
|||
// CHECK: [[T0:%.*]] = call i8* bitcast (
|
||||
// CHECK-NEXT: store i8* [[T0]], i8** [[OBJ]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = load i8** [[OBJ]]
|
||||
// CHECK-NEXT: call i8* @objc_initWeak(i8** [[WEAKOBJ]], i8* [[T0]]) nounwind
|
||||
// CHECK-NEXT: call i8* @objc_initWeak(i8** [[WEAKOBJ]], i8* [[T0]]) [[NUW]]
|
||||
// Okay, start the message-send.
|
||||
// CHECK-NEXT: [[T0:%.*]] = load [[MYOBJECT:%.*]]** @x
|
||||
// CHECK-NEXT: [[ARG:%.*]] = load i8** [[OBJ]]
|
||||
|
@ -65,7 +65,7 @@ void test1(void) {
|
|||
// CHECK-NEXT: [[IMAGCALL:%.*]] = load float* [[T0]]
|
||||
// CHECK-NEXT: br label [[CONT:%.*]]{{$}}
|
||||
// Null path.
|
||||
// CHECK: call void @objc_release(i8* [[ARG_RETAINED]]) nounwind
|
||||
// CHECK: call void @objc_release(i8* [[ARG_RETAINED]]) [[NUW]]
|
||||
// CHECK-NEXT: br label [[CONT]]
|
||||
// Join point.
|
||||
// CHECK: [[REAL:%.*]] = phi float [ [[REALCALL]], [[INVOKE_CONT]] ], [ 0.000000e+00, [[FORNULL]] ]
|
||||
|
@ -75,9 +75,11 @@ void test1(void) {
|
|||
// CHECK-NEXT: store float [[REAL]], float* [[T0]]
|
||||
// CHECK-NEXT: store float [[IMAG]], float* [[T1]]
|
||||
// Epilogue.
|
||||
// CHECK-NEXT: call void @objc_destroyWeak(i8** [[WEAKOBJ]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[OBJ]], i8* null) nounwind
|
||||
// CHECK-NEXT: call void @objc_destroyWeak(i8** [[WEAKOBJ]]) [[NUW]]
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[OBJ]], i8* null) [[NUW]]
|
||||
// CHECK-NEXT: ret void
|
||||
// Cleanup.
|
||||
// CHECK: landingpad
|
||||
// CHECK: call void @objc_destroyWeak(i8** [[WEAKOBJ]]) nounwind
|
||||
// CHECK: call void @objc_destroyWeak(i8** [[WEAKOBJ]]) [[NUW]]
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -12,9 +12,10 @@ id func() {
|
|||
}
|
||||
|
||||
// CHECK: [[call:%.*]] = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend
|
||||
// CHECK: [[SIX:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[call]]) nounwind
|
||||
// CHECK: [[SIX:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[call]]) [[NUW:#[0-9]+]]
|
||||
// CHECK: [[ARRAY_CASTED:%.*]] = bitcast %0** {{%.*}} to i8**
|
||||
// CHECK: call void @objc_storeStrong(i8** [[ARRAY_CASTED]], i8* null)
|
||||
// CHECK: [[EIGHT:%.*]] = tail call i8* @objc_autoreleaseReturnValue(i8* [[SIX]]) nounwind
|
||||
// CHECK: [[EIGHT:%.*]] = tail call i8* @objc_autoreleaseReturnValue(i8* [[SIX]]) [[NUW]]
|
||||
// CHECK: ret i8* [[EIGHT]]
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -17,12 +17,12 @@ void test0(void) {
|
|||
// CHECK: [[T0:%.*]] = call i8* @objc_begin_catch(
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to [[ETY]]*
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[ETY]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = call i8* @objc_retain(i8* [[T2]]) nounwind
|
||||
// CHECK-NEXT: [[T3:%.*]] = call i8* @objc_retain(i8* [[T2]]) [[NUW:#[0-9]+]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to [[ETY]]*
|
||||
// CHECK-NEXT: store [[ETY]]* [[T4]], [[ETY]]** [[E]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[ETY]]** [[E]] to i8**
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T0]], i8* null) nounwind
|
||||
// CHECK-NEXT: call void @objc_end_catch() nounwind
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T0]], i8* null) [[NUW]]
|
||||
// CHECK-NEXT: call void @objc_end_catch() [[NUW]]
|
||||
|
||||
void test1_helper(void);
|
||||
void test1(void) {
|
||||
|
@ -38,10 +38,10 @@ void test1(void) {
|
|||
// CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to [[ETY]]*
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[ETY]]** [[E]] to i8**
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast [[ETY]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: call i8* @objc_initWeak(i8** [[T2]], i8* [[T3]]) nounwind
|
||||
// CHECK-NEXT: call i8* @objc_initWeak(i8** [[T2]], i8* [[T3]]) [[NUW]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[ETY]]** [[E]] to i8**
|
||||
// CHECK-NEXT: call void @objc_destroyWeak(i8** [[T0]]) nounwind
|
||||
// CHECK-NEXT: call void @objc_end_catch() nounwind
|
||||
// CHECK-NEXT: call void @objc_destroyWeak(i8** [[T0]]) [[NUW]]
|
||||
// CHECK-NEXT: call void @objc_end_catch() [[NUW]]
|
||||
|
||||
void test2_helper(void);
|
||||
void test2(void) {
|
||||
|
@ -56,12 +56,12 @@ void test2(void) {
|
|||
// CHECK: [[T0:%.*]] = call i8* @__cxa_begin_catch(
|
||||
// CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to [[ETY]]*
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[ETY]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: [[T3:%.*]] = call i8* @objc_retain(i8* [[T2]]) nounwind
|
||||
// CHECK-NEXT: [[T3:%.*]] = call i8* @objc_retain(i8* [[T2]]) [[NUW]]
|
||||
// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to [[ETY]]*
|
||||
// CHECK-NEXT: store [[ETY]]* [[T4]], [[ETY]]** [[E]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[ETY]]** [[E]] to i8**
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T0]], i8* null) nounwind
|
||||
// CHECK-NEXT: call void @__cxa_end_catch() nounwind
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[T0]], i8* null) [[NUW]]
|
||||
// CHECK-NEXT: call void @__cxa_end_catch() [[NUW]]
|
||||
|
||||
void test3_helper(void);
|
||||
void test3(void) {
|
||||
|
@ -77,10 +77,10 @@ void test3(void) {
|
|||
// CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to [[ETY]]*
|
||||
// CHECK-NEXT: [[T2:%.*]] = bitcast [[ETY]]** [[E]] to i8**
|
||||
// CHECK-NEXT: [[T3:%.*]] = bitcast [[ETY]]* [[T1]] to i8*
|
||||
// CHECK-NEXT: call i8* @objc_initWeak(i8** [[T2]], i8* [[T3]]) nounwind
|
||||
// CHECK-NEXT: call i8* @objc_initWeak(i8** [[T2]], i8* [[T3]]) [[NUW]]
|
||||
// CHECK-NEXT: [[T0:%.*]] = bitcast [[ETY]]** [[E]] to i8**
|
||||
// CHECK-NEXT: call void @objc_destroyWeak(i8** [[T0]]) nounwind
|
||||
// CHECK-NEXT: call void @__cxa_end_catch() nounwind
|
||||
// CHECK-NEXT: call void @objc_destroyWeak(i8** [[T0]]) [[NUW]]
|
||||
// CHECK-NEXT: call void @__cxa_end_catch() [[NUW]]
|
||||
|
||||
namespace test4 {
|
||||
struct A {
|
||||
|
@ -112,11 +112,13 @@ namespace test4 {
|
|||
// CHECK-NEXT: br label
|
||||
// CHECK: [[AFTER:%.*]] = phi i8** [ [[ARRAYEND]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]
|
||||
// CHECK-NEXT: [[ELT]] = getelementptr inbounds i8** [[AFTER]], i64 -1
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[ELT]], i8* null) nounwind
|
||||
// CHECK-NEXT: call void @objc_storeStrong(i8** [[ELT]], i8* null) [[NUW]]
|
||||
// CHECK-NEXT: [[DONE:%.*]] = icmp eq i8** [[ELT]], [[ARRAYBEGIN]]
|
||||
// CHECK-NEXT: br i1 [[DONE]],
|
||||
// - Next, destroy single.
|
||||
// CHECK: call void @objc_storeStrong(i8** [[SINGLE]], i8* null) nounwind
|
||||
// CHECK: call void @objc_storeStrong(i8** [[SINGLE]], i8* null) [[NUW]]
|
||||
// CHECK: br label
|
||||
// CHECK: resume
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NUW]] = { nounwind }
|
||||
|
|
|
@ -29,6 +29,8 @@ namespace test1 {
|
|||
} @catch (id i) {
|
||||
}
|
||||
}
|
||||
// CHECK: invoke void @objc_exception_throw(i8* [[CALL:%.*]]) noreturn
|
||||
// CHECK: invoke void @objc_exception_throw(i8* [[CALL:%.*]]) [[NR:#[0-9]+]]
|
||||
// CHECK: to label [[INVOKECONT1:%.*]] unwind label [[LPAD:%.*]]
|
||||
}
|
||||
|
||||
// CHECK: attributes [[NR]] = { noreturn }
|
||||
|
|
Loading…
Reference in New Issue