#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ b1(unsigned char, char);
int omp_get_thread_num();
int f1(void) {
  int a1 = 1;
  unsigned char a2 = 2;
  unsigned long a3 = 3;
  long long a4 = 4;
  short a5 = 5;
  char a6 = 6;
#pragma omp parallel shared(a1, a2, a3)
  {
    if (omp_get_thread_num() == 0) {
      a1 = a2;
      a4 = a5;
    }
    b1(a2, a6);
#pragma omp barrier
    if (omp_get_thread_num() == 1) {
      a1 += a3;
      a4 += a6;
    }
  }
  return a1 + a2 + a3 + a4 + a5 + a6;
}


x86 assembly (clang, -O0):
<f1>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
movl   $0x1,-0x4(%rbp)
movb   $0x2,-0x5(%rbp)
movq   $0x3,-0x10(%rbp)
movq   $0x4,-0x18(%rbp)
movw   $0x5,-0x1a(%rbp)
movb   $0x6,-0x1b(%rbp)
mov    $0x0,%al
call   1030 <omp_get_thread_num@plt>
cmp    $0x0,%eax
jne    116d <f1+0x4d>
movzbl -0x5(%rbp),%eax
mov    %eax,-0x4(%rbp)
movswq -0x1a(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x5(%rbp),%al
movzbl %al,%edi
movsbl -0x1b(%rbp),%esi
call   1040 <b1@plt>
mov    $0x0,%al
call   1030 <omp_get_thread_num@plt>
cmp    $0x1,%eax
jne    11a7 <f1+0x87>
mov    -0x10(%rbp),%rcx
movslq -0x4(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x4(%rbp)
movsbq -0x1b(%rbp),%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x4(%rbp),%eax
movzbl -0x5(%rbp),%ecx
add    %ecx,%eax
cltq
add    -0x10(%rbp),%rax
add    -0x18(%rbp),%rax
movswq -0x1a(%rbp),%rcx
add    %rcx,%rax
movsbq -0x1b(%rbp),%rcx
add    %rcx,%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<f1>:
push   %r14
push   %rbx
push   %rax
xor    %eax,%eax
call   1030 <omp_get_thread_num@plt>
xor    %ebx,%ebx
test   %eax,%eax
sete   %bl
lea    0x1(%rbx),%r14d
mov    $0x2,%edi
mov    $0x6,%esi
call   1040 <b1@plt>
xor    %eax,%eax
call   1030 <omp_get_thread_num@plt>
lea    0x4(%rbx),%ecx
or     $0xa,%ebx
cmp    $0x1,%eax
cmove  %ecx,%r14d
cmovne %ecx,%ebx
lea    (%rbx,%r14,1),%eax
add    $0x10,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define i32 @f1() {
%1 = alloca i32
%2 = alloca i8
%3 = alloca i64
%4 = alloca i64
%5 = alloca i16
%6 = alloca i8
store i32 1, i32* %1
store i8 2, i8* %2
store i64 3, i64* %3
store i64 4, i64* %4
store i16 5, i16* %5
store i8 6, i8* %6
%7 = call i32 (...) @omp_get_thread_num()
%8 = icmp eq i32 %7, 0
br i1 %8, label %9, label %14
9: ; preds = %0
%10 = load i8, i8* %2
%11 = zext i8 %10 to i32
store i32 %11, i32* %1
%12 = load i16, i16* %5
%13 = sext i16 %12 to i64
store i64 %13, i64* %4
br label %14
14: ; preds = %9, %0
%15 = load i8, i8* %2
%16 = load i8, i8* %6
%17 = call i32 @b1(i8 zeroext %15, i8 signext %16)
%18 = call i32 (...) @omp_get_thread_num()
%19 = icmp eq i32 %18, 1
br i1 %19, label %20, label %30
20: ; preds = %14
%21 = load i64, i64* %3
%22 = load i32, i32* %1
%23 = sext i32 %22 to i64
%24 = add i64 %23, %21
%25 = trunc i64 %24 to i32
store i32 %25, i32* %1
%26 = load i8, i8* %6
%27 = sext i8 %26 to i64
%28 = load i64, i64* %4
%29 = add nsw i64 %28, %27
store i64 %29, i64* %4
br label %30
30: ; preds = %20, %14
%31 = load i32, i32* %1
%32 = load i8, i8* %2
%33 = zext i8 %32 to i32
%34 = add nsw i32 %31, %33
%35 = sext i32 %34 to i64
%36 = load i64, i64* %3
%37 = add i64 %35, %36
%38 = load i64, i64* %4
%39 = add i64 %37, %38
%40 = load i16, i16* %5
%41 = sext i16 %40 to i64
%42 = add i64 %39, %41
%43 = load i8, i8* %6
%44 = sext i8 %43 to i64
%45 = add i64 %42, %44
%46 = trunc i64 %45 to i32
ret i32 %46
}

LLVM IR (-O2):
define i32 @f1() {
%1 = tail call i32 (...) @omp_get_thread_num()
%2 = icmp eq i32 %1, 0
%3 = select i1 %2, i64 5, i64 4
%4 = select i1 %2, i32 2, i32 1
%5 = tail call i32 @b1(i8 zeroext 2, i8 signext 6)
%6 = tail call i32 (...) @omp_get_thread_num()
%7 = icmp eq i32 %6, 1
%8 = add nuw nsw i32 %4, 3
%9 = add nuw nsw i64 %3, 6
%10 = select i1 %7, i64 %9, i64 %3
%11 = select i1 %7, i32 %8, i32 %4
%12 = trunc i64 %10 to i32
%13 = or i32 %11, 16
%14 = add nuw nsw i32 %13, %12
ret i32 %14
}