Hi Duncan,<br><br>A DragonEgg/GCC-related question: do you know where these strange FRAME tokens originate from (e.g. %struct.FRAME.matmul)? Compiling simple Fortran code with DragonEgg:<br><br>> cat matmul.f90<br><br> subroutine matmul(nx, ny, nz)<br>
implicit none<br><br> integer :: nx, ny, nz<br> real, dimension(nx, ny) :: A<br> real, dimension(ny, nz) :: B<br> real, dimension(nx, nz) :: C<br><br> integer :: i, j, k<br> real, volatile :: start, finish<br><br>
call init_array<br><br> call cpu_time(start)<br><br> do i = 1, nx<br> do j = 1, nz<br> C(i,j) = 0<br> do k = 1, ny<br> C(i, j) = C(i, j) + A(i, k) * B(k, j)<br> enddo<br> enddo<br> enddo<br>
<br> call cpu_time(finish)<br><br> print *, sum(C), maxval(C), minval(C)<br> call flush()<br><br> contains<br><br> subroutine init_array<br> implicit none<br><br> integer :: i, j<br><br> do i = 1, nx<br> do j = 1, ny<br>
A(i, j) = (1 + mod((i * j), 1024)) / 2.0<br> enddo<br> enddo<br><br> do i = 1, ny<br> do j = 1, nz<br> B(i, j) = (1 + mod((i * j), 1024)) / 2.0<br> enddo<br> enddo<br><br> end subroutine init_array<br>
<br> end subroutine matmul<br><br>> kernelgen-dragonegg matmul.f90 -o -<br><br>; ModuleID = 'matmul.f90'<br>target datalayout = "e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"<br>
target triple = "x86_64-unknown-linux-gnu"<br><br>%struct.FRAME.matmul = type { i64, i64, [0 x float]*, i64, i64, i32*, i64, i64, [0 x float]*, i64, i64, i32*, i32* }<br>%struct.__st_parameter_dt = type { %struct.__st_parameter_common, i64, i64*, i64*, i8*, i8*, i32, i32, i8*, i8*, i32, i32, i8*, [256 x i8], i32*, i64, i8*, i32, i32, i8*, i8*, i32, i32, i8*, i8*, i32, i32, i8*, i8*, i32, [4 x i8] }<br>
%struct.__st_parameter_common = type { i32, i32, i8*, i32, i32, i8*, i32* }<br><br>@.cst = linker_private constant [11 x i8] c"matmul.f90\00", align 8<br><br>define internal void @init_array.1535(%struct.FRAME.matmul* nest %CHAIN.41) nounwind uwtable {<br>
entry:<br> %CHAIN.41_addr = alloca %struct.FRAME.matmul*, align 8<br> %i = alloca i32<br> %j = alloca i32<br> %D.1539 = alloca i32<br> %D.1553 = alloca i32<br> %D.1542 = alloca i32<br> %D.1552 = alloca i32<br> %D.1554 = alloca i32<br>
%D.1568 = alloca i32<br> %D.1557 = alloca i32<br> %D.1567 = alloca i32<br> %"alloca point" = bitcast i32 0 to i32<br> store %struct.FRAME.matmul* %CHAIN.41, %struct.FRAME.matmul** %CHAIN.41_addr<br> %0 = load %struct.FRAME.matmul** %CHAIN.41_addr, align 64<br>
%"ssa point" = bitcast i32 0 to i32<br> br label %"2"<br><br>"2": ; preds = %entry<br> %1 = getelementptr inbounds %struct.FRAME.matmul* %0, i32 0, i32 12<br>
%2 = load i32** %1, align 8<br> %3 = load i32* %2, align 4<br> %4 = icmp sle i32 1, %3<br> br i1 %4, label %"3", label %"8"<br><br>"3": ; preds = %"7", %"2"<br>
%5 = phi i32 [ %33, %"7" ], [ 1, %"2" ]<br> %6 = getelementptr inbounds %struct.FRAME.matmul* %0, i32 0, i32 11<br> %7 = load i32** %6, align 8<br> %8 = load i32* %7, align 4<br> %9 = icmp sle i32 1, %8<br>
br i1 %9, label %"4", label %"6"<br><br>"4": ; preds = %"5", %"3"<br> %10 = phi i32 [ %30, %"5" ], [ 1, %"3" ]<br>
%11 = sext i32 %5 to i64<br> %12 = sext i32 %10 to i64<br> %13 = getelementptr inbounds %struct.FRAME.matmul* %0, i32 0, i32 10<br> %14 = load i64* %13, align 8<br> %15 = mul i64 %12, %14<br> %16 = add i64 %11, %15<br>
%17 = getelementptr inbounds %struct.FRAME.matmul* %0, i32 0, i32 9<br> %18 = load i64* %17, align 8<br> %19 = add i64 %16, %18<br> %20 = mul i32 %5, %10<br> %21 = srem i32 %20, 1024<br> %22 = add i32 %21, 1<br> %23 = sitofp i32 %22 to float<br>
%24 = fdiv float %23, 2.000000e+00<br> %25 = getelementptr inbounds %struct.FRAME.matmul* %0, i32 0, i32 8<br> %26 = load [0 x float]** %25, align 8<br> %27 = bitcast [0 x float]* %26 to float*<br> %28 = getelementptr float* %27, i64 %19<br>
store float %24, float* %28, align 4<br> %29 = icmp eq i32 %10, %8<br> %30 = add i32 %10, 1<br> %31 = icmp ne i1 %29, false<br> br i1 %31, label %"6", label %"5"<br><br>"5": ; preds = %"4"<br>
br label %"4"<br><br>"6": ; preds = %"4", %"3"<br> %32 = icmp eq i32 %5, %3<br> %33 = add i32 %5, 1<br> %34 = icmp ne i1 %32, false<br>
br i1 %34, label %"8", label %"7"<br><br>"7": ; preds = %"6"<br> br label %"3"<br><br>"8": ; preds = %"6", %"2"<br>
%35 = getelementptr inbounds %struct.FRAME.matmul* %0, i32 0, i32 11<br> %36 = load i32** %35, align 8<br> %37 = load i32* %36, align 4<br> %38 = icmp sle i32 1, %37<br> br i1 %38, label %"9", label %"14"<br>
<br>"9": ; preds = %"13", %"8"<br> %39 = phi i32 [ %67, %"13" ], [ 1, %"8" ]<br> %40 = getelementptr inbounds %struct.FRAME.matmul* %0, i32 0, i32 5<br>
%41 = load i32** %40, align 8<br> %42 = load i32* %41, align 4<br> %43 = icmp sle i32 1, %42<br> br i1 %43, label %"10", label %"12"<br><br>"10": ; preds = %"11", %"9"<br>
%44 = phi i32 [ %64, %"11" ], [ 1, %"9" ]<br> %45 = sext i32 %39 to i64<br> %46 = sext i32 %44 to i64<br> %47 = getelementptr inbounds %struct.FRAME.matmul* %0, i32 0, i32 4<br> %48 = load i64* %47, align 8<br>
%49 = mul i64 %46, %48<br> %50 = add i64 %45, %49<br> %51 = getelementptr inbounds %struct.FRAME.matmul* %0, i32 0, i32 3<br> %52 = load i64* %51, align 8<br> %53 = add i64 %50, %52<br> %54 = mul i32 %39, %44<br> %55 = srem i32 %54, 1024<br>
%56 = add i32 %55, 1<br> %57 = sitofp i32 %56 to float<br> %58 = fdiv float %57, 2.000000e+00<br> %59 = getelementptr inbounds %struct.FRAME.matmul* %0, i32 0, i32 2<br> %60 = load [0 x float]** %59, align 8<br> %61 = bitcast [0 x float]* %60 to float*<br>
%62 = getelementptr float* %61, i64 %53<br> store float %58, float* %62, align 4<br> %63 = icmp eq i32 %44, %42<br> %64 = add i32 %44, 1<br> %65 = icmp ne i1 %63, false<br> br i1 %65, label %"12", label %"11"<br>
<br>"11": ; preds = %"10"<br> br label %"10"<br><br>"12": ; preds = %"10", %"9"<br>
%66 = icmp eq i32 %39, %37<br> %67 = add i32 %39, 1<br> %68 = icmp ne i1 %66, false<br> br i1 %68, label %"14", label %"13"<br><br>"13": ; preds = %"12"<br>
br label %"9"<br><br>"14": ; preds = %"12", %"8"<br> br label %return<br><br>return: ; preds = %"14"<br>
ret void<br>}<br><br>define void @matmul_(i32* noalias %nx, i32* noalias %ny, i32* noalias %nz) nounwind uwtable {<br>entry:<br> %nx_addr = alloca i32*, align 8<br> %ny_addr = alloca i32*, align 8<br> %nz_addr = alloca i32*, align 8<br>
%ubound.0 = alloca i64<br> %ubound.1 = alloca i64<br> %stride.2 = alloca i64<br> %offset.3 = alloca i64<br> %size.4 = alloca i64<br> %a = alloca [0 x float]*<br> %ubound.5 = alloca i64<br> %ubound.6 = alloca i64<br>
%stride.7 = alloca i64<br> %offset.8 = alloca i64<br> %size.9 = alloca i64<br> %b = alloca [0 x float]*<br> %ubound.10 = alloca i64<br> %ubound.11 = alloca i64<br> %stride.12 = alloca i64<br> %offset.13 = alloca i64<br>
%size.14 = alloca i64<br> %c = alloca [0 x float]*<br> %finish = alloca float<br> %i = alloca i32<br> %j = alloca i32<br> %k = alloca i32<br> %start = alloca float<br> %D.1630 = alloca i64<br> %D.1631 = alloca i64<br>
%D.1632 = alloca i64<br> %D.1636 = alloca i64<br> %D.1637 = alloca i64<br> %D.1638 = alloca i64<br> %D.1642 = alloca i64<br> %D.1643 = alloca i64<br> %D.1644 = alloca i64<br> %a.31 = alloca i8*<br> %D.1645 = alloca i64<br>
%b.34 = alloca i8*<br> %D.1639 = alloca i64<br> %c.37 = alloca i8*<br> %D.1633 = alloca i64<br> %FRAME.40 = alloca %struct.FRAME.matmul<br> %D.1582 = alloca i32<br> %D.1593 = alloca i32<br> %D.1585 = alloca i32<br>
%D.1592 = alloca i32<br> %D.1588 = alloca i32<br> %D.1591 = alloca i32<br> %dt_parm.15 = alloca %struct.__st_parameter_dt<br> %D.1604 = alloca float<br> %D.1598 = alloca i64<br> %D.1597 = alloca i64<br> %D.1596 = alloca i64<br>
%val.16 = alloca float<br> %S.17 = alloca i64<br> %D.1601 = alloca i64<br> %S.18 = alloca i64<br> %D.1616 = alloca float<br> %fast.21 = alloca i32<br> %nonempty.20 = alloca i32<br> %D.1608 = alloca i64<br> %D.1607 = alloca i64<br>
%D.1606 = alloca i64<br> %limit.19 = alloca float<br> %S.22 = alloca i64<br> %D.1613 = alloca i64<br> %S.23 = alloca i64<br> %D.1628 = alloca float<br> %fast.26 = alloca i32<br> %nonempty.25 = alloca i32<br> %D.1620 = alloca i64<br>
%D.1619 = alloca i64<br> %D.1618 = alloca i64<br> %limit.24 = alloca float<br> %S.27 = alloca i64<br> %D.1625 = alloca i64<br> %S.28 = alloca i64<br> %D.1635 = alloca i8*<br> %D.1641 = alloca i8*<br> %D.1647 = alloca i8*<br>
%"alloca point" = bitcast i32 0 to i32<br> store i32* %nx, i32** %nx_addr<br> store i32* %ny, i32** %ny_addr<br> store i32* %nz, i32** %nz_addr<br> %0 = load i32** %nx_addr, align 64<br> %1 = load i32** %ny_addr, align 64<br>
%2 = load i32** %nz_addr, align 64<br> %"ssa point" = bitcast i32 0 to i32<br> br label %"2"<br><br>"2": ; preds = %entry<br> %3 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 12<br>
store i32* %0, i32** %3, align 8<br> %4 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 11<br> store i32* %1, i32** %4, align 8<br> %5 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 5<br>
store i32* %2, i32** %5, align 8<br> %6 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 12<br> %7 = load i32** %6, align 8<br> %8 = load i32* %7, align 4<br> %9 = sext i32 %8 to i64<br> %10 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 6<br>
store i64 %9, i64* %10, align 8<br> %11 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 6<br> %12 = load i64* %11, align 8<br> %13 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 10<br>
store i64 %12, i64* %13, align 8<br> %14 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 10<br> %15 = load i64* %14, align 8<br> %16 = icmp sge i64 %15, 0<br> %17 = select i1 %16, i64 %15, i64 0<br>
%18 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 10<br> store i64 %17, i64* %18, align 8<br> %19 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 11<br> %20 = load i32** %19, align 8<br>
%21 = load i32* %20, align 4<br> %22 = sext i32 %21 to i64<br> %23 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 7<br> store i64 %22, i64* %23, align 8<br> %24 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 10<br>
%25 = load i64* %24, align 8<br> %26 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 7<br> %27 = load i64* %26, align 8<br> %28 = mul i64 %25, %27<br> %29 = icmp sge i64 %28, 0<br> %30 = select i1 %29, i64 %28, i64 0<br>
%31 = add i64 %30, -1<br> %32 = mul i64 %30, 32<br> %33 = mul i64 %30, 4<br> %34 = mul i64 %30, 4<br> %35 = icmp uge i64 %34, 1<br> %36 = select i1 %35, i64 %34, i64 1<br> %37 = call noalias i8* @malloc(i64 %36) nounwind<br>
%38 = bitcast i8* %37 to [0 x float]*<br> %39 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 8<br> store [0 x float]* %38, [0 x float]** %39, align 8<br> %40 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 10<br>
%41 = load i64* %40, align 8<br> %not = xor i64 %41, -1<br> %42 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 9<br> store i64 %not, i64* %42, align 8<br> %43 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 11<br>
%44 = load i32** %43, align 8<br> %45 = load i32* %44, align 4<br> %46 = sext i32 %45 to i64<br> %47 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 0<br> store i64 %46, i64* %47, align 8<br> %48 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 0<br>
%49 = load i64* %48, align 8<br> %50 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 4<br> store i64 %49, i64* %50, align 8<br> %51 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 4<br>
%52 = load i64* %51, align 8<br> %53 = icmp sge i64 %52, 0<br> %54 = select i1 %53, i64 %52, i64 0<br> %55 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 4<br> store i64 %54, i64* %55, align 8<br>
%56 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 5<br> %57 = load i32** %56, align 8<br> %58 = load i32* %57, align 4<br> %59 = sext i32 %58 to i64<br> %60 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 1<br>
store i64 %59, i64* %60, align 8<br> %61 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 4<br> %62 = load i64* %61, align 8<br> %63 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 1<br>
%64 = load i64* %63, align 8<br> %65 = mul i64 %62, %64<br> %66 = icmp sge i64 %65, 0<br> %67 = select i1 %66, i64 %65, i64 0<br> %68 = add i64 %67, -1<br> %69 = mul i64 %67, 32<br> %70 = mul i64 %67, 4<br> %71 = mul i64 %67, 4<br>
%72 = icmp uge i64 %71, 1<br> %73 = select i1 %72, i64 %71, i64 1<br> %74 = call noalias i8* @malloc(i64 %73) nounwind<br> %75 = bitcast i8* %74 to [0 x float]*<br> %76 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 2<br>
store [0 x float]* %75, [0 x float]** %76, align 8<br> %77 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 4<br> %78 = load i64* %77, align 8<br> %not1 = xor i64 %78, -1<br> %79 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 3<br>
store i64 %not1, i64* %79, align 8<br> %80 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 12<br> %81 = load i32** %80, align 8<br> %82 = load i32* %81, align 4<br> %83 = sext i32 %82 to i64<br>
%84 = icmp sge i64 %83, 0<br> %85 = select i1 %84, i64 %83, i64 0<br> %86 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 5<br> %87 = load i32** %86, align 8<br> %88 = load i32* %87, align 4<br>
%89 = sext i32 %88 to i64<br> %90 = mul i64 %85, %89<br> %91 = icmp sge i64 %90, 0<br> %92 = select i1 %91, i64 %90, i64 0<br> %93 = add i64 %92, -1<br> %94 = mul i64 %92, 32<br> %95 = mul i64 %92, 4<br> %96 = mul i64 %92, 4<br>
%97 = icmp uge i64 %96, 1<br> %98 = select i1 %97, i64 %96, i64 1<br> %99 = call noalias i8* @malloc(i64 %98) nounwind<br> %100 = bitcast i8* %99 to [0 x float]*<br> %not2 = xor i64 %85, -1<br> call void @init_array.1535(%struct.FRAME.matmul* nest %FRAME.40) nounwind<br>
call void bitcast (void (...)* @_gfortran_cpu_time_4 to void (float*)*)(float* %start) nounwind<br> %101 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 12<br> %102 = load i32** %101, align 8<br> %103 = load i32* %102, align 4<br>
%104 = icmp sle i32 1, %103<br> br i1 %104, label %"3", label %"11"<br><br>"3": ; preds = %"10", %"2"<br> %105 = phi i32 [ %175, %"10" ], [ 1, %"2" ]<br>
%106 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 5<br> %107 = load i32** %106, align 8<br> %108 = load i32* %107, align 4<br> %109 = icmp sle i32 1, %108<br> br i1 %109, label %"4", label %"9"<br>
<br>"4": ; preds = %"8", %"3"<br> %110 = phi i32 [ %172, %"8" ], [ 1, %"3" ]<br> %111 = sext i32 %105 to i64<br> %112 = sext i32 %110 to i64<br>
%113 = mul i64 %112, %85<br> %114 = add i64 %111, %113<br> %115 = add i64 %114, %not2<br> %116 = bitcast [0 x float]* %100 to float*<br> %117 = getelementptr float* %116, i64 %115<br> store float 0.000000e+00, float* %117, align 4<br>
%118 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 11<br> %119 = load i32** %118, align 8<br> %120 = load i32* %119, align 4<br> %121 = icmp sle i32 1, %120<br> br i1 %121, label %"5", label %"7"<br>
<br>"5": ; preds = %"6", %"4"<br> %122 = phi i32 [ %169, %"6" ], [ 1, %"4" ]<br> %123 = sext i32 %105 to i64<br> %124 = sext i32 %110 to i64<br>
%125 = mul i64 %124, %85<br> %126 = add i64 %123, %125<br> %127 = add i64 %126, %not2<br> %128 = sext i32 %105 to i64<br> %129 = sext i32 %110 to i64<br> %130 = mul i64 %129, %85<br> %131 = add i64 %128, %130<br> %132 = add i64 %131, %not2<br>
%133 = bitcast [0 x float]* %100 to float*<br> %134 = getelementptr float* %133, i64 %132<br> %135 = load float* %134, align 4<br> %136 = sext i32 %105 to i64<br> %137 = sext i32 %122 to i64<br> %138 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 10<br>
%139 = load i64* %138, align 8<br> %140 = mul i64 %137, %139<br> %141 = add i64 %136, %140<br> %142 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 9<br> %143 = load i64* %142, align 8<br> %144 = add i64 %141, %143<br>
%145 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 8<br> %146 = load [0 x float]** %145, align 8<br> %147 = bitcast [0 x float]* %146 to float*<br> %148 = getelementptr float* %147, i64 %144<br>
%149 = load float* %148, align 4<br> %150 = sext i32 %122 to i64<br> %151 = sext i32 %110 to i64<br> %152 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 4<br> %153 = load i64* %152, align 8<br>
%154 = mul i64 %151, %153<br> %155 = add i64 %150, %154<br> %156 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 3<br> %157 = load i64* %156, align 8<br> %158 = add i64 %155, %157<br> %159 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 2<br>
%160 = load [0 x float]** %159, align 8<br> %161 = bitcast [0 x float]* %160 to float*<br> %162 = getelementptr float* %161, i64 %158<br> %163 = load float* %162, align 4<br> %164 = fmul float %149, %163<br> %165 = fadd float %135, %164<br>
%166 = bitcast [0 x float]* %100 to float*<br> %167 = getelementptr float* %166, i64 %127<br> store float %165, float* %167, align 4<br> %168 = icmp eq i32 %122, %120<br> %169 = add i32 %122, 1<br> %170 = icmp ne i1 %168, false<br>
br i1 %170, label %"7", label %"6"<br><br>"6": ; preds = %"5"<br> br label %"5"<br><br>"7": ; preds = %"5", %"4"<br>
%171 = icmp eq i32 %110, %108<br> %172 = add i32 %110, 1<br> %173 = icmp ne i1 %171, false<br> br i1 %173, label %"9", label %"8"<br><br>"8": ; preds = %"7"<br>
br label %"4"<br><br>"9": ; preds = %"7", %"3"<br> %174 = icmp eq i32 %105, %103<br> %175 = add i32 %105, 1<br> %176 = icmp ne i1 %174, false<br>
br i1 %176, label %"11", label %"10"<br><br>"10": ; preds = %"9"<br> br label %"3"<br><br>"11": ; preds = %"9", %"2"<br>
call void bitcast (void (...)* @_gfortran_cpu_time_4 to void (float*)*)(float* %finish) nounwind<br> %177 = getelementptr inbounds %struct.__st_parameter_dt* %dt_parm.15, i32 0, i32 0<br> %178 = getelementptr inbounds %struct.__st_parameter_common* %177, i32 0, i32 2<br>
store i8* getelementptr inbounds ([11 x i8]* @.cst, i64 0, i64 0), i8** %178, align 8<br> %179 = getelementptr inbounds %struct.__st_parameter_dt* %dt_parm.15, i32 0, i32 0<br> %180 = getelementptr inbounds %struct.__st_parameter_common* %179, i32 0, i32 3<br>
store i32 27, i32* %180, align 4<br> %181 = getelementptr inbounds %struct.__st_parameter_dt* %dt_parm.15, i32 0, i32 0<br> %182 = getelementptr inbounds %struct.__st_parameter_common* %181, i32 0, i32 0<br> store i32 128, i32* %182, align 4<br>
%183 = getelementptr inbounds %struct.__st_parameter_dt* %dt_parm.15, i32 0, i32 0<br> %184 = getelementptr inbounds %struct.__st_parameter_common* %183, i32 0, i32 1<br> store i32 6, i32* %184, align 4<br> call void @_gfortran_st_write(%struct.__st_parameter_dt* %dt_parm.15) nounwind<br>
br label %"12"<br><br>"12": ; preds = %"16", %"11"<br> %185 = phi float [ %190, %"16" ], [ 0.000000e+00, %"11" ]<br>
%186 = phi i64 [ %199, %"16" ], [ 1, %"11" ]<br> %187 = icmp sgt i64 %186, %89<br> br i1 %187, label %"17", label %"13"<br><br>"13": ; preds = %"12"<br>
%188 = mul i64 %186, %85<br> %189 = add i64 %188, %not2<br> br label %"14"<br><br>"14": ; preds = %"15", %"13"<br> %190 = phi float [ %197, %"15" ], [ %185, %"13" ]<br>
%191 = phi i64 [ %198, %"15" ], [ 1, %"13" ]<br> %192 = icmp sgt i64 %191, %83<br> br i1 %192, label %"16", label %"15"<br><br>"15": ; preds = %"14"<br>
%193 = add i64 %191, %189<br> %194 = bitcast [0 x float]* %100 to float*<br> %195 = getelementptr float* %194, i64 %193<br> %196 = load float* %195, align 4<br> %197 = fadd float %196, %190<br> %198 = add i64 %191, 1<br>
br label %"14"<br><br>"16": ; preds = %"14"<br> %199 = add i64 %186, 1<br> br label %"12"<br><br>"17": ; preds = %"12"<br>
store float %185, float* %D.1604, align 4<br> call void bitcast (void (%struct.__st_parameter_dt*, i8*, i32)* @_gfortran_transfer_real_write to void (%struct.__st_parameter_dt*, float*, i32)*)(%struct.__st_parameter_dt* %dt_parm.15, float* %D.1604, i32 4) nounwind<br>
br label %"18"<br><br>"18": ; preds = %"27", %"17"<br> %200 = phi float [ %207, %"27" ], [ 0xFFF0000000000000, %"17" ]<br>
%201 = phi i1 [ %208, %"27" ], [ false, %"17" ]<br> %202 = phi i1 [ %209, %"27" ], [ false, %"17" ]<br> %203 = phi i64 [ %237, %"27" ], [ 1, %"17" ]<br> %204 = icmp sgt i64 %203, %89<br>
br i1 %204, label %"28", label %"19"<br><br>"19": ; preds = %"18"<br> %205 = mul i64 %203, %85<br> %206 = add i64 %205, %not2<br> br label %"20"<br>
<br>"20": ; preds = %"26", %"19"<br> %207 = phi float [ %233, %"26" ], [ %200, %"19" ]<br> %208 = phi i1 [ %234, %"26" ], [ %201, %"19" ]<br>
%209 = phi i1 [ %235, %"26" ], [ %202, %"19" ]<br> %210 = phi i64 [ %236, %"26" ], [ 1, %"19" ]<br> %211 = icmp sgt i64 %210, %83<br> br i1 %211, label %"27", label %"21"<br>
<br>"21": ; preds = %"20"<br> %212 = icmp ne i1 %209, false<br> br i1 %212, label %"22", label %"24"<br><br>"22": ; preds = %"21"<br>
%213 = add i64 %210, %206<br> %214 = bitcast [0 x float]* %100 to float*<br> %215 = getelementptr float* %214, i64 %213<br> %216 = load float* %215, align 4<br> %217 = fcmp ogt float %216, %207<br> %218 = icmp ne i1 %217, false<br>
br i1 %218, label %"23", label %"26"<br><br>"23": ; preds = %"22"<br> %219 = add i64 %210, %206<br> %220 = bitcast [0 x float]* %100 to float*<br>
%221 = getelementptr float* %220, i64 %219<br> %222 = load float* %221, align 4<br> br label %"26"<br><br>"24": ; preds = %"21"<br> %223 = add i64 %210, %206<br>
%224 = bitcast [0 x float]* %100 to float*<br> %225 = getelementptr float* %224, i64 %223<br> %226 = load float* %225, align 4<br> %227 = fcmp oge float %226, %207<br> %228 = icmp ne i1 %227, false<br> br i1 %228, label %"25", label %"26"<br>
<br>"25": ; preds = %"24"<br> %229 = add i64 %210, %206<br> %230 = bitcast [0 x float]* %100 to float*<br> %231 = getelementptr float* %230, i64 %229<br> %232 = load float* %231, align 4<br>
br label %"26"<br><br>"26": ; preds = %"25", %"24", %"23", %"22"<br> %233 = phi float [ %232, %"25" ], [ %207, %"24" ], [ %222, %"23" ], [ %207, %"22" ]<br>
%234 = phi i1 [ true, %"25" ], [ true, %"24" ], [ %208, %"23" ], [ %208, %"22" ]<br> %235 = phi i1 [ true, %"25" ], [ %209, %"24" ], [ %209, %"23" ], [ %209, %"22" ]<br>
%236 = add i64 %210, 1<br> br label %"20"<br><br>"27": ; preds = %"20"<br> %237 = add i64 %203, 1<br> br label %"18"<br><br>"28": ; preds = %"18"<br>
%238 = icmp ne i1 %202, false<br> br i1 %238, label %"33", label %"29"<br><br>"29": ; preds = %"28"<br> %239 = icmp ne i1 %201, false<br>
br i1 %239, label %"30", label %"31"<br><br>"30": ; preds = %"29"<br> br label %"32"<br><br>"31": ; preds = %"29"<br>
br label %"32"<br><br>"32": ; preds = %"31", %"30"<br> %240 = phi float [ 0xC7EFFFFFE0000000, %"31" ], [ 0x7FF8000000000000, %"30" ]<br>
br label %"33"<br><br>"33": ; preds = %"32", %"28"<br> %241 = phi float [ %240, %"32" ], [ %200, %"28" ]<br> store float %241, float* %D.1616, align 4<br>
call void bitcast (void (%struct.__st_parameter_dt*, i8*, i32)* @_gfortran_transfer_real_write to void (%struct.__st_parameter_dt*, float*, i32)*)(%struct.__st_parameter_dt* %dt_parm.15, float* %D.1616, i32 4) nounwind<br>
br label %"34"<br><br>"34": ; preds = %"43", %"33"<br> %242 = phi float [ %249, %"43" ], [ 0x7FF0000000000000, %"33" ]<br>
%243 = phi i1 [ %250, %"43" ], [ false, %"33" ]<br> %244 = phi i1 [ %251, %"43" ], [ false, %"33" ]<br> %245 = phi i64 [ %279, %"43" ], [ 1, %"33" ]<br> %246 = icmp sgt i64 %245, %89<br>
br i1 %246, label %"44", label %"35"<br><br>"35": ; preds = %"34"<br> %247 = mul i64 %245, %85<br> %248 = add i64 %247, %not2<br> br label %"36"<br>
<br>"36": ; preds = %"42", %"35"<br> %249 = phi float [ %275, %"42" ], [ %242, %"35" ]<br> %250 = phi i1 [ %276, %"42" ], [ %243, %"35" ]<br>
%251 = phi i1 [ %277, %"42" ], [ %244, %"35" ]<br> %252 = phi i64 [ %278, %"42" ], [ 1, %"35" ]<br> %253 = icmp sgt i64 %252, %83<br> br i1 %253, label %"43", label %"37"<br>
<br>"37": ; preds = %"36"<br> %254 = icmp ne i1 %251, false<br> br i1 %254, label %"38", label %"40"<br><br>"38": ; preds = %"37"<br>
%255 = add i64 %252, %248<br> %256 = bitcast [0 x float]* %100 to float*<br> %257 = getelementptr float* %256, i64 %255<br> %258 = load float* %257, align 4<br> %259 = fcmp olt float %258, %249<br> %260 = icmp ne i1 %259, false<br>
br i1 %260, label %"39", label %"42"<br><br>"39": ; preds = %"38"<br> %261 = add i64 %252, %248<br> %262 = bitcast [0 x float]* %100 to float*<br>
%263 = getelementptr float* %262, i64 %261<br> %264 = load float* %263, align 4<br> br label %"42"<br><br>"40": ; preds = %"37"<br> %265 = add i64 %252, %248<br>
%266 = bitcast [0 x float]* %100 to float*<br> %267 = getelementptr float* %266, i64 %265<br> %268 = load float* %267, align 4<br> %269 = fcmp ole float %268, %249<br> %270 = icmp ne i1 %269, false<br> br i1 %270, label %"41", label %"42"<br>
<br>"41": ; preds = %"40"<br> %271 = add i64 %252, %248<br> %272 = bitcast [0 x float]* %100 to float*<br> %273 = getelementptr float* %272, i64 %271<br> %274 = load float* %273, align 4<br>
br label %"42"<br><br>"42": ; preds = %"41", %"40", %"39", %"38"<br> %275 = phi float [ %274, %"41" ], [ %249, %"40" ], [ %264, %"39" ], [ %249, %"38" ]<br>
%276 = phi i1 [ true, %"41" ], [ true, %"40" ], [ %250, %"39" ], [ %250, %"38" ]<br> %277 = phi i1 [ true, %"41" ], [ %251, %"40" ], [ %251, %"39" ], [ %251, %"38" ]<br>
%278 = add i64 %252, 1<br> br label %"36"<br><br>"43": ; preds = %"36"<br> %279 = add i64 %245, 1<br> br label %"34"<br><br>"44": ; preds = %"34"<br>
%280 = icmp ne i1 %244, false<br> br i1 %280, label %"49", label %"45"<br><br>"45": ; preds = %"44"<br> %281 = icmp ne i1 %243, false<br>
br i1 %281, label %"46", label %"47"<br><br>"46": ; preds = %"45"<br> br label %"48"<br><br>"47": ; preds = %"45"<br>
br label %"48"<br><br>"48": ; preds = %"47", %"46"<br> %282 = phi float [ 0x47EFFFFFE0000000, %"47" ], [ 0x7FF8000000000000, %"46" ]<br>
br label %"49"<br><br>"49": ; preds = %"48", %"44"<br> %283 = phi float [ %282, %"48" ], [ %242, %"44" ]<br> store float %283, float* %D.1628, align 4<br>
call void bitcast (void (%struct.__st_parameter_dt*, i8*, i32)* @_gfortran_transfer_real_write to void (%struct.__st_parameter_dt*, float*, i32)*)(%struct.__st_parameter_dt* %dt_parm.15, float* %D.1628, i32 4) nounwind<br>
call void @_gfortran_st_write_done(%struct.__st_parameter_dt* %dt_parm.15) nounwind<br> call void bitcast (void (...)* @_gfortran_flush_i4 to void (i8*)*)(i8* null) nounwind<br> %284 = bitcast [0 x float]* %100 to i8*<br>
%285 = icmp ne i8* %284, null<br> br i1 %285, label %"50", label %"51"<br><br>"50": ; preds = %"49"<br> call void @free(i8* %284) nounwind<br>
br label %"51"<br><br>"51": ; preds = %"50", %"49"<br> %286 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 2<br>
%287 = load [0 x float]** %286, align 8<br> %288 = bitcast [0 x float]* %287 to i8*<br> %289 = icmp ne i8* %288, null<br> br i1 %289, label %"52", label %"53"<br><br>"52": ; preds = %"51"<br>
call void @free(i8* %288) nounwind<br> br label %"53"<br><br>"53": ; preds = %"52", %"51"<br> %290 = getelementptr inbounds %struct.FRAME.matmul* %FRAME.40, i32 0, i32 8<br>
%291 = load [0 x float]** %290, align 8<br> %292 = bitcast [0 x float]* %291 to i8*<br> %293 = icmp ne i8* %292, null<br> br i1 %293, label %"54", label %"55"<br><br>"54": ; preds = %"53"<br>
call void @free(i8* %292) nounwind<br> br label %"55"<br><br>"55": ; preds = %"54", %"53"<br> br label %return<br><br>return: ; preds = %"55"<br>
ret void<br>}<br><br>declare noalias i8* @malloc(i64) nounwind<br><br>declare void @_gfortran_cpu_time_4(...)<br><br>declare void @_gfortran_st_write(%struct.__st_parameter_dt*)<br><br>declare void @_gfortran_transfer_real_write(%struct.__st_parameter_dt*, i8*, i32)<br>
<br>declare void @_gfortran_st_write_done(%struct.__st_parameter_dt*)<br><br>declare void @_gfortran_flush_i4(...)<br><br>declare void @free(i8*) nounwind<br><br>