// RUN: %clang_cc1 -no-opaque-pointers -triple i386-unknown-unknown -emit-llvm -disable-llvm-passes -Os -o - %s | FileCheck %s
// RUN: %clang_cc1 -no-opaque-pointers -triple i386-unknown-unknown -emit-llvm -disable-llvm-passes -Os -std=c99 -o - %s | FileCheck %s
// RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-unknown-unknown -emit-llvm -disable-llvm-passes -Os -std=c99 -o - %s | FileCheck %s
// CHECK: define{{.*}} signext i8 @f0(i32 noundef %x) [[NUW:#[0-9]+]]
// CHECK: define{{.*}} zeroext i8 @f1(i32 noundef %x) [[NUW]]
// CHECK: define{{.*}} void @f2(i8 noundef signext %x) [[NUW]]
// CHECK: define{{.*}} void @f3(i8 noundef zeroext %x) [[NUW]]
// CHECK: define{{.*}} signext i16 @f4(i32 noundef %x) [[NUW]]
// CHECK: define{{.*}} zeroext i16 @f5(i32 noundef %x) [[NUW]]
// CHECK: define{{.*}} void @f6(i16 noundef signext %x) [[NUW]]
// CHECK: define{{.*}} void @f7(i16 noundef zeroext %x) [[NUW]]
signed char
unsigned char
void
void
signed short
unsigned short
void
void
// CHECK-LABEL: define{{.*}} void @f8()
// CHECK: [[AI:#[0-9]+]]
// CHECK: {
void
// CHECK: call void @f9_t()
// CHECK: [[NR:#[0-9]+]]
// CHECK: }
void ;
void
// CHECK: call void @f9a()
// CHECK: [[NR]]
// CHECK: }
_Noreturn void ;
void
// FIXME: We should be setting nounwind on calls.
// CHECK: call i32 @f10_t()
// CHECK: [[NUW_RN:#[0-9]+]]
// CHECK: {
int ;
int
int
int
// CHECK: define{{.*}} void @f13() [[NUW_OS_RN:#[0-9]+]]
void ;
void
// <rdar://problem/7102668> [irgen] clang isn't setting the optsize bit on functions
// CHECK-LABEL: define{{.*}} void @f15
// CHECK: [[NUW]]
// CHECK: {
void
// PR5254
// CHECK-LABEL: define{{.*}} void @f16
// CHECK: [[SR:#[0-9]+]]
// CHECK: {
void
// PR11038
// CHECK-LABEL: define{{.*}} void @f18()
// CHECK: [[RT:#[0-9]+]]
// CHECK: {
// CHECK: call void @f17()
// CHECK: [[RT_CALL:#[0-9]+]]
// CHECK: ret void
void ;
void
// CHECK-LABEL: define{{.*}} void @f19()
// CHECK: {
// CHECK: call i32 @setjmp(i32* noundef null)
// CHECK: [[RT_CALL]]
// CHECK: ret void
typedef int jmp_buf;
int ;
void
// CHECK-LABEL: define{{.*}} void @f20()
// CHECK: {
// CHECK: call i32 @_setjmp(i32* noundef null)
// CHECK: [[RT_CALL]]
// CHECK: ret void
int ;
void
// CHECK: attributes [[NUW]] = { nounwind optsize{{.*}} }
// CHECK: attributes [[AI]] = { alwaysinline nounwind optsize{{.*}} }
// CHECK: attributes [[NUW_OS_RN]] = { nounwind optsize readnone{{.*}} }
// CHECK: attributes [[SR]] = { nounwind optsize{{.*}} "stackrealign"{{.*}} }
// CHECK: attributes [[RT]] = { nounwind optsize returns_twice{{.*}} }
// CHECK: attributes [[NR]] = { noreturn optsize }
// CHECK: attributes [[NUW_RN]] = { nounwind optsize readnone willreturn }
// CHECK: attributes [[RT_CALL]] = { optsize returns_twice }