int fun(int a, int b, int c) {
  int x[10] = {0}, i, j;
  x[a / 100] = 1;
  x[a / 10 % 10] = 1;
  x[a % 10] = 1;
  x[b / 100] = 1;
  x[b / 10 % 10] = 1;
  x[b % 10] = 1;
  x[c / 100] = 1;
  x[c / 10 % 10] = 1;
  x[c % 10] = 1;
  for (i = 1; i < 10; i++)
    if (x[i] == 0)
      return 0;
  return 1;
}


x86 assembly (clang, -O0):
<fun>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
lea    -0x40(%rbp),%rdi
xor    %esi,%esi
mov    $0x28,%edx
call   1030 <memset@plt>
mov    -0x8(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
cltq
movl   $0x1,-0x40(%rbp,%rax,4)
mov    -0x8(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    $0xa,%ecx
cltd
idiv   %ecx
movslq %edx,%rax
movl   $0x1,-0x40(%rbp,%rax,4)
mov    -0x8(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
movslq %edx,%rax
movl   $0x1,-0x40(%rbp,%rax,4)
mov    -0xc(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
cltq
movl   $0x1,-0x40(%rbp,%rax,4)
mov    -0xc(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    $0xa,%ecx
cltd
idiv   %ecx
movslq %edx,%rax
movl   $0x1,-0x40(%rbp,%rax,4)
mov    -0xc(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
movslq %edx,%rax
movl   $0x1,-0x40(%rbp,%rax,4)
mov    -0x10(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
cltq
movl   $0x1,-0x40(%rbp,%rax,4)
mov    -0x10(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    $0xa,%ecx
cltd
idiv   %ecx
movslq %edx,%rax
movl   $0x1,-0x40(%rbp,%rax,4)
mov    -0x10(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
movslq %edx,%rax
movl   $0x1,-0x40(%rbp,%rax,4)
movl   $0x1,-0x44(%rbp)
cmpl   $0xa,-0x44(%rbp)
jge    124b <fun+0x13b>
movslq -0x44(%rbp),%rax
cmpl   $0x0,-0x40(%rbp,%rax,4)
jne    1238 <fun+0x128>
movl   $0x0,-0x4(%rbp)
jmp    1252 <fun+0x142>
jmp    123d <fun+0x12d>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1213 <fun+0x103>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fun>:
pxor   %xmm0,%xmm0
movdqa %xmm0,-0x18(%rsp)
movdqa %xmm0,-0x28(%rsp)
movq   $0x0,-0x8(%rsp)
movslq %edi,%r8
imul   $0x51eb851f,%r8,%rcx
mov    %rcx,%rdi
shr    $0x3f,%rdi
shr    $0x20,%rcx
sar    $0x5,%ecx
add    %edi,%ecx
movslq %ecx,%rcx
movl   $0x1,-0x28(%rsp,%rcx,4)
imul   $0x66666667,%r8,%rcx
mov    %rcx,%rdi
shr    $0x3f,%rdi
shr    $0x20,%rcx
sar    $0x2,%ecx
add    %edi,%ecx
movslq %ecx,%rcx
imul   $0x66666667,%rcx,%rdi
mov    %rdi,%rax
shr    $0x3f,%rax
shr    $0x20,%rdi
sar    $0x2,%edi
add    %eax,%edi
add    %edi,%edi
lea    (%rdi,%rdi,4),%eax
mov    %ecx,%edi
sub    %eax,%edi
movslq %edi,%rax
movl   $0x1,-0x28(%rsp,%rax,4)
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%eax
sub    %eax,%r8d
movslq %r8d,%rax
movl   $0x1,-0x28(%rsp,%rax,4)
movslq %esi,%rax
imul   $0x51eb851f,%rax,%rcx
mov    %rcx,%rsi
shr    $0x3f,%rsi
shr    $0x20,%rcx
sar    $0x5,%ecx
add    %esi,%ecx
movslq %ecx,%rcx
movl   $0x1,-0x28(%rsp,%rcx,4)
imul   $0x66666667,%rax,%rcx
mov    %rcx,%rsi
shr    $0x3f,%rsi
shr    $0x20,%rcx
sar    $0x2,%ecx
add    %esi,%ecx
movslq %ecx,%rcx
imul   $0x66666667,%rcx,%rsi
mov    %rsi,%rdi
shr    $0x3f,%rdi
shr    $0x20,%rsi
sar    $0x2,%esi
add    %edi,%esi
add    %esi,%esi
lea    (%rsi,%rsi,4),%esi
mov    %ecx,%edi
sub    %esi,%edi
movslq %edi,%rsi
movl   $0x1,-0x28(%rsp,%rsi,4)
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%ecx
sub    %ecx,%eax
cltq
movl   $0x1,-0x28(%rsp,%rax,4)
movslq %edx,%rax
imul   $0x51eb851f,%rax,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
shr    $0x20,%rcx
sar    $0x5,%ecx
add    %edx,%ecx
movslq %ecx,%rcx
movl   $0x1,-0x28(%rsp,%rcx,4)
imul   $0x66666667,%rax,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
shr    $0x20,%rcx
sar    $0x2,%ecx
add    %edx,%ecx
movslq %ecx,%rcx
imul   $0x66666667,%rcx,%rdx
mov    %rdx,%rsi
shr    $0x3f,%rsi
shr    $0x20,%rdx
sar    $0x2,%edx
add    %esi,%edx
add    %edx,%edx
lea    (%rdx,%rdx,4),%edx
mov    %ecx,%esi
sub    %edx,%esi
movslq %esi,%rdx
movl   $0x1,-0x28(%rsp,%rdx,4)
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%ecx
sub    %ecx,%eax
cltq
movl   $0x1,-0x28(%rsp,%rax,4)
movdqu -0x24(%rsp),%xmm1
movdqu -0x14(%rsp),%xmm2
pcmpeqd %xmm0,%xmm2
pcmpeqd %xmm0,%xmm1
packssdw %xmm2,%xmm1
pmovmskb %xmm1,%eax
test   %eax,%eax
sete   %al
cmpl   $0x0,-0x4(%rsp)
setne  %cl
and    %al,%cl
movzbl %cl,%eax
ret

LLVM IR (-O0):
define i32 @fun(i32 %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca [10 x i32]
%9 = alloca i32
%10 = alloca i32
store i32 %0, i32* %5
store i32 %1, i32* %6
store i32 %2, i32* %7
%11 = bitcast [10 x i32]* %8 to i8*
%12 = load i32, i32* %5
%13 = sdiv i32 %12, 100
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds [10 x i32], [10 x i32]* %8, i64 0, i64 %14
store i32 1, i32* %15
%16 = load i32, i32* %5
%17 = sdiv i32 %16, 10
%18 = srem i32 %17, 10
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds [10 x i32], [10 x i32]* %8, i64 0, i64 %19
store i32 1, i32* %20
%21 = load i32, i32* %5
%22 = srem i32 %21, 10
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds [10 x i32], [10 x i32]* %8, i64 0, i64 %23
store i32 1, i32* %24
%25 = load i32, i32* %6
%26 = sdiv i32 %25, 100
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds [10 x i32], [10 x i32]* %8, i64 0, i64 %27
store i32 1, i32* %28
%29 = load i32, i32* %6
%30 = sdiv i32 %29, 10
%31 = srem i32 %30, 10
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds [10 x i32], [10 x i32]* %8, i64 0, i64 %32
store i32 1, i32* %33
%34 = load i32, i32* %6
%35 = srem i32 %34, 10
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds [10 x i32], [10 x i32]* %8, i64 0, i64 %36
store i32 1, i32* %37
%38 = load i32, i32* %7
%39 = sdiv i32 %38, 100
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds [10 x i32], [10 x i32]* %8, i64 0, i64 %40
store i32 1, i32* %41
%42 = load i32, i32* %7
%43 = sdiv i32 %42, 10
%44 = srem i32 %43, 10
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds [10 x i32], [10 x i32]* %8, i64 0, i64 %45
store i32 1, i32* %46
%47 = load i32, i32* %7
%48 = srem i32 %47, 10
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds [10 x i32], [10 x i32]* %8, i64 0, i64 %49
store i32 1, i32* %50
store i32 1, i32* %9
br label %51
51: ; preds = %62, %3
%52 = load i32, i32* %9
%53 = icmp slt i32 %52, 10
br i1 %53, label %54, label %65
54: ; preds = %51
%55 = load i32, i32* %9
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds [10 x i32], [10 x i32]* %8, i64 0, i64 %56
%58 = load i32, i32* %57
%59 = icmp eq i32 %58, 0
br i1 %59, label %60, label %61
60: ; preds = %54
store i32 0, i32* %4
br label %66
61: ; preds = %54
br label %62
62: ; preds = %61
%63 = load i32, i32* %9
%64 = add nsw i32 %63, 1
store i32 %64, i32* %9
br label %51
65: ; preds = %51
store i32 1, i32* %4
br label %66
66: ; preds = %65, %60
%67 = load i32, i32* %4
ret i32 %67
}

LLVM IR (-O2):
define i32 @fun(i32 %0, i32 %1, i32 %2) {
%4 = alloca [10 x i32]
%5 = bitcast [10 x i32]* %4 to i8*
%6 = sdiv i32 %0, 100
%7 = sext i32 %6 to i64
%8 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 %7
store i32 1, i32* %8
%9 = sdiv i32 %0, 10
%10 = srem i32 %9, 10
%11 = sext i32 %10 to i64
%12 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 %11
store i32 1, i32* %12
%13 = srem i32 %0, 10
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 %14
store i32 1, i32* %15
%16 = sdiv i32 %1, 100
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 %17
store i32 1, i32* %18
%19 = sdiv i32 %1, 10
%20 = srem i32 %19, 10
%21 = sext i32 %20 to i64
%22 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 %21
store i32 1, i32* %22
%23 = srem i32 %1, 10
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 %24
store i32 1, i32* %25
%26 = sdiv i32 %2, 100
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 %27
store i32 1, i32* %28
%29 = sdiv i32 %2, 10
%30 = srem i32 %29, 10
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 %31
store i32 1, i32* %32
%33 = srem i32 %2, 10
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 %34
store i32 1, i32* %35
%36 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 1
%37 = bitcast i32* %36 to <8 x i32>*
%38 = load <8 x i32>, <8 x i32>* %37
%39 = freeze <8 x i32> %38
%40 = icmp eq <8 x i32> %39, zeroinitializer
%41 = bitcast <8 x i1> %40 to i8
%42 = icmp eq i8 %41, 0
%43 = getelementptr inbounds [10 x i32], [10 x i32]* %4, i64 0, i64 9
%44 = load i32, i32* %43
%45 = icmp ne i32 %44, 0
%46 = select i1 %42, i1 %45, i1 false
%47 = zext i1 %46 to i32
ret i32 %47
}