| // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=60 -x c++ -emit-llvm %s -triple x86_64-unknown-unknown -o - | FileCheck %s | |
| // expected-no-diagnostics | |
| // CHECK-LABEL: @_Z4testii( | |
| // CHECK: [[CMP:%.*]] = icmp sgt i32 %{{.*}}, 0 | |
| // CHECK: call void @llvm.assume(i1 [[CMP]]) | |
| void test(int n, int m) { | |
| #pragma omp assume holds(n > 0) | |
| { | |
| m = n + 1; | |
| } | |
| } | |
| // CHECK-LABEL: @_Z12test_complexi( | |
| // CHECK: [[CMP1:%.*]] = icmp sge i32 %{{.*}}, 10 | |
| // CHECK: br i1 [[CMP1]] | |
| // CHECK: [[CMP2:%.*]] = icmp eq i32 %{{.*}}, 0 | |
| // CHECK: [[COND:%.*]] = phi i1 [ false, %{{.*}} ], [ [[CMP2]], %{{.*}} ] | |
| // CHECK: call void @llvm.assume(i1 [[COND]]) | |
| void test_complex(int n) { | |
| #pragma omp assume holds(n >= 10 && n % 4 == 0) | |
| { | |
| for (int i = 0; i < n; i++) {} | |
| } | |
| } | |
| // CHECK-LABEL: @_Z16test_multi_holdsii( | |
| // CHECK: [[CMPA:%.*]] = icmp ne i32 %{{.*}}, 0 | |
| // CHECK: call void @llvm.assume(i1 [[CMPA]]) | |
| // CHECK: [[CMPB:%.*]] = icmp slt i32 %{{.*}}, 100 | |
| // CHECK: call void @llvm.assume(i1 [[CMPB]]) | |
| void test_multi_holds(int a, int b) { | |
| #pragma omp assume holds(a) holds(b < 100) | |
| { | |
| int c = a + b; | |
| } | |
| } | |
| // CHECK-LABEL: @_Z7test_orii( | |
| // CHECK: [[CMPA:%.*]] = icmp eq i32 %{{.*}}, 1 | |
| // CHECK: br i1 [[CMPA]] | |
| // CHECK: [[CMPB:%.*]] = icmp eq i32 %{{.*}}, 2 | |
| // CHECK: [[COND:%.*]] = phi i1 [ true, %{{.*}} ], [ [[CMPB]], %{{.*}} ] | |
| // CHECK: call void @llvm.assume(i1 [[COND]]) | |
| void test_or(int mode, int x) { | |
| #pragma omp assume holds(mode == 1 || mode == 2) | |
| { | |
| x = mode + 1; | |
| } | |
| } |