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