int partition(int *A, int p, int r, int privot) {
  int x, i, j;
  int temp;
  for (i = 0; i < r; i++) {
    if (A[i] == privot)
      break;
  }
  x = A[i];
  temp = A[i];
  A[i] = A[r];
  A[r] = A[i];
  i = p - 1;
  for (j = p; j < r; j++) {
    if (A[j] <= x) {
      i = i + 1;
      temp = A[j];
      A[j] = A[i];
      A[i] = temp;
    }
  }
  temp = A[r];
  A[r] = A[i + 1];
  A[i + 1] = temp;
  return (i + 1);
}


x86 assembly (clang, -O0):
<partition>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1150 <partition+0x50>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x14(%rbp),%eax
jne    113d <partition+0x3d>
jmp    1150 <partition+0x50>
jmp    1142 <partition+0x42>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1118 <partition+0x18>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1215 <partition+0x115>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x18(%rbp),%eax
jg     1202 <partition+0x102>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x24(%rbp),%edx
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1207 <partition+0x107>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11a7 <partition+0xa7>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x24(%rbp),%edx
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<partition>:
test   %edx,%edx
jle    1123 <partition+0x23>
mov    %edx,%r8d
xor    %eax,%eax
nopl   0x0(%rax)
cmp    %ecx,(%rdi,%rax,4)
je     1125 <partition+0x25>
add    $0x1,%rax
cmp    %rax,%r8
jne    1110 <partition+0x10>
mov    %r8d,%eax
jmp    1125 <partition+0x25>
xor    %eax,%eax
mov    %eax,%eax
mov    (%rdi,%rax,4),%r9d
movslq %edx,%r8
mov    (%rdi,%r8,4),%ecx
mov    %ecx,(%rdi,%rax,4)
mov    %ecx,(%rdi,%r8,4)
lea    -0x1(%rsi),%eax
cmp    %edx,%esi
jge    1170 <partition+0x70>
movslq %esi,%rcx
sub    %esi,%edx
mov    %rcx,%r10
not    %r10
test   $0x1,%dl
je     1167 <partition+0x67>
mov    (%rdi,%rcx,4),%edx
cmp    %r9d,%edx
jg     1163 <partition+0x63>
mov    (%rdi,%rcx,4),%eax
mov    %eax,(%rdi,%rcx,4)
mov    %edx,(%rdi,%rcx,4)
mov    %esi,%eax
add    $0x1,%rcx
add    %r8,%r10
jne    1199 <partition+0x99>
mov    (%rdi,%r8,4),%ecx
movslq %eax,%rdx
add    $0x1,%eax
mov    0x4(%rdi,%rdx,4),%esi
mov    %esi,(%rdi,%r8,4)
mov    %ecx,0x4(%rdi,%rdx,4)
ret
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x2,%rcx
cmp    %rcx,%r8
je     116c <partition+0x6c>
mov    (%rdi,%rcx,4),%edx
cmp    %r9d,%edx
jg     11b4 <partition+0xb4>
movslq %eax,%r10
add    $0x1,%eax
mov    0x4(%rdi,%r10,4),%esi
mov    %esi,(%rdi,%rcx,4)
mov    %edx,0x4(%rdi,%r10,4)
mov    0x4(%rdi,%rcx,4),%edx
cmp    %r9d,%edx
jg     1190 <partition+0x90>
movslq %eax,%r10
add    $0x1,%eax
mov    0x4(%rdi,%r10,4),%esi
mov    %esi,0x4(%rdi,%rcx,4)
mov    %edx,0x4(%rdi,%r10,4)
jmp    1190 <partition+0x90>

