Home | History | Annotate | Download | only in CodeGen
      1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -O1 -disable-llvm-optzns | FileCheck %s --check-prefix=ALL --check-prefix=O1
      2 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -O0 | FileCheck %s --check-prefix=ALL --check-prefix=O0
      3 
      4 // In all tests, make sure that no expect is generated if optimizations are off.
      5 // If optimizations are on, generate the correct expect and preserve other necessary operations.
      6 
      7 int expect_taken(int x) {
      8 // ALL-LABEL: define i32 @expect_taken
      9 // O1:        call i64 @llvm.expect.i64(i64 {{%.*}}, i64 1)
     10 // O0-NOT:    @llvm.expect
     11 
     12   if (__builtin_expect (x, 1))
     13     return 0;
     14   return x;
     15 }
     16 
     17 
     18 int expect_not_taken(int x) {
     19 // ALL-LABEL: define i32 @expect_not_taken
     20 // O1:        call i64 @llvm.expect.i64(i64 {{%.*}}, i64 0)
     21 // O0-NOT:    @llvm.expect
     22 
     23   if (__builtin_expect (x, 0))
     24     return 0;
     25   return x;
     26 }
     27 
     28 
     29 int x;
     30 int y(void);
     31 void foo();
     32 
     33 void expect_value_side_effects() {
     34 // ALL-LABEL: define void @expect_value_side_effects()
     35 // ALL:       [[CALL:%.*]] = call i32 @y
     36 // O1:        [[SEXT:%.*]] = sext i32 [[CALL]] to i64
     37 // O1:        call i64 @llvm.expect.i64(i64 {{%.*}}, i64 [[SEXT]])
     38 // O0-NOT:    @llvm.expect
     39 
     40   if (__builtin_expect (x, y()))
     41     foo ();
     42 }
     43 
     44 
     45 // Make sure that issigprocmask() is called before bar()?
     46 // There's no compare, so there's nothing to expect?
     47 // rdar://9330105
     48 void isigprocmask(void);
     49 long bar();
     50 
     51 int main() {
     52 // ALL-LABEL: define i32 @main()
     53 // ALL:       call void @isigprocmask()
     54 // ALL:       [[CALL:%.*]] = call i64 (...) @bar()
     55 // O1:        call i64 @llvm.expect.i64(i64 0, i64 [[CALL]])
     56 // O0-NOT:    @llvm.expect
     57 
     58   (void) __builtin_expect((isigprocmask(), 0), bar());
     59 }
     60 
     61 
     62 int switch_cond(int x) {
     63 // ALL-LABEL: define i32 @switch_cond
     64 // O1:        call i64 @llvm.expect.i64(i64 {{%.*}}, i64 5)
     65 // O0-NOT:    @llvm.expect
     66 
     67   switch(__builtin_expect(x, 5)) {
     68   default:
     69     return 0;
     70   case 0:
     71   case 1:
     72   case 2:
     73     return 1;
     74   case 5:
     75     return 5;
     76   };
     77 
     78   return 0;
     79 }
     80 
     81