1*67e74705SXin Li // RUN: %clang_cc1 -Oz -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=Oz 2*67e74705SXin Li // RUN: %clang_cc1 -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER 3*67e74705SXin Li // RUN: %clang_cc1 -O1 -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER 4*67e74705SXin Li // RUN: %clang_cc1 -O2 -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER 5*67e74705SXin Li // RUN: %clang_cc1 -O3 -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER 6*67e74705SXin Li // RUN: %clang_cc1 -Os -disable-llvm-optzns -emit-llvm %s -o - | FileCheck %s -check-prefix=OTHER 7*67e74705SXin Li // Check that we set the minsize attribute on each function 8*67e74705SXin Li // when Oz optimization level is set. 9*67e74705SXin Li 10*67e74705SXin Li __attribute__((minsize)) test1()11*67e74705SXin Liint test1() { 12*67e74705SXin Li return 42; 13*67e74705SXin Li // Oz: @{{.*}}test1{{.*}}[[MINSIZE:#[0-9]+]] 14*67e74705SXin Li // OTHER: @{{.*}}test1{{.*}}[[MS:#[0-9]+]] 15*67e74705SXin Li } 16*67e74705SXin Li test2()17*67e74705SXin Liint test2() { 18*67e74705SXin Li return 42; 19*67e74705SXin Li // Oz: @{{.*}}test2{{.*}}[[MINSIZE]] 20*67e74705SXin Li // Oz: ret 21*67e74705SXin Li // OTHER: @{{.*}}test2 22*67e74705SXin Li // OTHER-NOT: [[MS]] 23*67e74705SXin Li // OTHER: ret 24*67e74705SXin Li } 25*67e74705SXin Li test3()26*67e74705SXin Liint test3() { 27*67e74705SXin Li return 42; 28*67e74705SXin Li // Oz: @{{.*}}test3{{.*}}[[MINSIZE]] 29*67e74705SXin Li // Oz: ret 30*67e74705SXin Li // OTHER: @{{.*}}test3 31*67e74705SXin Li // OTHER-NOT: [[MS]] 32*67e74705SXin Li // OTHER: ret 33*67e74705SXin Li } 34*67e74705SXin Li 35*67e74705SXin Li // Check that the minsize attribute is well propagated through 36*67e74705SXin Li // template instantiation 37*67e74705SXin Li 38*67e74705SXin Li template<typename T> 39*67e74705SXin Li __attribute__((minsize)) test4(T arg)40*67e74705SXin Livoid test4(T arg) { 41*67e74705SXin Li return; 42*67e74705SXin Li } 43*67e74705SXin Li 44*67e74705SXin Li template 45*67e74705SXin Li void test4<int>(int arg); 46*67e74705SXin Li // Oz: define{{.*}}void @{{.*}}test4 47*67e74705SXin Li // Oz: [[MINSIZE]] 48*67e74705SXin Li // OTHER: define{{.*}}void @{{.*}}test4 49*67e74705SXin Li // OTHER: [[MS]] 50*67e74705SXin Li 51*67e74705SXin Li template 52*67e74705SXin Li void test4<float>(float arg); 53*67e74705SXin Li // Oz: define{{.*}}void @{{.*}}test4 54*67e74705SXin Li // Oz: [[MINSIZE]] 55*67e74705SXin Li // OTHER: define{{.*}}void @{{.*}}test4 56*67e74705SXin Li // OTHER: [[MS]] 57*67e74705SXin Li 58*67e74705SXin Li template<typename T> test5(T arg)59*67e74705SXin Livoid test5(T arg) { 60*67e74705SXin Li return; 61*67e74705SXin Li } 62*67e74705SXin Li 63*67e74705SXin Li template 64*67e74705SXin Li void test5<int>(int arg); 65*67e74705SXin Li // Oz: define{{.*}}void @{{.*}}test5 66*67e74705SXin Li // Oz: [[MINSIZE]] 67*67e74705SXin Li // OTHER: define{{.*}}void @{{.*}}test5 68*67e74705SXin Li // OTHER-NOT: define{{.*}}void @{{.*}}test5{{.*}}[[MS]] 69*67e74705SXin Li 70*67e74705SXin Li template 71*67e74705SXin Li void test5<float>(float arg); 72*67e74705SXin Li // Oz: define{{.*}}void @{{.*}}test5 73*67e74705SXin Li // Oz: [[MINSIZE]] 74*67e74705SXin Li // OTHER: define{{.*}}void @{{.*}}test5 75*67e74705SXin Li // OTHER-NOT: define{{.*}}void @{{.*}}test5{{.*}}[[MS]] 76*67e74705SXin Li 77*67e74705SXin Li // Oz: attributes [[MINSIZE]] = { minsize{{.*}} } 78*67e74705SXin Li 79*67e74705SXin Li // OTHER: attributes [[MS]] = { minsize nounwind{{.*}} } 80