LLVM IR (-O0):
define i32 @partition(i32* %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i32*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
store i32* %0, i32** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i32 %3, i32* %8
store i32 0, i32* %10
br label %13
13: ; preds = %27, %4
%14 = load i32, i32* %10
%15 = load i32, i32* %7
%16 = icmp slt i32 %14, %15
br i1 %16, label %17, label %30
17: ; preds = %13
%18 = load i32*, i32** %5
%19 = load i32, i32* %10
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i32, i32* %18, i64 %20
%22 = load i32, i32* %21
%23 = load i32, i32* %8
%24 = icmp eq i32 %22, %23
br i1 %24, label %25, label %26
25: ; preds = %17
br label %30
26: ; preds = %17
br label %27
27: ; preds = %26
%28 = load i32, i32* %10
%29 = add nsw i32 %28, 1
store i32 %29, i32* %10
br label %13
30: ; preds = %25, %13
%31 = load i32*, i32** %5
%32 = load i32, i32* %10
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds i32, i32* %31, i64 %33
%35 = load i32, i32* %34
store i32 %35, i32* %9
%36 = load i32*, i32** %5
%37 = load i32, i32* %10
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds i32, i32* %36, i64 %38
%40 = load i32, i32* %39
store i32 %40, i32* %12
%41 = load i32*, i32** %5
%42 = load i32, i32* %7
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds i32, i32* %41, i64 %43
%45 = load i32, i32* %44
%46 = load i32*, i32** %5
%47 = load i32, i32* %10
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i32, i32* %46, i64 %48
store i32 %45, i32* %49
%50 = load i32*, i32** %5
%51 = load i32, i32* %10
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds i32, i32* %50, i64 %52
%54 = load i32, i32* %53
%55 = load i32*, i32** %5
%56 = load i32, i32* %7
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds i32, i32* %55, i64 %57
store i32 %54, i32* %58
%59 = load i32, i32* %6
%60 = sub nsw i32 %59, 1
store i32 %60, i32* %10
%61 = load i32, i32* %6
store i32 %61, i32* %11
br label %62
62: ; preds = %97, %30
%63 = load i32, i32* %11
%64 = load i32, i32* %7
%65 = icmp slt i32 %63, %64
br i1 %65, label %66, label %100
66: ; preds = %62
%67 = load i32*, i32** %5
%68 = load i32, i32* %11
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds i32, i32* %67, i64 %69
%71 = load i32, i32* %70
%72 = load i32, i32* %9
%73 = icmp sle i32 %71, %72
br i1 %73, label %74, label %96
74: ; preds = %66
%75 = load i32, i32* %10
%76 = add nsw i32 %75, 1
store i32 %76, i32* %10
%77 = load i32*, i32** %5
%78 = load i32, i32* %11
%79 = sext i32 %78 to i64
%80 = getelementptr inbounds i32, i32* %77, i64 %79
%81 = load i32, i32* %80
store i32 %81, i32* %12
%82 = load i32*, i32** %5
%83 = load i32, i32* %10
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds i32, i32* %82, i64 %84
%86 = load i32, i32* %85
%87 = load i32*, i32** %5
%88 = load i32, i32* %11
%89 = sext i32 %88 to i64
%90 = getelementptr inbounds i32, i32* %87, i64 %89
store i32 %86, i32* %90
%91 = load i32, i32* %12
%92 = load i32*, i32** %5
%93 = load i32, i32* %10
%94 = sext i32 %93 to i64
%95 = getelementptr inbounds i32, i32* %92, i64 %94
store i32 %91, i32* %95
br label %96
96: ; preds = %74, %66
br label %97
97: ; preds = %96
%98 = load i32, i32* %11
%99 = add nsw i32 %98, 1
store i32 %99, i32* %11
br label %62
100: ; preds = %62
%101 = load i32*, i32** %5
%102 = load i32, i32* %7
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds i32, i32* %101, i64 %103
%105 = load i32, i32* %104
store i32 %105, i32* %12
%106 = load i32*, i32** %5
%107 = load i32, i32* %10
%108 = add nsw i32 %107, 1
%109 = sext i32 %108 to i64
%110 = getelementptr inbounds i32, i32* %106, i64 %109
%111 = load i32, i32* %110
%112 = load i32*, i32** %5
%113 = load i32, i32* %7
%114 = sext i32 %113 to i64
%115 = getelementptr inbounds i32, i32* %112, i64 %114
store i32 %111, i32* %115
%116 = load i32, i32* %12
%117 = load i32*, i32** %5
%118 = load i32, i32* %10
%119 = add nsw i32 %118, 1
%120 = sext i32 %119 to i64
%121 = getelementptr inbounds i32, i32* %117, i64 %120
store i32 %116, i32* %121
%122 = load i32, i32* %10
%123 = add nsw i32 %122, 1
ret i32 %123
}

