void union1(int p, int q, int id[], int n) {
  int pid = id[p];
  int qid = id[q];
  int j;
  for (j = 0; j < n + 1; j++) {
    if (id[j] == pid)
      id[j] = qid;
  }
}


x86 assembly (clang, -O0):
<union1>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x8(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    117a <union1+0x7a>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x18(%rbp),%eax
jne    1167 <union1+0x67>
mov    -0x1c(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    116c <union1+0x6c>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1134 <union1+0x34>
pop    %rbp
ret

x86 assembly (clang, -O2):
<union1>:
test   %ecx,%ecx
js     11f3 <union1+0xf3>
movslq %edi,%rax
mov    (%rdx,%rax,4),%r9d
movslq %esi,%rax
mov    (%rdx,%rax,4),%esi
lea    0x1(%rcx),%r10d
cmp    $0x7,%ecx
jae    1125 <union1+0x25>
xor    %ecx,%ecx
jmp    1209 <union1+0x109>
mov    %r10d,%ecx
and    $0xfffffff8,%ecx
movd   %r9d,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    0x0(,%r10,4),%r8
and    $0xffffffffffffffe0,%r8
xor    %eax,%eax
jmp    115d <union1+0x5d>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x20,%rax
cmp    %rax,%r8
je     11ee <union1+0xee>
movdqu (%rdx,%rax,1),%xmm1
pcmpeqd %xmm0,%xmm1
movd   %xmm1,%edi
test   $0x1,%dil
je     1173 <union1+0x73>
mov    %esi,(%rdx,%rax,1)
pextrw $0x2,%xmm1,%edi
test   $0x1,%dil
je     1182 <union1+0x82>
mov    %esi,0x4(%rdx,%rax,1)
pextrw $0x4,%xmm1,%edi
test   $0x1,%dil
je     1191 <union1+0x91>
mov    %esi,0x8(%rdx,%rax,1)
pextrw $0x6,%xmm1,%edi
test   $0x1,%dil
je     11a0 <union1+0xa0>
mov    %esi,0xc(%rdx,%rax,1)
movdqu 0x10(%rdx,%rax,1),%xmm1
pcmpeqd %xmm0,%xmm1
movd   %xmm1,%edi
test   $0x1,%dil
je     11b8 <union1+0xb8>
mov    %esi,0x10(%rdx,%rax,1)
pextrw $0x2,%xmm1,%edi
test   $0x1,%dil
je     11c7 <union1+0xc7>
mov    %esi,0x14(%rdx,%rax,1)
pextrw $0x4,%xmm1,%edi
test   $0x1,%dil
je     11d6 <union1+0xd6>
mov    %esi,0x18(%rdx,%rax,1)
pextrw $0x6,%xmm1,%edi
test   $0x1,%dil
je     1150 <union1+0x50>
mov    %esi,0x1c(%rdx,%rax,1)
jmp    1150 <union1+0x50>
cmp    %r10,%rcx
jne    1209 <union1+0x109>
ret
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%rcx
cmp    %rcx,%r10
je     11f3 <union1+0xf3>
cmp    %r9d,(%rdx,%rcx,4)
jne    1200 <union1+0x100>
mov    %esi,(%rdx,%rcx,4)
jmp    1200 <union1+0x100>

LLVM IR (-O0):
define void @union1(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
store i32 %0, i32* %5
store i32 %1, i32* %6
store i32* %2, i32** %7
store i32 %3, i32* %8
%12 = load i32*, i32** %7
%13 = load i32, i32* %5
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds i32, i32* %12, i64 %14
%16 = load i32, i32* %15
store i32 %16, i32* %9
%17 = load i32*, i32** %7
%18 = load i32, i32* %6
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i32, i32* %17, i64 %19
%21 = load i32, i32* %20
store i32 %21, i32* %10
store i32 0, i32* %11
br label %22
22: ; preds = %42, %4
%23 = load i32, i32* %11
%24 = load i32, i32* %8
%25 = add nsw i32 %24, 1
%26 = icmp slt i32 %23, %25
br i1 %26, label %27, label %45
27: ; preds = %22
%28 = load i32*, i32** %7
%29 = load i32, i32* %11
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds i32, i32* %28, i64 %30
%32 = load i32, i32* %31
%33 = load i32, i32* %9
%34 = icmp eq i32 %32, %33
br i1 %34, label %35, label %41
35: ; preds = %27
%36 = load i32, i32* %10
%37 = load i32*, i32** %7
%38 = load i32, i32* %11
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i32, i32* %37, i64 %39
store i32 %36, i32* %40
br label %41
41: ; preds = %35, %27
br label %42
42: ; preds = %41
%43 = load i32, i32* %11
%44 = add nsw i32 %43, 1
store i32 %44, i32* %11
br label %22
45: ; preds = %22
ret void
}

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