void rangeProp(char *p, int start, int end, int prop) {
  int i;
  for (i = start; i <= end; i++)
    p[i] |= prop;
}


x86 assembly (clang, -O0):
<rangeProp>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x10(%rbp),%eax
jg     1145 <rangeProp+0x45>
mov    -0x14(%rbp),%esi
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
or     %esi,%edx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1117 <rangeProp+0x17>
pop    %rbp
ret

x86 assembly (clang, -O2):
<rangeProp>:
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %edx,%r8d
sub    %esi,%r8d
jl     127b <rangeProp+0x17b>
movslq %esi,%r15
cmp    $0x7,%r8d
jae    1124 <rangeProp+0x24>
mov    %r15,%rsi
jmp    1260 <rangeProp+0x160>
movabs $0x1ffffffe0,%r9
movzbl %cl,%r10d
cmp    $0x1f,%r8d
jae    113f <rangeProp+0x3f>
xor    %eax,%eax
jmp    120a <rangeProp+0x10a>
lea    0x1(%r8),%r11
mov    %r11,%rax
and    %r9,%rax
movd   %r10d,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    -0x20(%rax),%rsi
mov    %rsi,%r14
shr    $0x5,%r14
add    $0x1,%r14
test   %rsi,%rsi
je     1250 <rangeProp+0x150>
mov    %r14,%r12
and    $0xfffffffffffffffe,%r12
lea    (%r15,%rdi,1),%rsi
add    $0x30,%rsi
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nop
movdqu -0x30(%rsi,%rbx,1),%xmm1
movdqu -0x20(%rsi,%rbx,1),%xmm2
movdqu -0x10(%rsi,%rbx,1),%xmm3
movdqu (%rsi,%rbx,1),%xmm4
por    %xmm0,%xmm1
por    %xmm0,%xmm2
movdqu %xmm1,-0x30(%rsi,%rbx,1)
movdqu %xmm2,-0x20(%rsi,%rbx,1)
por    %xmm0,%xmm3
por    %xmm0,%xmm4
movdqu %xmm3,-0x10(%rsi,%rbx,1)
movdqu %xmm4,(%rsi,%rbx,1)
add    $0x40,%rbx
add    $0xfffffffffffffffe,%r12
jne    1190 <rangeProp+0x90>
test   $0x1,%r14b
je     11ff <rangeProp+0xff>
add    %r15,%rbx
movdqu (%rdi,%rbx,1),%xmm1
movdqu 0x10(%rdi,%rbx,1),%xmm2
por    %xmm0,%xmm1
por    %xmm0,%xmm2
movdqu %xmm1,(%rdi,%rbx,1)
movdqu %xmm2,0x10(%rdi,%rbx,1)
cmp    %rax,%r11
je     127b <rangeProp+0x17b>
test   $0x18,%r11b
je     125a <rangeProp+0x15a>
add    $0x1,%r8
add    $0x18,%r9
and    %r8,%r9
lea    (%r9,%r15,1),%rsi
movd   %r10d,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
add    %rdi,%r15
nopw   0x0(%rax,%rax,1)
movq   (%r15,%rax,1),%xmm1
por    %xmm0,%xmm1
movq   %xmm1,(%r15,%rax,1)
add    $0x8,%rax
cmp    %rax,%r9
jne    1230 <rangeProp+0x130>
cmp    %r9,%r8
jne    1260 <rangeProp+0x160>
jmp    127b <rangeProp+0x17b>
xor    %ebx,%ebx
test   $0x1,%r14b
jne    11de <rangeProp+0xde>
jmp    11ff <rangeProp+0xff>
add    %r15,%rax
mov    %rax,%rsi
add    $0x1,%edx
mov    %edx,%eax
cs nopw 0x0(%rax,%rax,1)
nop
or     %cl,(%rdi,%rsi,1)
add    $0x1,%rsi
cmp    %esi,%eax
jne    1270 <rangeProp+0x170>
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

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

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