LLVM IR (-O2):
define i32 @partition(i32* nocapture %0, i32 %1, i32 %2, i32 %3) {
%5 = icmp sgt i32 %2, 0
br i1 %5, label %6, label %18
6: ; preds = %4
%7 = zext i32 %2 to i64
br label %8
8: ; preds = %6, %13
%9 = phi i64 [ 0, %6 ], [ %14, %13 ]
%10 = getelementptr inbounds i32, i32* %0, i64 %9
%11 = load i32, i32* %10
%12 = icmp eq i32 %11, %3
br i1 %12, label %16, label %13
13: ; preds = %8
%14 = add nuw nsw i64 %9, 1
%15 = icmp eq i64 %14, %7
br i1 %15, label %18, label %8
16: ; preds = %8
%17 = trunc i64 %9 to i32
br label %18
18: ; preds = %13, %16, %4
%19 = phi i32 [ 0, %4 ], [ %17, %16 ], [ %2, %13 ]
%20 = zext i32 %19 to i64
%21 = getelementptr inbounds i32, i32* %0, i64 %20
%22 = load i32, i32* %21
%23 = sext i32 %2 to i64
%24 = getelementptr inbounds i32, i32* %0, i64 %23
%25 = load i32, i32* %24
store i32 %25, i32* %21
store i32 %25, i32* %24
%26 = add nsw i32 %1, -1
%27 = icmp slt i32 %1, %2
br i1 %27, label %28, label %80
28: ; preds = %18
%29 = sext i32 %1 to i64
%30 = sub nsw i64 %23, %29
%31 = xor i64 %29, -1
%32 = and i64 %30, 1
%33 = icmp eq i64 %32, 0
br i1 %33, label %45, label %34
34: ; preds = %28
%35 = getelementptr inbounds i32, i32* %0, i64 %29
%36 = load i32, i32* %35
%37 = icmp sgt i32 %36, %22
br i1 %37, label %42, label %38
38: ; preds = %34
%39 = sext i32 %1 to i64
%40 = getelementptr inbounds i32, i32* %0, i64 %39
%41 = load i32, i32* %40
store i32 %41, i32* %35
store i32 %36, i32* %40
br label %42
42: ; preds = %38, %34
%43 = phi i32 [ %1, %38 ], [ %26, %34 ]
%44 = add nsw i64 %29, 1
br label %45
45: ; preds = %42, %28
%46 = phi i32 [ undef, %28 ], [ %43, %42 ]
%47 = phi i64 [ %29, %28 ], [ %44, %42 ]
%48 = phi i32 [ %26, %28 ], [ %43, %42 ]
%49 = sub nsw i64 0, %23
%50 = icmp eq i64 %31, %49
br i1 %50, label %77, label %51
51: ; preds = %45, %73
%52 = phi i64 [ %75, %73 ], [ %47, %45 ]
%53 = phi i32 [ %74, %73 ], [ %48, %45 ]
%54 = getelementptr inbounds i32, i32* %0, i64 %52
%55 = load i32, i32* %54
%56 = icmp sgt i32 %55, %22
br i1 %56, label %62, label %57
57: ; preds = %51
%58 = add nsw i32 %53, 1
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i32, i32* %0, i64 %59
%61 = load i32, i32* %60
store i32 %61, i32* %54
store i32 %55, i32* %60
br label %62
62: ; preds = %51, %57
%63 = phi i32 [ %58, %57 ], [ %53, %51 ]
%64 = add nsw i64 %52, 1
%65 = getelementptr inbounds i32, i32* %0, i64 %64
%66 = load i32, i32* %65
%67 = icmp sgt i32 %66, %22
br i1 %67, label %73, label %68
68: ; preds = %62
%69 = add nsw i32 %63, 1
%70 = sext i32 %69 to i64
%71 = getelementptr inbounds i32, i32* %0, i64 %70
%72 = load i32, i32* %71
store i32 %72, i32* %65
store i32 %66, i32* %71
br label %73
73: ; preds = %68, %62
%74 = phi i32 [ %69, %68 ], [ %63, %62 ]
%75 = add nsw i64 %52, 2
%76 = icmp eq i64 %75, %23
br i1 %76, label %77, label %51
77: ; preds = %73, %45
%78 = phi i32 [ %46, %45 ], [ %74, %73 ]
%79 = load i32, i32* %24
br label %80
80: ; preds = %77, %18
%81 = phi i32 [ %25, %18 ], [ %79, %77 ]
%82 = phi i32 [ %26, %18 ], [ %78, %77 ]
%83 = add nsw i32 %82, 1
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds i32, i32* %0, i64 %84
%86 = load i32, i32* %85
store i32 %86, i32* %24
store i32 %81, i32* %85
ret i32 %83
}