void drawRectangleOnGrid(short **grid, short x, short y, short width,
                         short height, short value) {
  short i, j;
  for (i = x; i < x + width; i++) {
    for (j = y; j < y + height; j++) {
      grid[i][j] = value;
    }
  }
}


x86 assembly (clang, -O0):
<drawRectangleOnGrid>:
push   %rbp
mov    %rsp,%rbp
mov    %r8d,-0x28(%rbp)
mov    %ecx,%eax
mov    -0x28(%rbp),%ecx
mov    %eax,-0x24(%rbp)
mov    %edx,%eax
mov    -0x24(%rbp),%edx
mov    %eax,-0x20(%rbp)
mov    %esi,%eax
mov    -0x20(%rbp),%esi
mov    %eax,-0x1c(%rbp)
mov    %rdi,%r8
mov    -0x1c(%rbp),%edi
mov    %r9w,%ax
mov    %r8,-0x8(%rbp)
mov    %di,-0xa(%rbp)
mov    %si,-0xc(%rbp)
mov    %dx,-0xe(%rbp)
mov    %cx,-0x10(%rbp)
mov    %ax,-0x12(%rbp)
mov    -0xa(%rbp),%ax
mov    %ax,-0x14(%rbp)
movswl -0x14(%rbp),%eax
movswl -0xa(%rbp),%ecx
movswl -0xe(%rbp),%edx
add    %edx,%ecx
cmp    %ecx,%eax
jge    11bf <drawRectangleOnGrid+0xbf>
mov    -0xc(%rbp),%ax
mov    %ax,-0x16(%rbp)
movswl -0x16(%rbp),%eax
movswl -0xc(%rbp),%ecx
movswl -0x10(%rbp),%edx
add    %edx,%ecx
cmp    %ecx,%eax
jge    11a9 <drawRectangleOnGrid+0xa9>
mov    -0x12(%rbp),%dx
mov    -0x8(%rbp),%rax
movswq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movswq -0x16(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x16(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x16(%rbp)
jmp    1168 <drawRectangleOnGrid+0x68>
jmp    11ae <drawRectangleOnGrid+0xae>
mov    -0x14(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x14(%rbp)
jmp    114a <drawRectangleOnGrid+0x4a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<drawRectangleOnGrid>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %cx,%cx
jle    12b8 <drawRectangleOnGrid+0x1b8>
mov    %edx,%r12d
add    %esi,%ecx
movswl %r12w,%r14d
movswl %r8w,%eax
add    %r14d,%eax
lea    0x1(%r12),%edx
movswl %dx,%r10d
cmp    %r10d,%eax
mov    %r10d,%ebp
cmovg  %eax,%ebp
sub    %r10d,%ebp
lea    0x1(%rbp),%r11d
lea    -0xf(%rbp),%ebx
mov    %ebx,-0xc(%rsp)
mov    %ebx,%edx
shr    $0x4,%edx
add    $0x1,%edx
lea    (%r12,%rbp,1),%ebx
add    $0x1,%ebx
cmp    %r10w,%bx
setl   %r15b
cmp    $0x10000,%ebp
setae  %r10b
or     %r10b,%r15b
add    %r12d,%ebp
mov    %r14d,-0x14(%rsp)
cmp    %r14w,%bp
setl   %bl
or     %r10b,%bl
or     %r15b,%bl
mov    %r11d,%ebp
and    $0xfffffff0,%ebp
mov    %rbp,-0x8(%rsp)
add    %r12d,%ebp
mov    %ebp,-0x10(%rsp)
movd   %r9d,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
mov    %edx,%r13d
and    $0x3,%r13d
and    $0xfffffffc,%edx
mov    %edx,-0x18(%rsp)
jmp    11be <drawRectangleOnGrid+0xbe>
nopl   (%rax)
add    $0x1,%esi
movswl %si,%edx
cmp    %edx,%ecx
jle    12b8 <drawRectangleOnGrid+0x1b8>
test   %r8w,%r8w
jle    11b0 <drawRectangleOnGrid+0xb0>
cmp    $0x10,%r11d
setb   %dl
movswq %si,%rbp
mov    (%rdi,%rbp,8),%r10
or     %bl,%dl
mov    %r12d,%edx
jne    12a0 <drawRectangleOnGrid+0x1a0>
xor    %r14d,%r14d
cmpl   $0x30,-0xc(%rsp)
jb     125a <drawRectangleOnGrid+0x15a>
xor    %r14d,%r14d
mov    -0x18(%rsp),%r15d
mov    %r12d,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movswq %dx,%rbp
movdqu %xmm0,(%r10,%rbp,2)
movdqu %xmm0,0x10(%r10,%rbp,2)
lea    0x10(%rdx),%ebp
movswq %bp,%rbp
movdqu %xmm0,(%r10,%rbp,2)
movdqu %xmm0,0x10(%r10,%rbp,2)
lea    0x20(%rdx),%ebp
movswq %bp,%rbp
movdqu %xmm0,(%r10,%rbp,2)
movdqu %xmm0,0x10(%r10,%rbp,2)
lea    0x30(%rdx),%ebp
movswq %bp,%rbp
movdqu %xmm0,(%r10,%rbp,2)
movdqu %xmm0,0x10(%r10,%rbp,2)
add    $0x40,%r14d
add    $0x40,%edx
add    $0xfffffffc,%r15d
jne    1200 <drawRectangleOnGrid+0x100>
test   %r13d,%r13d
je     128a <drawRectangleOnGrid+0x18a>
add    -0x14(%rsp),%r14d
mov    %r13d,%edx
nopw   0x0(%rax,%rax,1)
movswq %r14w,%rbp
movdqu %xmm0,(%r10,%rbp,2)
movdqu %xmm0,0x10(%r10,%rbp,2)
add    $0x10,%r14d
add    $0xffffffff,%edx
jne    1270 <drawRectangleOnGrid+0x170>
mov    -0x10(%rsp),%edx
cmp    -0x8(%rsp),%r11d
je     11b0 <drawRectangleOnGrid+0xb0>
nopl   0x0(%rax)
movswq %dx,%rbp
mov    %r9w,(%r10,%rbp,2)
add    $0x1,%edx
movswl %dx,%ebp
cmp    %ebp,%eax
jg     12a0 <drawRectangleOnGrid+0x1a0>
jmp    11b0 <drawRectangleOnGrid+0xb0>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @drawRectangleOnGrid(i16** %0, i16 signext %1, i16 signext %2, i16 signext %3, i16 signext %4, i16 signext %5) {
%7 = alloca i16**
%8 = alloca i16
%9 = alloca i16
%10 = alloca i16
%11 = alloca i16
%12 = alloca i16
%13 = alloca i16
%14 = alloca i16
store i16** %0, i16*** %7
store i16 %1, i16* %8
store i16 %2, i16* %9
store i16 %3, i16* %10
store i16 %4, i16* %11
store i16 %5, i16* %12
%15 = load i16, i16* %8
store i16 %15, i16* %13
br label %16
16: ; preds = %50, %6
%17 = load i16, i16* %13
%18 = sext i16 %17 to i32
%19 = load i16, i16* %8
%20 = sext i16 %19 to i32
%21 = load i16, i16* %10
%22 = sext i16 %21 to i32
%23 = add nsw i32 %20, %22
%24 = icmp slt i32 %18, %23
br i1 %24, label %25, label %53
25: ; preds = %16
%26 = load i16, i16* %9
store i16 %26, i16* %14
br label %27
27: ; preds = %46, %25
%28 = load i16, i16* %14
%29 = sext i16 %28 to i32
%30 = load i16, i16* %9
%31 = sext i16 %30 to i32
%32 = load i16, i16* %11
%33 = sext i16 %32 to i32
%34 = add nsw i32 %31, %33
%35 = icmp slt i32 %29, %34
br i1 %35, label %36, label %49
36: ; preds = %27
%37 = load i16, i16* %12
%38 = load i16**, i16*** %7
%39 = load i16, i16* %13
%40 = sext i16 %39 to i64
%41 = getelementptr inbounds i16*, i16** %38, i64 %40
%42 = load i16*, i16** %41
%43 = load i16, i16* %14
%44 = sext i16 %43 to i64
%45 = getelementptr inbounds i16, i16* %42, i64 %44
store i16 %37, i16* %45
br label %46
46: ; preds = %36
%47 = load i16, i16* %14
%48 = add i16 %47, 1
store i16 %48, i16* %14
br label %27
49: ; preds = %27
br label %50
50: ; preds = %49
%51 = load i16, i16* %13
%52 = add i16 %51, 1
store i16 %52, i16* %13
br label %16
53: ; preds = %16
ret void
}

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