int hline(image, il, ie, le)
int il, ie, le;
short **image;
{
  int i, j;
  for (i = ie; i <= le; i++)
    image[il][i] = 200;
  return (1);
}


x86 assembly (clang, -O0):
<hline>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     1147 <hline+0x47>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x18(%rbp),%rcx
movw   $0xc8,(%rax,%rcx,2)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1117 <hline+0x17>
mov    $0x1,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<hline>:
mov    %ecx,%r8d
sub    %edx,%r8d
jl     11df <hline+0xdf>
movslq %esi,%rax
mov    (%rdi,%rax,8),%r11
movslq %edx,%rdx
cmp    $0xf,%r8d
jb     11ca <hline+0xca>
add    $0x1,%r8
mov    %r8,%r9
and    $0xfffffffffffffff0,%r9
lea    -0x10(%r9),%rax
mov    %rax,%rdi
shr    $0x4,%rdi
add    $0x1,%rdi
mov    %edi,%r10d
and    $0x3,%r10d
cmp    $0x30,%rax
jae    114b <hline+0x4b>
xor    %esi,%esi
jmp    1191 <hline+0x91>
and    $0xfffffffffffffffc,%rdi
lea    (%r11,%rdx,2),%rax
add    $0x70,%rax
xor    %esi,%esi
movaps 0xea0(%rip),%xmm0
movups %xmm0,-0x70(%rax,%rsi,2)
movups %xmm0,-0x60(%rax,%rsi,2)
movups %xmm0,-0x50(%rax,%rsi,2)
movups %xmm0,-0x40(%rax,%rsi,2)
movups %xmm0,-0x30(%rax,%rsi,2)
movups %xmm0,-0x20(%rax,%rsi,2)
movups %xmm0,-0x10(%rax,%rsi,2)
movups %xmm0,(%rax,%rsi,2)
add    $0x40,%rsi
add    $0xfffffffffffffffc,%rdi
jne    1160 <hline+0x60>
test   %r10,%r10
je     11c2 <hline+0xc2>
add    %rdx,%rsi
lea    (%r11,%rsi,2),%rax
add    $0x10,%rax
shl    $0x5,%r10
xor    %esi,%esi
movaps 0xe52(%rip),%xmm0
xchg   %ax,%ax
movups %xmm0,-0x10(%rax,%rsi,1)
movups %xmm0,(%rax,%rsi,1)
add    $0x20,%rsi
cmp    %rsi,%r10
jne    11b0 <hline+0xb0>
cmp    %r9,%r8
je     11df <hline+0xdf>
add    %r9,%rdx
add    $0x1,%ecx
mov    %ecx,%eax
nop
movw   $0xc8,(%r11,%rdx,2)
add    $0x1,%rdx
cmp    %edx,%eax
jne    11d0 <hline+0xd0>
mov    $0x1,%eax
ret

LLVM IR (-O0):
define i32 @hline(i16** %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i16**
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
store i16** %0, i16*** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i32 %3, i32* %8
%11 = load i32, i32* %7
store i32 %11, i32* %9
br label %12
12: ; preds = %25, %4
%13 = load i32, i32* %9
%14 = load i32, i32* %8
%15 = icmp sle i32 %13, %14
br i1 %15, label %16, label %28
16: ; preds = %12
%17 = load i16**, i16*** %5
%18 = load i32, i32* %6
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i16*, i16** %17, i64 %19
%21 = load i16*, i16** %20
%22 = load i32, i32* %9
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds i16, i16* %21, i64 %23
store i16 200, i16* %24
br label %25
25: ; preds = %16
%26 = load i32, i32* %9
%27 = add nsw i32 %26, 1
store i32 %27, i32* %9
br label %12
28: ; preds = %12
ret i32 1
}

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