// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -O1 -disable-llvm-passes | FileCheck %s --check-prefix=ALL --check-prefix=O1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -O0 | FileCheck %s --check-prefix=ALL --check-prefix=O0 // In all tests, make sure that no expect is generated if optimizations are off. // If optimizations are on, generate the correct expect and preserve other necessary operations. int expect_taken(int x) { // ALL-LABEL: define i32 @expect_taken // O1: call i64 @llvm.expect.i64(i64 {{%.*}}, i64 1) // O0-NOT: @llvm.expect if (__builtin_expect (x, 1)) return 0; return x; } int expect_not_taken(int x) { // ALL-LABEL: define i32 @expect_not_taken // O1: call i64 @llvm.expect.i64(i64 {{%.*}}, i64 0) // O0-NOT: @llvm.expect if (__builtin_expect (x, 0)) return 0; return x; } int x; int y(void); void foo(); void expect_value_side_effects() { // ALL-LABEL: define void @expect_value_side_effects() // ALL: [[CALL:%.*]] = call i32 @y // O1: [[SEXT:%.*]] = sext i32 [[CALL]] to i64 // O1: call i64 @llvm.expect.i64(i64 {{%.*}}, i64 [[SEXT]]) // O0-NOT: @llvm.expect if (__builtin_expect (x, y())) foo (); } // Make sure that issigprocmask() is called before bar()? // There's no compare, so there's nothing to expect? // rdar://9330105 void isigprocmask(void); long bar(); int main() { // ALL-LABEL: define i32 @main() // ALL: call void @isigprocmask() // ALL: [[CALL:%.*]] = call i64 (...) @bar() // O1: call i64 @llvm.expect.i64(i64 0, i64 [[CALL]]) // O0-NOT: @llvm.expect (void) __builtin_expect((isigprocmask(), 0), bar()); } int switch_cond(int x) { // ALL-LABEL: define i32 @switch_cond // O1: call i64 @llvm.expect.i64(i64 {{%.*}}, i64 5) // O0-NOT: @llvm.expect switch(__builtin_expect(x, 5)) { default: return 0; case 0: case 1: case 2: return 1; case 5: return 5; }; return 0; } int variable_expected(int stuff) { // ALL-LABEL: define i32 @variable_expected( // O1: call i64 @llvm.expect.i64(i64 {{%.*}}, i64 {{%.*}}) // O0-NOT: @llvm.expect int res = 0; switch (__builtin_expect(stuff, stuff)) { case 0: res = 1; break; default: break; } return res; }