void unionij(int i, int j, int r[], int n) {
  int k;
  if (i < j) {
    r[j] = i;
    for (k = 1; k <= n; k++) {
      if (r[k] == j) {
        r[k] = i;
      }
    }
  } else {
    r[i] = j;
    for (k = 1; k <= n; k++) {
      if (r[k] == i)
        r[k] = j;
    }
  }
}


x86 assembly (clang, -O0):
<unionij>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1178 <unionij+0x78>
mov    -0x4(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x8(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
movl   $0x1,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     1173 <unionij+0x73>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x8(%rbp),%eax
jne    1160 <unionij+0x60>
mov    -0x4(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1165 <unionij+0x65>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1132 <unionij+0x32>
jmp    11d3 <unionij+0xd3>
mov    -0x8(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x4(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
movl   $0x1,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     11ce <unionij+0xce>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x4(%rbp),%eax
jne    11bb <unionij+0xbb>
mov    -0x8(%rbp),%edx
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    11c0 <unionij+0xc0>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    118d <unionij+0x8d>
jmp    11d3 <unionij+0xd3>
pop    %rbp
ret

x86 assembly (clang, -O2):
<unionij>:
cmp    %esi,%edi
jge    11d0 <unionij+0xd0>
movslq %esi,%rax
mov    %edi,(%rdx,%rax,4)
test   %ecx,%ecx
jle    12ca <unionij+0x1ca>
mov    %ecx,%r8d
mov    $0x1,%r10d
cmp    $0x8,%ecx
jb     12a5 <unionij+0x1a5>
mov    %r8d,%r9d
and    $0xfffffff8,%r9d
lea    0x1(%r9),%r10
movd   %esi,%xmm0
pshufd $0x0,%xmm0,%xmm0
xor    %ecx,%ecx
jmp    114d <unionij+0x4d>
add    $0x8,%rcx
cmp    %rcx,%r9
je     12a0 <unionij+0x1a0>
movdqu 0x4(%rdx,%rcx,4),%xmm1
pcmpeqd %xmm0,%xmm1
movd   %xmm1,%eax
test   $0x1,%al
je     1163 <unionij+0x63>
mov    %edi,0x4(%rdx,%rcx,4)
pextrw $0x2,%xmm1,%eax
test   $0x1,%al
je     1170 <unionij+0x70>
mov    %edi,0x8(%rdx,%rcx,4)
pextrw $0x4,%xmm1,%eax
test   $0x1,%al
je     117d <unionij+0x7d>
mov    %edi,0xc(%rdx,%rcx,4)
pextrw $0x6,%xmm1,%eax
test   $0x1,%al
je     118a <unionij+0x8a>
mov    %edi,0x10(%rdx,%rcx,4)
movdqu 0x14(%rdx,%rcx,4),%xmm1
pcmpeqd %xmm0,%xmm1
movd   %xmm1,%eax
test   $0x1,%al
je     11a0 <unionij+0xa0>
mov    %edi,0x14(%rdx,%rcx,4)
pextrw $0x2,%xmm1,%eax
test   $0x1,%al
je     11ad <unionij+0xad>
mov    %edi,0x18(%rdx,%rcx,4)
pextrw $0x4,%xmm1,%eax
test   $0x1,%al
je     11ba <unionij+0xba>
mov    %edi,0x1c(%rdx,%rcx,4)
pextrw $0x6,%xmm1,%eax
test   $0x1,%al
je     1140 <unionij+0x40>
mov    %edi,0x20(%rdx,%rcx,4)
jmp    1140 <unionij+0x40>
movslq %edi,%rax
mov    %esi,(%rdx,%rax,4)
test   %ecx,%ecx
jle    12ca <unionij+0x1ca>
mov    %ecx,%r8d
mov    $0x1,%r10d
cmp    $0x8,%ecx
jb     12cb <unionij+0x1cb>
mov    %r8d,%r9d
and    $0xfffffff8,%r9d
lea    0x1(%r9),%r10
movd   %edi,%xmm0
pshufd $0x0,%xmm0,%xmm0
xor    %ecx,%ecx
jmp    121d <unionij+0x11d>
nopl   0x0(%rax,%rax,1)
add    $0x8,%rcx
cmp    %rcx,%r9
je     12c5 <unionij+0x1c5>
movdqu 0x4(%rdx,%rcx,4),%xmm1
pcmpeqd %xmm0,%xmm1
movd   %xmm1,%eax
test   $0x1,%al
je     1233 <unionij+0x133>
mov    %esi,0x4(%rdx,%rcx,4)
pextrw $0x2,%xmm1,%eax
test   $0x1,%al
je     1240 <unionij+0x140>
mov    %esi,0x8(%rdx,%rcx,4)
pextrw $0x4,%xmm1,%eax
test   $0x1,%al
je     124d <unionij+0x14d>
mov    %esi,0xc(%rdx,%rcx,4)
pextrw $0x6,%xmm1,%eax
test   $0x1,%al
je     125a <unionij+0x15a>
mov    %esi,0x10(%rdx,%rcx,4)
movdqu 0x14(%rdx,%rcx,4),%xmm1
pcmpeqd %xmm0,%xmm1
movd   %xmm1,%eax
test   $0x1,%al
je     1270 <unionij+0x170>
mov    %esi,0x14(%rdx,%rcx,4)
pextrw $0x2,%xmm1,%eax
test   $0x1,%al
je     127d <unionij+0x17d>
mov    %esi,0x18(%rdx,%rcx,4)
pextrw $0x4,%xmm1,%eax
test   $0x1,%al
je     128a <unionij+0x18a>
mov    %esi,0x1c(%rdx,%rcx,4)
pextrw $0x6,%xmm1,%eax
test   $0x1,%al
je     1210 <unionij+0x110>
mov    %esi,0x20(%rdx,%rcx,4)
jmp    1210 <unionij+0x110>
cmp    %r9,%r8
je     12ca <unionij+0x1ca>
add    $0x1,%r8
jmp    12b9 <unionij+0x1b9>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r10
cmp    %r10,%r8
je     12ca <unionij+0x1ca>
cmp    %esi,(%rdx,%r10,4)
jne    12b0 <unionij+0x1b0>
mov    %edi,(%rdx,%r10,4)
jmp    12b0 <unionij+0x1b0>
cmp    %r9,%r8
jne    12cb <unionij+0x1cb>
ret
add    $0x1,%r8
jmp    12e9 <unionij+0x1e9>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%r10
cmp    %r10,%r8
je     12ca <unionij+0x1ca>
cmp    %edi,(%rdx,%r10,4)
jne    12e0 <unionij+0x1e0>
mov    %esi,(%rdx,%r10,4)
jmp    12e0 <unionij+0x1e0>

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

LLVM IR (-O2):
define void @unionij(i32 %0, i32 %1, i32* nocapture %2, i32 %3) {
%5 = icmp slt i32 %0, %1
br i1 %5, label %6, label %87
6: ; preds = %4
%7 = sext i32 %1 to i64
%8 = getelementptr inbounds i32, i32* %2, i64 %7
store i32 %0, i32* %8
%9 = icmp slt i32 %3, 1
br i1 %9, label %168, label %10
10: ; preds = %6
%11 = add nuw i32 %3, 1
%12 = zext i32 %11 to i64
%13 = add nsw i64 %12, -1
%14 = icmp ult i64 %13, 8
br i1 %14, label %76, label %15
15: ; preds = %10
%16 = and i64 %13, -8
%17 = or i64 %16, 1
%18 = insertelement <4 x i32> poison, i32 %1, i64 0
%19 = shufflevector <4 x i32> %18, <4 x i32> poison, <4 x i32> zeroinitializer
%20 = insertelement <4 x i32> poison, i32 %1, i64 0
%21 = shufflevector <4 x i32> %20, <4 x i32> poison, <4 x i32> zeroinitializer
br label %22
22: ; preds = %71, %15
%23 = phi i64 [ 0, %15 ], [ %72, %71 ]
%24 = or i64 %23, 1
%25 = or i64 %23, 5
%26 = getelementptr inbounds i32, i32* %2, i64 %24
%27 = bitcast i32* %26 to <4 x i32>*
%28 = load <4 x i32>, <4 x i32>* %27
%29 = getelementptr inbounds i32, i32* %26, i64 4
%30 = bitcast i32* %29 to <4 x i32>*
%31 = load <4 x i32>, <4 x i32>* %30
%32 = icmp eq <4 x i32> %28, %19
%33 = icmp eq <4 x i32> %31, %21
%34 = extractelement <4 x i1> %32, i64 0
br i1 %34, label %35, label %37
35: ; preds = %22
%36 = getelementptr inbounds i32, i32* %2, i64 %24
store i32 %0, i32* %36
br label %37
37: ; preds = %35, %22
%38 = extractelement <4 x i1> %32, i64 1
br i1 %38, label %39, label %42
39: ; preds = %37
%40 = or i64 %23, 2
%41 = getelementptr inbounds i32, i32* %2, i64 %40
store i32 %0, i32* %41
br label %42
42: ; preds = %39, %37
%43 = extractelement <4 x i1> %32, i64 2
br i1 %43, label %44, label %47
44: ; preds = %42
%45 = or i64 %23, 3
%46 = getelementptr inbounds i32, i32* %2, i64 %45
store i32 %0, i32* %46
br label %47
47: ; preds = %44, %42
%48 = extractelement <4 x i1> %32, i64 3
br i1 %48, label %49, label %52
49: ; preds = %47
%50 = or i64 %23, 4
%51 = getelementptr inbounds i32, i32* %2, i64 %50
store i32 %0, i32* %51
br label %52
52: ; preds = %49, %47
%53 = extractelement <4 x i1> %33, i64 0
br i1 %53, label %54, label %56
54: ; preds = %52
%55 = getelementptr inbounds i32, i32* %2, i64 %25
store i32 %0, i32* %55
br label %56
56: ; preds = %54, %52
%57 = extractelement <4 x i1> %33, i64 1
br i1 %57, label %58, label %61
58: ; preds = %56
%59 = or i64 %23, 6
%60 = getelementptr inbounds i32, i32* %2, i64 %59
store i32 %0, i32* %60
br label %61
61: ; preds = %58, %56
%62 = extractelement <4 x i1> %33, i64 2
br i1 %62, label %63, label %66
63: ; preds = %61
%64 = or i64 %23, 7
%65 = getelementptr inbounds i32, i32* %2, i64 %64
store i32 %0, i32* %65
br label %66
66: ; preds = %63, %61
%67 = extractelement <4 x i1> %33, i64 3
br i1 %67, label %68, label %71
68: ; preds = %66
%69 = add i64 %23, 8
%70 = getelementptr inbounds i32, i32* %2, i64 %69
store i32 %0, i32* %70
br label %71
71: ; preds = %68, %66
%72 = add nuw i64 %23, 8
%73 = icmp eq i64 %72, %16
br i1 %73, label %74, label %22
74: ; preds = %71
%75 = icmp eq i64 %13, %16
br i1 %75, label %168, label %76
76: ; preds = %10, %74
%77 = phi i64 [ 1, %10 ], [ %17, %74 ]
br label %78
78: ; preds = %76, %84
%79 = phi i64 [ %85, %84 ], [ %77, %76 ]
%80 = getelementptr inbounds i32, i32* %2, i64 %79
%81 = load i32, i32* %80
%82 = icmp eq i32 %81, %1
br i1 %82, label %83, label %84
83: ; preds = %78
store i32 %0, i32* %80
br label %84
84: ; preds = %78, %83
%85 = add nuw nsw i64 %79, 1
%86 = icmp eq i64 %85, %12
br i1 %86, label %168, label %78
87: ; preds = %4
%88 = sext i32 %0 to i64
%89 = getelementptr inbounds i32, i32* %2, i64 %88
store i32 %1, i32* %89
%90 = icmp slt i32 %3, 1
br i1 %90, label %168, label %91
91: ; preds = %87
%92 = add nuw i32 %3, 1
%93 = zext i32 %92 to i64
%94 = add nsw i64 %93, -1
%95 = icmp ult i64 %94, 8
br i1 %95, label %157, label %96
96: ; preds = %91
%97 = and i64 %94, -8
%98 = or i64 %97, 1
%99 = insertelement <4 x i32> poison, i32 %0, i64 0
%100 = shufflevector <4 x i32> %99, <4 x i32> poison, <4 x i32> zeroinitializer
%101 = insertelement <4 x i32> poison, i32 %0, i64 0
%102 = shufflevector <4 x i32> %101, <4 x i32> poison, <4 x i32> zeroinitializer
br label %103
103: ; preds = %152, %96
%104 = phi i64 [ 0, %96 ], [ %153, %152 ]
%105 = or i64 %104, 1
%106 = or i64 %104, 5
%107 = getelementptr inbounds i32, i32* %2, i64 %105
%108 = bitcast i32* %107 to <4 x i32>*
%109 = load <4 x i32>, <4 x i32>* %108
%110 = getelementptr inbounds i32, i32* %107, i64 4
%111 = bitcast i32* %110 to <4 x i32>*
%112 = load <4 x i32>, <4 x i32>* %111
%113 = icmp eq <4 x i32> %109, %100
%114 = icmp eq <4 x i32> %112, %102
%115 = extractelement <4 x i1> %113, i64 0
br i1 %115, label %116, label %118
116: ; preds = %103
%117 = getelementptr inbounds i32, i32* %2, i64 %105
store i32 %1, i32* %117
br label %118
118: ; preds = %116, %103
%119 = extractelement <4 x i1> %113, i64 1
br i1 %119, label %120, label %123
120: ; preds = %118
%121 = or i64 %104, 2
%122 = getelementptr inbounds i32, i32* %2, i64 %121
store i32 %1, i32* %122
br label %123
123: ; preds = %120, %118
%124 = extractelement <4 x i1> %113, i64 2
br i1 %124, label %125, label %128
125: ; preds = %123
%126 = or i64 %104, 3
%127 = getelementptr inbounds i32, i32* %2, i64 %126
store i32 %1, i32* %127
br label %128
128: ; preds = %125, %123
%129 = extractelement <4 x i1> %113, i64 3
br i1 %129, label %130, label %133
130: ; preds = %128
%131 = or i64 %104, 4
%132 = getelementptr inbounds i32, i32* %2, i64 %131
store i32 %1, i32* %132
br label %133
133: ; preds = %130, %128
%134 = extractelement <4 x i1> %114, i64 0
br i1 %134, label %135, label %137
135: ; preds = %133
%136 = getelementptr inbounds i32, i32* %2, i64 %106
store i32 %1, i32* %136
br label %137
137: ; preds = %135, %133
%138 = extractelement <4 x i1> %114, i64 1
br i1 %138, label %139, label %142
139: ; preds = %137
%140 = or i64 %104, 6
%141 = getelementptr inbounds i32, i32* %2, i64 %140
store i32 %1, i32* %141
br label %142
142: ; preds = %139, %137
%143 = extractelement <4 x i1> %114, i64 2
br i1 %143, label %144, label %147
144: ; preds = %142
%145 = or i64 %104, 7
%146 = getelementptr inbounds i32, i32* %2, i64 %145
store i32 %1, i32* %146
br label %147
147: ; preds = %144, %142
%148 = extractelement <4 x i1> %114, i64 3
br i1 %148, label %149, label %152
149: ; preds = %147
%150 = add i64 %104, 8
%151 = getelementptr inbounds i32, i32* %2, i64 %150
store i32 %1, i32* %151
br label %152
152: ; preds = %149, %147
%153 = add nuw i64 %104, 8
%154 = icmp eq i64 %153, %97
br i1 %154, label %155, label %103
155: ; preds = %152
%156 = icmp eq i64 %94, %97
br i1 %156, label %168, label %157
157: ; preds = %91, %155
%158 = phi i64 [ 1, %91 ], [ %98, %155 ]
br label %159
159: ; preds = %157, %165
%160 = phi i64 [ %166, %165 ], [ %158, %157 ]
%161 = getelementptr inbounds i32, i32* %2, i64 %160
%162 = load i32, i32* %161
%163 = icmp eq i32 %162, %0
br i1 %163, label %164, label %165
164: ; preds = %159
store i32 %1, i32* %161
br label %165
165: ; preds = %159, %164
%166 = add nuw nsw i64 %160, 1
%167 = icmp eq i64 %166, %93
br i1 %167, label %168, label %159
168: ; preds = %165, %84, %155, %74, %87, %6
ret void
}