unsigned get_connected_input(unsigned y, unsigned prev_start, unsigned prev_len,
                             unsigned prev_was_pipeline) {
  if (prev_was_pipeline)
    return y;
  if (y - prev_start < prev_len / 2) {
    return prev_start + (y - prev_start) * 2;
  } else {
    if (prev_len % 2 && prev_start + prev_len - 1 == y)
      return y;
    return prev_start + (y - (prev_start + prev_len / 2)) * 2 + 1;
  }
}


x86 assembly (clang, -O0):
<get_connected_input>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
je     1125 <get_connected_input+0x25>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1199 <get_connected_input+0x99>
mov    -0x8(%rbp),%eax
sub    -0xc(%rbp),%eax
mov    -0x10(%rbp),%ecx
shr    $0x1,%ecx
cmp    %ecx,%eax
jae    114f <get_connected_input+0x4f>
mov    -0xc(%rbp),%eax
mov    -0x8(%rbp),%ecx
sub    -0xc(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    1199 <get_connected_input+0x99>
mov    -0x10(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     117b <get_connected_input+0x7b>
mov    -0xc(%rbp),%eax
add    -0x10(%rbp),%eax
sub    $0x1,%eax
cmp    -0x8(%rbp),%eax
jne    117b <get_connected_input+0x7b>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1199 <get_connected_input+0x99>
mov    -0xc(%rbp),%eax
mov    -0x8(%rbp),%ecx
mov    -0xc(%rbp),%edx
mov    -0x10(%rbp),%esi
shr    $0x1,%esi
add    %esi,%edx
sub    %edx,%ecx
shl    $0x1,%ecx
add    %ecx,%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_connected_input>:
mov    %edi,%eax
test   %ecx,%ecx
je     1107 <get_connected_input+0x7>
ret
mov    %eax,%edi
sub    %esi,%edi
mov    %edx,%ecx
shr    %ecx
cmp    %ecx,%edi
jae    1117 <get_connected_input+0x17>
lea    (%rsi,%rdi,2),%eax
ret
test   $0x1,%dl
je     1125 <get_connected_input+0x25>
add    %esi,%edx
add    $0xffffffff,%edx
cmp    %eax,%edx
je     1106 <get_connected_input+0x6>
add    %esi,%ecx
sub    %ecx,%eax
lea    (%rsi,%rax,2),%eax
add    $0x1,%eax
ret

LLVM IR (-O0):
define i32 @get_connected_input(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* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
%10 = load i32, i32* %9
%11 = icmp ne i32 %10, 0
br i1 %11, label %12, label %14
12: ; preds = %4
%13 = load i32, i32* %6
store i32 %13, i32* %5
br label %52
14: ; preds = %4
%15 = load i32, i32* %6
%16 = load i32, i32* %7
%17 = sub i32 %15, %16
%18 = load i32, i32* %8
%19 = udiv i32 %18, 2
%20 = icmp ult i32 %17, %19
br i1 %20, label %21, label %28
21: ; preds = %14
%22 = load i32, i32* %7
%23 = load i32, i32* %6
%24 = load i32, i32* %7
%25 = sub i32 %23, %24
%26 = mul i32 %25, 2
%27 = add i32 %22, %26
store i32 %27, i32* %5
br label %52
28: ; preds = %14
%29 = load i32, i32* %8
%30 = urem i32 %29, 2
%31 = icmp ne i32 %30, 0
br i1 %31, label %32, label %41
32: ; preds = %28
%33 = load i32, i32* %7
%34 = load i32, i32* %8
%35 = add i32 %33, %34
%36 = sub i32 %35, 1
%37 = load i32, i32* %6
%38 = icmp eq i32 %36, %37
br i1 %38, label %39, label %41
39: ; preds = %32
%40 = load i32, i32* %6
store i32 %40, i32* %5
br label %52
41: ; preds = %32, %28
%42 = load i32, i32* %7
%43 = load i32, i32* %6
%44 = load i32, i32* %7
%45 = load i32, i32* %8
%46 = udiv i32 %45, 2
%47 = add i32 %44, %46
%48 = sub i32 %43, %47
%49 = mul i32 %48, 2
%50 = add i32 %42, %49
%51 = add i32 %50, 1
store i32 %51, i32* %5
br label %52
52: ; preds = %41, %39, %21, %12
%53 = load i32, i32* %5
ret i32 %53
}

LLVM IR (-O2):
define i32 @get_connected_input(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = icmp eq i32 %3, 0
br i1 %5, label %6, label %26
6: ; preds = %4
%7 = sub i32 %0, %1
%8 = lshr i32 %2, 1
%9 = icmp ult i32 %7, %8
br i1 %9, label %10, label %13
10: ; preds = %6
%11 = shl i32 %7, 1
%12 = add i32 %11, %1
br label %26
13: ; preds = %6
%14 = and i32 %2, 1
%15 = icmp eq i32 %14, 0
br i1 %15, label %20, label %16
16: ; preds = %13
%17 = add i32 %1, -1
%18 = add i32 %17, %2
%19 = icmp eq i32 %18, %0
br i1 %19, label %26, label %20
20: ; preds = %16, %13
%21 = add i32 %8, %1
%22 = sub i32 %0, %21
%23 = shl i32 %22, 1
%24 = add i32 %1, 1
%25 = add i32 %24, %23
br label %26
26: ; preds = %16, %4, %20, %10
%27 = phi i32 [ %12, %10 ], [ %25, %20 ], [ %0, %4 ], [ %0, %16 ]
ret i32 %27
}