Skip to content

Instantly share code, notes, and snippets.

@ArchRobison
Created May 27, 2015 20:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ArchRobison/da1f26b658f8afd91699 to your computer and use it in GitHub Desktop.
Save ArchRobison/da1f26b658f8afd91699 to your computer and use it in GitHub Desktop.
Example LLVM code just before pass LICM runs.
; Function Attrs: sspreq
define void @julia_foo_21080(%jl_value_t*, %jl_value_t*) #3 {
top:
%2 = bitcast %jl_value_t* %0 to i8**, !dbg !356
%3 = load i8** %2, align 8, !dbg !356, !tbaa %jtbaa_arrayptr
%4 = bitcast i8* %3 to float*, !dbg !356
%5 = getelementptr inbounds %jl_value_t* %0, i64 3, i32 0, !dbg !356
%6 = bitcast %jl_value_t** %5 to i64*, !dbg !356
%7 = load i64* %6, align 8, !dbg !356, !tbaa %jtbaa_arraysize
%8 = getelementptr inbounds %jl_value_t* %1, i64 6, !dbg !362
%9 = bitcast %jl_value_t* %8 to i64*, !dbg !362
%10 = load i64* %9, align 8, !dbg !362
%11 = icmp sgt i64 %10, 0, !dbg !362
br i1 %11, label %L3.preheader, label %L23, !dbg !362
L3.preheader: ; preds = %top
br label %L3, !dbg !362
L3: ; preds = %L3.preheader, %L21
%"#s2.0" = phi i64 [ %12, %L21 ], [ 1, %L3.preheader ]
%12 = add i64 %"#s2.0", 1, !dbg !362
%13 = getelementptr %jl_value_t* %1, i64 5, !dbg !364
%14 = bitcast %jl_value_t* %13 to i64*, !dbg !364
%15 = load i64* %14, align 8, !dbg !364
%16 = icmp sgt i64 %15, 0, !dbg !364
%17 = select i1 %16, i64 %15, i64 0, !dbg !364
br label %L9, !dbg !367
L9: ; preds = %L3, %L18
%"#s1.0" = phi i64 [ 0, %L3 ], [ %18, %L18 ]
%18 = add i64 %"#s1.0", 1, !dbg !367
%19 = call { i64, i1 } @llvm.ssub.with.overflow.i64(i64 %17, i64 1), !dbg !368
%20 = extractvalue { i64, i1 } %19, 1, !dbg !368
br i1 %20, label %fail, label %pass, !dbg !368
fail: ; preds = %L9
%21 = load %jl_value_t** @jl_overflow_exception, align 8, !dbg !368
call void @jl_throw_with_superfluous_argument(%jl_value_t* %21, i32 67), !dbg !368
unreachable, !dbg !368
pass: ; preds = %L9
%22 = extractvalue { i64, i1 } %19, 0, !dbg !368
%23 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %22, i64 1), !dbg !368
%24 = extractvalue { i64, i1 } %23, 1, !dbg !368
br i1 %24, label %fail10, label %pass11, !dbg !368
fail10: ; preds = %pass
%25 = load %jl_value_t** @jl_overflow_exception, align 8, !dbg !368
call void @jl_throw_with_superfluous_argument(%jl_value_t* %25, i32 67), !dbg !368
unreachable, !dbg !368
pass11: ; preds = %pass
%26 = extractvalue { i64, i1 } %23, 0, !dbg !368
%27 = icmp slt i64 %26, 1, !dbg !369
br i1 %27, label %L18, label %if12, !dbg !369
if12: ; preds = %pass11
%28 = add i64 %"#s2.0", -1, !dbg !370
%29 = mul i64 %28, %7, !dbg !370
%30 = getelementptr inbounds %jl_value_t* %1, i64 0, i32 0, !dbg !370
%31 = getelementptr %jl_value_t* %1, i64 1, !dbg !370
%32 = bitcast %jl_value_t* %31 to i64*, !dbg !370
%33 = getelementptr inbounds %jl_value_t* %1, i64 3, !dbg !370
%34 = bitcast %jl_value_t* %33 to i64*, !dbg !370
%35 = add i64 %"#s2.0", -2, !dbg !370
br label %L14
L14: ; preds = %if12, %L14
%"##i#1697.0" = phi i64 [ 0, %if12 ], [ %56, %L14 ]
%36 = add i64 %"##i#1697.0", %29, !dbg !370
%37 = getelementptr float* %4, i64 %36, !dbg !370
%38 = load float* %37, align 4, !dbg !370, !tbaa %jtbaa_user, !llvm.mem.parallel_loop_access !372
%39 = load %jl_value_t** %30, align 8, !dbg !370, !tbaa %jtbaa_immut, !llvm.mem.parallel_loop_access !372
%40 = load i64* %32, align 8, !dbg !370, !llvm.mem.parallel_loop_access !372
%41 = load i64* %34, align 8, !dbg !370, !llvm.mem.parallel_loop_access !372
%42 = getelementptr inbounds %jl_value_t* %39, i64 3, i32 0, !dbg !370
%43 = bitcast %jl_value_t** %42 to i64*, !dbg !370
%44 = load i64* %43, align 8, !dbg !370, !tbaa %jtbaa_arraysize, !llvm.mem.parallel_loop_access !372
%45 = add i64 %35, %41, !dbg !370
%46 = mul i64 %45, %44, !dbg !370
%47 = add i64 %"##i#1697.0", -1, !dbg !370
%48 = add i64 %47, %40, !dbg !370
%49 = add i64 %48, %46, !dbg !370
%50 = bitcast %jl_value_t* %39 to i8**, !dbg !370
%51 = load i8** %50, align 8, !dbg !370, !tbaa %jtbaa_arrayptr, !llvm.mem.parallel_loop_access !372
%52 = bitcast i8* %51 to float*, !dbg !370
%53 = getelementptr float* %52, i64 %49, !dbg !370
%54 = load float* %53, align 4, !dbg !370, !tbaa %jtbaa_user, !llvm.mem.parallel_loop_access !372
%55 = fadd float %38, %54, !dbg !370
store float %55, float* %37, align 4, !dbg !370, !tbaa %jtbaa_user, !llvm.mem.parallel_loop_access !372
%56 = add i64 %"##i#1697.0", 1, !dbg !375, !simd_loop !373
%57 = icmp slt i64 %56, %26, !dbg !376
br i1 %57, label %L14, label %L18.loopexit, !dbg !376, !llvm.loop.parallel !373
L18.loopexit: ; preds = %L14
br label %L18
L18: ; preds = %L18.loopexit, %pass11
%58 = icmp eq i64 %"#s1.0", 0, !dbg !377
br i1 %58, label %L21, label %L9, !dbg !377
L21: ; preds = %L18
%.op = add i64 %10, 1, !dbg !378
%59 = select i1 %11, i64 %.op, i64 1, !dbg !378
%60 = icmp eq i64 %12, %59, !dbg !378
br i1 %60, label %L23.loopexit, label %L3, !dbg !378
L23.loopexit: ; preds = %L21
br label %L23
L23: ; preds = %L23.loopexit, %top
ret void, !dbg !378
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment