Skip to content

Instantly share code, notes, and snippets.

@bluss
Created October 22, 2016 18:03
Show Gist options
  • Select an option

  • Save bluss/354a3ac867e4d97b49da643067a43927 to your computer and use it in GitHub Desktop.

Select an option

Save bluss/354a3ac867e4d97b49da643067a43927 to your computer and use it in GitHub Desktop.
; ModuleID = 'chain_bool.cgu-0.rs'
source_filename = "chain_bool.cgu-0.rs"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
%"8.unwind::libunwind::_Unwind_Exception" = type { i64, void (i32, %"8.unwind::libunwind::_Unwind_Exception"*)*, [6 x i64] }
%"8.unwind::libunwind::_Unwind_Context" = type {}
; Function Attrs: uwtable
define i64 @range_chain_default_fold(i64, i64, i64 (i64, i64)* nocapture) unnamed_addr #0 personality i32 (i32, i32, i64, %"8.unwind::libunwind::_Unwind_Exception"*, %"8.unwind::libunwind::_Unwind_Context"*)* @rust_eh_personality {
entry-block:
br label %bb2.outer
bb2.outer: ; preds = %bb11, %entry-block
%self_.sroa.0.0.ph = phi i64 [ %self_.sroa.0.0.ph3858, %bb11 ], [ 0, %entry-block ]
%self_.sroa.7.0.ph = phi i64 [ %10, %bb11 ], [ 0, %entry-block ]
%self_.sroa.12.0.ph = phi i8 [ 0, %bb11 ], [ 1, %entry-block ]
%accum.0.ph = phi i64 [ %11, %bb11 ], [ 0, %entry-block ]
%3 = icmp eq i8 %self_.sroa.12.0.ph, 0
%4 = icmp ult i64 %self_.sroa.0.0.ph, %0
br i1 %4, label %bb2.us.preheader, label %bb2.preheader
bb2.us.preheader: ; preds = %bb2.outer
br label %bb2.us
bb2.preheader.loopexit: ; preds = %bb7
br label %bb2.preheader
bb2.preheader: ; preds = %bb2.preheader.loopexit, %bb2.outer
%self_.sroa.0.0.ph38.lcssa = phi i64 [ %self_.sroa.0.0.ph, %bb2.outer ], [ %7, %bb2.preheader.loopexit ]
%accum.0.ph41.lcssa = phi i64 [ %accum.0.ph, %bb2.outer ], [ %8, %bb2.preheader.loopexit ]
br label %bb2
bb2.us: ; preds = %bb2.us.preheader, %bb7
%accum.0.ph4160 = phi i64 [ %8, %bb7 ], [ %accum.0.ph, %bb2.us.preheader ]
%self_.sroa.0.0.ph3859 = phi i64 [ %7, %bb7 ], [ %self_.sroa.0.0.ph, %bb2.us.preheader ]
br i1 %3, label %bb4.loopexit62, label %bb7
bb2: ; preds = %bb2.preheader, %bb2
%self_.sroa.12.0 = phi i8 [ 0, %bb2 ], [ %self_.sroa.12.0.ph, %bb2.preheader ]
%5 = icmp eq i8 %self_.sroa.12.0, 0
br i1 %5, label %bb4.loopexit, label %bb2
bb4.loopexit: ; preds = %bb2
br label %bb4
bb4.loopexit62: ; preds = %bb2.us
br label %bb4
bb4: ; preds = %bb4.loopexit62, %bb4.loopexit
%self_.sroa.0.0.ph3858 = phi i64 [ %self_.sroa.0.0.ph38.lcssa, %bb4.loopexit ], [ %self_.sroa.0.0.ph3859, %bb4.loopexit62 ]
%accum.0.ph4156 = phi i64 [ %accum.0.ph41.lcssa, %bb4.loopexit ], [ %accum.0.ph4160, %bb4.loopexit62 ]
%6 = icmp ult i64 %self_.sroa.7.0.ph, %1
br i1 %6, label %bb11, label %bb10
bb7: ; preds = %bb2.us
%7 = add i64 %self_.sroa.0.0.ph3859, 1
%8 = tail call i64 %2(i64 %accum.0.ph4160, i64 %self_.sroa.0.0.ph3859)
%9 = icmp ult i64 %7, %0
br i1 %9, label %bb2.us, label %bb2.preheader.loopexit
bb10: ; preds = %bb4
ret i64 %accum.0.ph4156
bb11: ; preds = %bb4
%10 = add i64 %self_.sroa.7.0.ph, 1
%11 = tail call i64 %2(i64 %accum.0.ph4156, i64 %self_.sroa.7.0.ph)
br label %bb2.outer
}
; Function Attrs: nounwind
declare i32 @rust_eh_personality(i32, i32, i64, %"8.unwind::libunwind::_Unwind_Exception"*, %"8.unwind::libunwind::_Unwind_Context"*) unnamed_addr #1
attributes #0 = { uwtable }
attributes #1 = { nounwind }
#![crate_type="lib"]
#[no_mangle]
pub fn range_chain_default_fold(xs: usize, ys: usize, f: fn(usize, usize) -> usize) -> usize {
let mut accum = 0;
let mut self_ = chain(0..xs, 0..ys);
loop {
if self_.front_active {
match self_.a.next() {
Some(elt) => {
accum = f(accum, elt);
}
None => {
self_.front_active = false;
continue;
}
}
} else {
let value = self_.b.next();
match value {
Some(elt) => accum = f(accum, elt),
None => break,
}
};
}
accum
}
struct Chain<A, B> {
a: A,
b: B,
front_active: bool,
}
fn chain<A, B>(a: A, b: B) -> Chain<A::IntoIter, B::IntoIter>
where A: IntoIterator, B: IntoIterator<Item=A::Item>,
{
Chain {
a: a.into_iter(),
b: b.into_iter(),
front_active: true,
}
}
.text
.file "chain_bool.cgu-0.rs"
.section .text.range_chain_default_fold,"ax",@progbits
.globl range_chain_default_fold
.p2align 4, 0x90
.type range_chain_default_fold,@function
range_chain_default_fold:
.cfi_startproc
pushq %rbp
.Ltmp0:
.cfi_def_cfa_offset 16
pushq %r15
.Ltmp1:
.cfi_def_cfa_offset 24
pushq %r14
.Ltmp2:
.cfi_def_cfa_offset 32
pushq %r13
.Ltmp3:
.cfi_def_cfa_offset 40
pushq %r12
.Ltmp4:
.cfi_def_cfa_offset 48
pushq %rbx
.Ltmp5:
.cfi_def_cfa_offset 56
pushq %rax
.Ltmp6:
.cfi_def_cfa_offset 64
.Ltmp7:
.cfi_offset %rbx, -56
.Ltmp8:
.cfi_offset %r12, -48
.Ltmp9:
.cfi_offset %r13, -40
.Ltmp10:
.cfi_offset %r14, -32
.Ltmp11:
.cfi_offset %r15, -24
.Ltmp12:
.cfi_offset %rbp, -16
movq %rdx, %r15
movq %rsi, %r14
movq %rdi, %r12
movb $1, %bpl
xorl %ebx, %ebx
xorl %r13d, %r13d
xorl %eax, %eax
jmp .LBB0_1
.p2align 4, 0x90
.LBB0_3:
movq %rbx, %rsi
incq %rbx
movq %rax, %rdi
callq *%r15
.LBB0_1:
cmpq %r12, %rbx
jae .LBB0_4
testb %bpl, %bpl
jne .LBB0_3
jmp .LBB0_5
.p2align 4, 0x90
.LBB0_4:
testb %bpl, %bpl
movl $0, %ebp
jne .LBB0_4
.LBB0_5:
cmpq %r14, %r13
jae .LBB0_6
movq %r13, %rsi
incq %r13
movq %rax, %rdi
callq *%r15
xorl %ebp, %ebp
jmp .LBB0_1
.LBB0_6:
addq $8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
.Lfunc_end0:
.size range_chain_default_fold, .Lfunc_end0-range_chain_default_fold
.cfi_endproc
.section ".note.GNU-stack","",@progbits
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment