Skip to content

WIP/RFC make the partial scalars VecElements - #563

Open
KristofferC wants to merge 1 commit into
masterfrom
kc/vecelements
Open

WIP/RFC make the partial scalars VecElements#563
KristofferC wants to merge 1 commit into
masterfrom
kc/vecelements

Conversation

@KristofferC

@KristofferCKristofferC commented Nov 22, 2021

Copy link
Copy Markdown
Collaborator

Only implemented enough so that the benchmark in #555 can be tested. Putting it up here in case people want to play with it.

Results of the benchmark in #555:

Branch:

julia>include("fdiffbench.jl")
0.818333 seconds (5.35 M allocations:261.957 MiB, 14.27% gc time, 99.99% compilation time)
810.158 ns (0 allocations:0 bytes)

PR:

julia>include("fdiffbench.jl")
0.622877 seconds (4.19 M allocations:216.628 MiB, 7.33% gc time, 99.99% compilation time)
723.782 ns (0 allocations:0 bytes)

The number of LLVM instructions after optimization didn't really seem to change. Compile-time seems to improve quite a bit though, likely due to more compact LLVM IR pre-optimization.

This is a bit annoying since VecElement behave differently from numbers in some ways:

julia> VecElement{2.0} == VecElement{2}
false
julia>2.0==2true

@chriselrod

chriselrod commented Nov 22, 2021

Copy link
Copy Markdown
Contributor

The number of LLVM instructions in the end didn't really seem to change.

The llvm for rhs! seems to have changed a lot, but it isn't much shorter (435 vs 425 lines):

Master
definevoid @"julia_rhs!_4840"({}* nonnullalign16dereferenceable(40) %0, {}* nonnullalign16dereferenceable(40) %1, double%2) {
top:
%3 = bitcast {}* %1to { double, [1 x [8 x double]] }**
%4 = load { double, [1 x [8 x double]] }*, { double, [1 x [8 x double]] }** %3, align8%.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i640, i320%.unpack = loaddouble, double* %.elt, align8%.unpack1661.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i640, i321, i640, i640%5 = bitcastdouble* %.unpack1661.unpack.eltto <8 x double>*
%6 = load <8 x double>, <8 x double>* %5, align8%7 = fmuldouble%.unpack, 3.500000e-01%8 = fmul <8 x double> %6, <double3.500000e-01, double3.500000e-01, double3.500000e-01, double3.500000e-01, double3.500000e-01, double3.500000e-01, double3.500000e-01, double3.500000e-01>
%.elt1678 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i641, i320%.unpack1679 = loaddouble, double* %.elt1678, align8%.unpack1681.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i641, i321, i640, i640%9 = bitcastdouble* %.unpack1681.unpack.eltto <8 x double>*
%10 = load <8 x double>, <8 x double>* %9, align8%.elt1698 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i643, i320%.unpack1699 = loaddouble, double* %.elt1698, align8%.unpack1701.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i643, i321, i640, i640%11 = bitcastdouble* %.unpack1701.unpack.eltto <8 x double>*
%12 = load <8 x double>, <8 x double>* %11, align8%13 = fmuldouble%.unpack1679, 2.660000e+01%14 = fmul <8 x double> %10, <double2.660000e+01, double2.660000e+01, double2.660000e+01, double2.660000e+01, double2.660000e+01, double2.660000e+01, double2.660000e+01, double2.660000e+01>
%15 = fmuldouble%13, %.unpack1699%16 = insertelement <8 x double> undef, double%13, i320%res.i1659 = shufflevector <8 x double> %16, <8 x double> undef, <8 x i32> zeroinitializer%17 = fmul <8 x double> %res.i1659, %12%18 = insertelement <8 x double> undef, double%.unpack1699, i320%res.i1658 = shufflevector <8 x double> %18, <8 x double> undef, <8 x i32> zeroinitializer%19 = call <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1658, <8 x double> %14, <8 x double> %17)
%.elt1718 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i644, i320%.unpack1719 = loaddouble, double* %.elt1718, align8%.unpack1721.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i644, i321, i640, i640%20 = bitcastdouble* %.unpack1721.unpack.eltto <8 x double>*
%21 = load <8 x double>, <8 x double>* %20, align8%22 = fmuldouble%.unpack1719, 1.230000e+04%23 = fmul <8 x double> %21, <double1.230000e+04, double1.230000e+04, double1.230000e+04, double1.230000e+04, double1.230000e+04, double1.230000e+04, double1.230000e+04, double1.230000e+04>
%24 = fmuldouble%22, %.unpack1679%25 = insertelement <8 x double> undef, double%22, i320%res.i1657 = shufflevector <8 x double> %25, <8 x double> undef, <8 x i32> zeroinitializer%26 = fmul <8 x double> %res.i1657, %10%27 = insertelement <8 x double> undef, double%.unpack1679, i320%res.i1656 = shufflevector <8 x double> %27, <8 x double> undef, <8 x i32> zeroinitializer%28 = call <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1656, <8 x double> %23, <8 x double> %26)
%.elt1758 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i646, i320%.unpack1759 = loaddouble, double* %.elt1758, align8%.unpack1761.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i646, i321, i640, i640%29 = bitcastdouble* %.unpack1761.unpack.eltto <8 x double>*
%30 = load <8 x double>, <8 x double>* %29, align8%31 = fmuldouble%.unpack1759, 0x3F4C2E33EFF19503%32 = fmul <8 x double> %30, <double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503>
%33 = fmuldouble%.unpack1759, 0x3F4ADEA897635E74%34 = fmul <8 x double> %30, <double0x3F4ADEA897635E74, double0x3F4ADEA897635E74, double0x3F4ADEA897635E74, double0x3F4ADEA897635E74, double0x3F4ADEA897635E74, double0x3F4ADEA897635E74, double0x3F4ADEA897635E74, double0x3F4ADEA897635E74>
%.elt1818 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i645, i320%.unpack1819 = loaddouble, double* %.elt1818, align8%.unpack1821.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i645, i321, i640, i640%35 = bitcastdouble* %.unpack1821.unpack.eltto <8 x double>*
%36 = load <8 x double>, <8 x double>* %35, align8%37 = fmuldouble%.unpack1759, 1.500000e+04%38 = fmul <8 x double> %30, <double1.500000e+04, double1.500000e+04, double1.500000e+04, double1.500000e+04, double1.500000e+04, double1.500000e+04, double1.500000e+04, double1.500000e+04>
%39 = fmuldouble%37, %.unpack1819%40 = insertelement <8 x double> undef, double%37, i320%res.i1655 = shufflevector <8 x double> %40, <8 x double> undef, <8 x i32> zeroinitializer%41 = fmul <8 x double> %res.i1655, %36%42 = insertelement <8 x double> undef, double%.unpack1819, i320%res.i1654 = shufflevector <8 x double> %42, <8 x double> undef, <8 x i32> zeroinitializer%43 = call <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1654, <8 x double> %38, <8 x double> %41)
%.elt1838 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i648, i320%.unpack1839 = loaddouble, double* %.elt1838, align8%.unpack1841.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i648, i321, i640, i640%44 = bitcastdouble* %.unpack1841.unpack.eltto <8 x double>*
%45 = load <8 x double>, <8 x double>* %44, align8%46 = fmuldouble%.unpack1839, 1.300000e-04%47 = fmul <8 x double> %45, <double1.300000e-04, double1.300000e-04, double1.300000e-04, double1.300000e-04, double1.300000e-04, double1.300000e-04, double1.300000e-04, double1.300000e-04>
%48 = fmuldouble%.unpack1839, 2.400000e+04%49 = fmul <8 x double> %45, <double2.400000e+04, double2.400000e+04, double2.400000e+04, double2.400000e+04, double2.400000e+04, double2.400000e+04, double2.400000e+04, double2.400000e+04>
%50 = fmuldouble%48, %.unpack1819%51 = insertelement <8 x double> undef, double%48, i320%res.i1653 = shufflevector <8 x double> %51, <8 x double> undef, <8 x i32> zeroinitializer%52 = fmul <8 x double> %res.i1653, %36%53 = call <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1654, <8 x double> %49, <8 x double> %52)
%.elt1898 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6410, i320%.unpack1899 = loaddouble, double* %.elt1898, align8%.unpack1901.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6410, i321, i640, i640%54 = bitcastdouble* %.unpack1901.unpack.eltto <8 x double>*
%55 = load <8 x double>, <8 x double>* %54, align8%56 = fmuldouble%.unpack1899, 1.650000e+04%57 = fmul <8 x double> %55, <double1.650000e+04, double1.650000e+04, double1.650000e+04, double1.650000e+04, double1.650000e+04, double1.650000e+04, double1.650000e+04, double1.650000e+04>
%58 = fmuldouble%56, %.unpack1679%59 = insertelement <8 x double> undef, double%56, i320%res.i1651 = shufflevector <8 x double> %59, <8 x double> undef, <8 x i32> zeroinitializer%60 = fmul <8 x double> %res.i1651, %10%61 = call <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1656, <8 x double> %57, <8 x double> %60)
%62 = fmuldouble%.unpack1899, 9.000000e+03%63 = fmul <8 x double> %55, <double9.000000e+03, double9.000000e+03, double9.000000e+03, double9.000000e+03, double9.000000e+03, double9.000000e+03, double9.000000e+03, double9.000000e+03>
%64 = fmuldouble%62, %.unpack%65 = insertelement <8 x double> undef, double%62, i320%res.i1649 = shufflevector <8 x double> %65, <8 x double> undef, <8 x i32> zeroinitializer%66 = fmul <8 x double> %res.i1649, %6%67 = insertelement <8 x double> undef, double%.unpack, i320%res.i1648 = shufflevector <8 x double> %67, <8 x double> undef, <8 x i32> zeroinitializer%68 = call <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1648, <8 x double> %63, <8 x double> %66)
%.elt1978 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6412, i320%.unpack1979 = loaddouble, double* %.elt1978, align8%.unpack1981.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6412, i321, i640, i640%69 = bitcastdouble* %.unpack1981.unpack.eltto <8 x double>*
%70 = load <8 x double>, <8 x double>* %69, align8%71 = fmuldouble%.unpack1979, 2.200000e-02%72 = fmul <8 x double> %70, <double2.200000e-02, double2.200000e-02, double2.200000e-02, double2.200000e-02, double2.200000e-02, double2.200000e-02, double2.200000e-02, double2.200000e-02>
%.elt1998 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i649, i320%.unpack1999 = loaddouble, double* %.elt1998, align8%.unpack2001.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i649, i321, i640, i640%73 = bitcastdouble* %.unpack2001.unpack.eltto <8 x double>*
%74 = load <8 x double>, <8 x double>* %73, align8%75 = fmuldouble%.unpack1999, 1.200000e+04%76 = fmul <8 x double> %74, <double1.200000e+04, double1.200000e+04, double1.200000e+04, double1.200000e+04, double1.200000e+04, double1.200000e+04, double1.200000e+04, double1.200000e+04>
%77 = fmuldouble%75, %.unpack1679%78 = insertelement <8 x double> undef, double%75, i320%res.i1647 = shufflevector <8 x double> %78, <8 x double> undef, <8 x i32> zeroinitializer%79 = fmul <8 x double> %res.i1647, %10%80 = call <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1656, <8 x double> %76, <8 x double> %79)
%.elt2038 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6413, i320%.unpack2039 = loaddouble, double* %.elt2038, align8%.unpack2041.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6413, i321, i640, i640%81 = bitcastdouble* %.unpack2041.unpack.eltto <8 x double>*
%82 = load <8 x double>, <8 x double>* %81, align8%83 = fmuldouble%.unpack2039, 1.880000e+00%84 = fmul <8 x double> %82, <double1.880000e+00, double1.880000e+00, double1.880000e+00, double1.880000e+00, double1.880000e+00, double1.880000e+00, double1.880000e+00, double1.880000e+00>
%85 = fmuldouble%.unpack, 1.630000e+04%86 = fmul <8 x double> %6, <double1.630000e+04, double1.630000e+04, double1.630000e+04, double1.630000e+04, double1.630000e+04, double1.630000e+04, double1.630000e+04, double1.630000e+04>
%87 = fmuldouble%85, %.unpack1819%88 = insertelement <8 x double> undef, double%85, i320%res.i1645 = shufflevector <8 x double> %88, <8 x double> undef, <8 x i32> zeroinitializer%89 = fmul <8 x double> %res.i1645, %36%90 = call <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1654, <8 x double> %86, <8 x double> %89)
%.elt2098 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i642, i320%.unpack2099 = loaddouble, double* %.elt2098, align8%.unpack2101.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i642, i321, i640, i640%91 = bitcastdouble* %.unpack2101.unpack.eltto <8 x double>*
%92 = load <8 x double>, <8 x double>* %91, align8%93 = fmuldouble%.unpack2099, 4.800000e+06%94 = fmul <8 x double> %92, <double4.800000e+06, double4.800000e+06, double4.800000e+06, double4.800000e+06, double4.800000e+06, double4.800000e+06, double4.800000e+06, double4.800000e+06>
%95 = fmuldouble%.unpack1699, 3.500000e-04%96 = fmul <8 x double> %12, <double3.500000e-04, double3.500000e-04, double3.500000e-04, double3.500000e-04, double3.500000e-04, double3.500000e-04, double3.500000e-04, double3.500000e-04>
%97 = fmuldouble%.unpack1699, 1.750000e-02%98 = fmul <8 x double> %12, <double1.750000e-02, double1.750000e-02, double1.750000e-02, double1.750000e-02, double1.750000e-02, double1.750000e-02, double1.750000e-02, double1.750000e-02>
%.elt2158 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6415, i320%.unpack2159 = loaddouble, double* %.elt2158, align8%.unpack2161.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6415, i321, i640, i640%99 = bitcastdouble* %.unpack2161.unpack.eltto <8 x double>*
%100 = load <8 x double>, <8 x double>* %99, align8%101 = fmuldouble%.unpack2159, 1.000000e+08%102 = fmul <8 x double> %100, <double1.000000e+08, double1.000000e+08, double1.000000e+08, double1.000000e+08, double1.000000e+08, double1.000000e+08, double1.000000e+08, double1.000000e+08>
%103 = fmuldouble%.unpack2159, 4.440000e+11%104 = fmul <8 x double> %100, <double4.440000e+11, double4.440000e+11, double4.440000e+11, double4.440000e+11, double4.440000e+11, double4.440000e+11, double4.440000e+11, double4.440000e+11>
%.elt2198 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6416, i320%.unpack2199 = loaddouble, double* %.elt2198, align8%.unpack2201.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6416, i321, i640, i640%105 = bitcastdouble* %.unpack2201.unpack.eltto <8 x double>*
%106 = load <8 x double>, <8 x double>* %105, align8%107 = fmuldouble%.unpack2199, 1.240000e+03%108 = fmul <8 x double> %106, <double1.240000e+03, double1.240000e+03, double1.240000e+03, double1.240000e+03, double1.240000e+03, double1.240000e+03, double1.240000e+03, double1.240000e+03>
%109 = fmuldouble%107, %.unpack1819%110 = insertelement <8 x double> undef, double%107, i320%res.i1643 = shufflevector <8 x double> %110, <8 x double> undef, <8 x i32> zeroinitializer%111 = fmul <8 x double> %res.i1643, %36%112 = call <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1654, <8 x double> %108, <8 x double> %111)
%.elt2238 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6418, i320%.unpack2239 = loaddouble, double* %.elt2238, align8%.unpack2241.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6418, i321, i640, i640%113 = bitcastdouble* %.unpack2241.unpack.eltto <8 x double>*
%114 = load <8 x double>, <8 x double>* %113, align8%115 = fmuldouble%.unpack2239, 2.100000e+00%116 = fmul <8 x double> %114, <double2.100000e+00, double2.100000e+00, double2.100000e+00, double2.100000e+00, double2.100000e+00, double2.100000e+00, double2.100000e+00, double2.100000e+00>
%117 = fmuldouble%.unpack2239, 5.780000e+00%118 = fmul <8 x double> %114, <double5.780000e+00, double5.780000e+00, double5.780000e+00, double5.780000e+00, double5.780000e+00, double5.780000e+00, double5.780000e+00, double5.780000e+00>
%119 = fmuldouble%.unpack, 4.740000e-02%120 = fmul <8 x double> %6, <double4.740000e-02, double4.740000e-02, double4.740000e-02, double4.740000e-02, double4.740000e-02, double4.740000e-02, double4.740000e-02, double4.740000e-02>
%121 = fmuldouble%119, %.unpack1699%122 = insertelement <8 x double> undef, double%119, i320%res.i1641 = shufflevector <8 x double> %122, <8 x double> undef, <8 x i32> zeroinitializer%123 = fmul <8 x double> %res.i1641, %12%124 = call <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1658, <8 x double> %120, <8 x double> %123)
%125 = fmuldouble%.unpack2239, 1.780000e+03%126 = fmul <8 x double> %114, <double1.780000e+03, double1.780000e+03, double1.780000e+03, double1.780000e+03, double1.780000e+03, double1.780000e+03, double1.780000e+03, double1.780000e+03>
%127 = fmuldouble%125, %.unpack%128 = insertelement <8 x double> undef, double%125, i320%res.i1639 = shufflevector <8 x double> %128, <8 x double> undef, <8 x i32> zeroinitializer%129 = fmul <8 x double> %res.i1639, %6%130 = call <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1648, <8 x double> %126, <8 x double> %129)
%.elt2358 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6419, i320%.unpack2359 = loaddouble, double* %.elt2358, align8%.unpack2361.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6419, i321, i640, i640%131 = bitcastdouble* %.unpack2361.unpack.eltto <8 x double>*
%132 = load <8 x double>, <8 x double>* %131, align8%133 = fmuldouble%.unpack2359, 3.120000e+00%134 = fmul <8 x double> %132, <double3.120000e+00, double3.120000e+00, double3.120000e+00, double3.120000e+00, double3.120000e+00, double3.120000e+00, double3.120000e+00, double3.120000e+00>
%135 = fneg double%7%136 = fneg <8 x double> %8%137 = fsubdouble%135, %64%138 = fsub <8 x double> %136, %68%139 = fsubdouble%137, %87%140 = fsub <8 x double> %138, %90%141 = fsubdouble%139, %121%142 = fsub <8 x double> %140, %124%143 = fsubdouble%141, %127%144 = fsub <8 x double> %142, %130%145 = fadddouble%15, %143%146 = fadd <8 x double> %19, %144%147 = fadddouble%24, %145%148 = fadd <8 x double> %28, %146%149 = fadddouble%58, %147%150 = fadd <8 x double> %61, %148%151 = fadddouble%71, %149%152 = fadd <8 x double> %72, %150%153 = fadddouble%77, %151%154 = fadd <8 x double> %80, %152%155 = fadddouble%117, %153%156 = fadd <8 x double> %118, %154%157 = fadddouble%155, %133%158 = fadd <8 x double> %156, %134%159 = bitcast {}* %0to { double, [1 x [8 x double]] }**
%160 = load { double, [1 x [8 x double]] }*, { double, [1 x [8 x double]] }** %159, align8%.repack = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i640, i320storedouble%157, double* %.repack, align8%161 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i640, i321, i640%162 = bitcast [8 x double]* %161to <8 x double>*
store <8 x double> %158, <8 x double>* %162, align8%163 = fneg double%15%164 = fneg <8 x double> %19%165 = fsubdouble%163, %24%166 = fsub <8 x double> %164, %28%167 = fsubdouble%165, %58%168 = fsub <8 x double> %166, %61%169 = fsubdouble%167, %77%170 = fsub <8 x double> %168, %80%171 = fadddouble%7, %169%172 = fadd <8 x double> %8, %170%173 = fadddouble%171, %115%174 = fadd <8 x double> %172, %116%.repack2380 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i641, i320storedouble%173, double* %.repack2380, align8%175 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i641, i321, i640%176 = bitcast [8 x double]* %175to <8 x double>*
store <8 x double> %174, <8 x double>* %176, align8%177 = fsubdouble%7, %93%178 = fsub <8 x double> %8, %94%179 = fadddouble%177, %97%180 = fadd <8 x double> %178, %98%181 = fadddouble%179, %103%182 = fadd <8 x double> %180, %104%183 = fadddouble%181, %117%184 = fadd <8 x double> %182, %118%.repack2383 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i642, i320storedouble%183, double* %.repack2383, align8%185 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i642, i321, i640%186 = bitcast [8 x double]* %185to <8 x double>*
store <8 x double> %184, <8 x double>* %186, align8%187 = fsubdouble%163, %95%188 = fsub <8 x double> %164, %96%189 = fsubdouble%187, %97%190 = fsub <8 x double> %188, %98%191 = fsubdouble%189, %121%192 = fsub <8 x double> %190, %124%193 = fadddouble%93, %191%194 = fadd <8 x double> %94, %192%.repack2386 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i643, i320storedouble%193, double* %.repack2386, align8%195 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i643, i321, i640%196 = bitcast [8 x double]* %195to <8 x double>*
store <8 x double> %194, <8 x double>* %196, align8%197 = fsubdouble%31, %24%198 = fsub <8 x double> %32, %28%199 = fadddouble%31, %197%200 = fadd <8 x double> %32, %198%201 = fadddouble%199, %39%202 = fadd <8 x double> %200, %43%203 = fadddouble%201, %46%204 = fadd <8 x double> %202, %47%205 = fadddouble%203, %83%206 = fadd <8 x double> %204, %84%207 = fadddouble%205, %109%208 = fadd <8 x double> %206, %112%.repack2389 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i644, i320storedouble%207, double* %.repack2389, align8%209 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i644, i321, i640%210 = bitcast [8 x double]* %209to <8 x double>*
store <8 x double> %208, <8 x double>* %210, align8%211 = fneg double%39%212 = fneg <8 x double> %43%213 = fsubdouble%211, %50%214 = fsub <8 x double> %212, %53%215 = fsubdouble%213, %87%216 = fsub <8 x double> %214, %90%217 = fsubdouble%215, %109%218 = fsub <8 x double> %216, %112%219 = fadddouble%24, %217%220 = fadd <8 x double> %28, %218%221 = fadddouble%101, %219%222 = fadd <8 x double> %102, %220%223 = fadddouble%101, %221%224 = fadd <8 x double> %102, %222%.repack2392 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i645, i320storedouble%223, double* %.repack2392, align8%225 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i645, i321, i640%226 = bitcast [8 x double]* %225to <8 x double>*
store <8 x double> %224, <8 x double>* %226, align8%227 = fneg double%31%228 = fneg <8 x double> %32%229 = fsubdouble%227, %33%230 = fsub <8 x double> %228, %34%231 = fsubdouble%229, %39%232 = fsub <8 x double> %230, %43%233 = fadddouble%231, %83%234 = fadd <8 x double> %232, %84%.repack2395 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i646, i320storedouble%233, double* %.repack2395, align8%235 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %160, i646, i321, i640%236 = bitcast [8 x double]* %235to <8 x double>*
store <8 x double> %234, <8 x double>* %236, align8%237 = fadddouble%31, %33%238 = fadd <8 x double> %32, %34%239 = fadddouble%237, %39%240 = fadd <8 x double> %238, %43%241 = fadddouble%239, %46%242 = fadd <8 x double> %240, %47%243 = load { double, [1 x [8 x double]] }*, { double, [1 x [8 x double]] }** %159, align8%.repack2398 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i647, i320storedouble%241, double* %.repack2398, align8%244 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i647, i321, i640%245 = bitcast [8 x double]* %244to <8 x double>*
store <8 x double> %242, <8 x double>* %245, align8%246 = fneg double%46%247 = fneg <8 x double> %47%248 = fsubdouble%246, %50%249 = fsub <8 x double> %247, %53%.repack2401 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i648, i320storedouble%248, double* %.repack2401, align8%250 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i648, i321, i640%251 = bitcast [8 x double]* %250to <8 x double>*
store <8 x double> %249, <8 x double>* %251, align8%252 = fsubdouble%46, %77%253 = fsub <8 x double> %47, %80%254 = fadddouble%58, %252%255 = fadd <8 x double> %61, %253%.repack2404 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i649, i320storedouble%254, double* %.repack2404, align8%256 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i649, i321, i640%257 = bitcast [8 x double]* %256to <8 x double>*
store <8 x double> %255, <8 x double>* %257, align8%258 = fneg double%58%259 = fneg <8 x double> %61%260 = fsubdouble%258, %64%261 = fsub <8 x double> %259, %68%262 = fadddouble%50, %260%263 = fadd <8 x double> %53, %261%264 = fadddouble%262, %71%265 = fadd <8 x double> %263, %72%.repack2407 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6410, i320storedouble%264, double* %.repack2407, align8%266 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6410, i321, i640%267 = bitcast [8 x double]* %266to <8 x double>*
store <8 x double> %265, <8 x double>* %267, align8%.repack2410 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6411, i320storedouble%58, double* %.repack2410, align8%268 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6411, i321, i640%269 = bitcast [8 x double]* %268to <8 x double>*
store <8 x double> %61, <8 x double>* %269, align8%270 = fsubdouble%64, %71%271 = fsub <8 x double> %68, %72%.repack2413 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6412, i320storedouble%270, double* %.repack2413, align8%272 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6412, i321, i640%273 = bitcast [8 x double]* %272to <8 x double>*
store <8 x double> %271, <8 x double>* %273, align8%274 = fsubdouble%77, %83%275 = fsub <8 x double> %80, %84%.repack2416 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6413, i320storedouble%274, double* %.repack2416, align8%276 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6413, i321, i640%277 = bitcast [8 x double]* %276to <8 x double>*
store <8 x double> %275, <8 x double>* %277, align8%.repack2419 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6414, i320storedouble%87, double* %.repack2419, align8%278 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6414, i321, i640%279 = bitcast [8 x double]* %278to <8 x double>*
store <8 x double> %90, <8 x double>* %279, align8%280 = fneg double%101%281 = fneg <8 x double> %102%282 = fsubdouble%280, %103%283 = fsub <8 x double> %281, %104%284 = fadddouble%95, %282%285 = fadd <8 x double> %96, %283%.repack2422 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6415, i320storedouble%284, double* %.repack2422, align8%286 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6415, i321, i640%287 = bitcast [8 x double]* %286to <8 x double>*
store <8 x double> %285, <8 x double>* %287, align8%288 = fneg double%109%289 = fneg <8 x double> %112%.repack2425 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6416, i320storedouble%288, double* %.repack2425, align8%290 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6416, i321, i640%291 = bitcast [8 x double]* %290to <8 x double>*
store <8 x double> %289, <8 x double>* %291, align8%.repack2428 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6417, i320storedouble%109, double* %.repack2428, align8%292 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6417, i321, i640%293 = bitcast [8 x double]* %292to <8 x double>*
store <8 x double> %112, <8 x double>* %293, align8%294 = fneg double%115%295 = fneg <8 x double> %116%296 = fsubdouble%294, %117%297 = fsub <8 x double> %295, %118%298 = fsubdouble%296, %127%299 = fsub <8 x double> %297, %130%300 = fadddouble%121, %298%301 = fadd <8 x double> %124, %299%302 = fadddouble%300, %133%303 = fadd <8 x double> %301, %134%.repack2431 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6418, i320storedouble%302, double* %.repack2431, align8%304 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %243, i6418, i321, i640%305 = bitcast [8 x double]* %304to <8 x double>*
store <8 x double> %303, <8 x double>* %305, align8%306 = fsubdouble%127, %133%307 = fsub <8 x double> %130, %134%308 = load { double, [1 x [8 x double]] }*, { double, [1 x [8 x double]] }** %159, align8%.repack2434 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %308, i6419, i320storedouble%306, double* %.repack2434, align8%309 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %308, i6419, i321, i640%310 = bitcast [8 x double]* %309to <8 x double>*
store <8 x double> %307, <8 x double>* %310, align8retvoid
}
This PR
definevoid @"julia_rhs!_2397"({}* nonnullalign16dereferenceable(40) %0, {}* nonnullalign16dereferenceable(40) %1, double%2) {
top:
%3 = bitcast {}* %1to { double, [1 x [8 x double]] }**
%4 = load { double, [1 x [8 x double]] }*, { double, [1 x [8 x double]] }** %3, align8%.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i640, i320%.unpack = loaddouble, double* %.elt, align8%.unpack1798.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i640, i321, i640, i640%5 = bitcastdouble* %.unpack1798.unpack.eltto <8 x double>*
%6 = load <8 x double>, <8 x double>* %5, align8%7 = fmuldouble%.unpack, 3.500000e-01%res.i = fmul nsz contract <8 x double> %6, <double3.500000e-01, double3.500000e-01, double3.500000e-01, double3.500000e-01, double3.500000e-01, double3.500000e-01, double3.500000e-01, double3.500000e-01>
%.elt1815 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i641, i320%.unpack1816 = loaddouble, double* %.elt1815, align8%.unpack1818.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i641, i321, i640, i640%8 = bitcastdouble* %.unpack1818.unpack.eltto <8 x double>*
%9 = load <8 x double>, <8 x double>* %8, align8%.elt1835 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i643, i320%.unpack1836 = loaddouble, double* %.elt1835, align8%.unpack1838.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i643, i321, i640, i640%10 = bitcastdouble* %.unpack1838.unpack.eltto <8 x double>*
%11 = load <8 x double>, <8 x double>* %10, align8%12 = fmuldouble%.unpack1816, 2.660000e+01%res.i1796 = fmul nsz contract <8 x double> %9, <double2.660000e+01, double2.660000e+01, double2.660000e+01, double2.660000e+01, double2.660000e+01, double2.660000e+01, double2.660000e+01, double2.660000e+01>
%13 = fmuldouble%12, %.unpack1836%el1.i1790 = insertelement <8 x double> undef, double%.unpack1836, i320%afactor.i1791 = shufflevector <8 x double> %el1.i1790, <8 x double> undef, <8 x i32> zeroinitializer%el2.i1792 = insertelement <8 x double> undef, double%12, i320%bfactor.i1793 = shufflevector <8 x double> %el2.i1792, <8 x double> undef, <8 x i32> zeroinitializer%tmp.i1794 = fmul nsz contract <8 x double> %bfactor.i1793, %11%res.i1795 = call nsz contract <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1796, <8 x double> %afactor.i1791, <8 x double> %tmp.i1794)
%.elt1855 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i644, i320%.unpack1856 = loaddouble, double* %.elt1855, align8%.unpack1858.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i644, i321, i640, i640%14 = bitcastdouble* %.unpack1858.unpack.eltto <8 x double>*
%15 = load <8 x double>, <8 x double>* %14, align8%16 = fmuldouble%.unpack1856, 1.230000e+04%res.i1789 = fmul nsz contract <8 x double> %15, <double1.230000e+04, double1.230000e+04, double1.230000e+04, double1.230000e+04, double1.230000e+04, double1.230000e+04, double1.230000e+04, double1.230000e+04>
%17 = fmuldouble%16, %.unpack1816%el1.i1783 = insertelement <8 x double> undef, double%.unpack1816, i320%afactor.i1784 = shufflevector <8 x double> %el1.i1783, <8 x double> undef, <8 x i32> zeroinitializer%el2.i1785 = insertelement <8 x double> undef, double%16, i320%bfactor.i1786 = shufflevector <8 x double> %el2.i1785, <8 x double> undef, <8 x i32> zeroinitializer%tmp.i1787 = fmul nsz contract <8 x double> %bfactor.i1786, %9%res.i1788 = call nsz contract <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1789, <8 x double> %afactor.i1784, <8 x double> %tmp.i1787)
%.elt1895 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i646, i320%.unpack1896 = loaddouble, double* %.elt1895, align8%.unpack1898.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i646, i321, i640, i640%18 = bitcastdouble* %.unpack1898.unpack.eltto <8 x double>*
%19 = load <8 x double>, <8 x double>* %18, align8%20 = fmuldouble%.unpack1896, 0x3F4C2E33EFF19503%res.i1782 = fmul nsz contract <8 x double> %19, <double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503, double0x3F4C2E33EFF19503>
%21 = fmuldouble%.unpack1896, 0x3F4ADEA897635E74%res.i1781 = fmul nsz contract <8 x double> %19, <double0x3F4ADEA897635E74, double0x3F4ADEA897635E74, double0x3F4ADEA897635E74, double0x3F4ADEA897635E74, double0x3F4ADEA897635E74, double0x3F4ADEA897635E74, double0x3F4ADEA897635E74, double0x3F4ADEA897635E74>
%.elt1955 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i645, i320%.unpack1956 = loaddouble, double* %.elt1955, align8%.unpack1958.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i645, i321, i640, i640%22 = bitcastdouble* %.unpack1958.unpack.eltto <8 x double>*
%23 = load <8 x double>, <8 x double>* %22, align8%24 = fmuldouble%.unpack1896, 1.500000e+04%res.i1780 = fmul nsz contract <8 x double> %19, <double1.500000e+04, double1.500000e+04, double1.500000e+04, double1.500000e+04, double1.500000e+04, double1.500000e+04, double1.500000e+04, double1.500000e+04>
%25 = fmuldouble%24, %.unpack1956%el1.i1774 = insertelement <8 x double> undef, double%.unpack1956, i320%afactor.i1775 = shufflevector <8 x double> %el1.i1774, <8 x double> undef, <8 x i32> zeroinitializer%el2.i1776 = insertelement <8 x double> undef, double%24, i320%bfactor.i1777 = shufflevector <8 x double> %el2.i1776, <8 x double> undef, <8 x i32> zeroinitializer%tmp.i1778 = fmul nsz contract <8 x double> %bfactor.i1777, %23%res.i1779 = call nsz contract <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1780, <8 x double> %afactor.i1775, <8 x double> %tmp.i1778)
%.elt1975 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i648, i320%.unpack1976 = loaddouble, double* %.elt1975, align8%.unpack1978.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i648, i321, i640, i640%26 = bitcastdouble* %.unpack1978.unpack.eltto <8 x double>*
%27 = load <8 x double>, <8 x double>* %26, align8%28 = fmuldouble%.unpack1976, 1.300000e-04%res.i1773 = fmul nsz contract <8 x double> %27, <double1.300000e-04, double1.300000e-04, double1.300000e-04, double1.300000e-04, double1.300000e-04, double1.300000e-04, double1.300000e-04, double1.300000e-04>
%29 = fmuldouble%.unpack1976, 2.400000e+04%res.i1772 = fmul nsz contract <8 x double> %27, <double2.400000e+04, double2.400000e+04, double2.400000e+04, double2.400000e+04, double2.400000e+04, double2.400000e+04, double2.400000e+04, double2.400000e+04>
%30 = fmuldouble%29, %.unpack1956%el2.i1768 = insertelement <8 x double> undef, double%29, i320%bfactor.i1769 = shufflevector <8 x double> %el2.i1768, <8 x double> undef, <8 x i32> zeroinitializer%tmp.i1770 = fmul nsz contract <8 x double> %bfactor.i1769, %23%res.i1771 = call nsz contract <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1772, <8 x double> %afactor.i1775, <8 x double> %tmp.i1770)
%.elt2035 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6410, i320%.unpack2036 = loaddouble, double* %.elt2035, align8%.unpack2038.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6410, i321, i640, i640%31 = bitcastdouble* %.unpack2038.unpack.eltto <8 x double>*
%32 = load <8 x double>, <8 x double>* %31, align8%33 = fmuldouble%.unpack2036, 1.650000e+04%res.i1765 = fmul nsz contract <8 x double> %32, <double1.650000e+04, double1.650000e+04, double1.650000e+04, double1.650000e+04, double1.650000e+04, double1.650000e+04, double1.650000e+04, double1.650000e+04>
%34 = fmuldouble%33, %.unpack1816%el2.i1761 = insertelement <8 x double> undef, double%33, i320%bfactor.i1762 = shufflevector <8 x double> %el2.i1761, <8 x double> undef, <8 x i32> zeroinitializer%tmp.i1763 = fmul nsz contract <8 x double> %bfactor.i1762, %9%res.i1764 = call nsz contract <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1765, <8 x double> %afactor.i1784, <8 x double> %tmp.i1763)
%35 = fmuldouble%.unpack2036, 9.000000e+03%res.i1758 = fmul nsz contract <8 x double> %32, <double9.000000e+03, double9.000000e+03, double9.000000e+03, double9.000000e+03, double9.000000e+03, double9.000000e+03, double9.000000e+03, double9.000000e+03>
%36 = fmuldouble%35, %.unpack%el1.i1752 = insertelement <8 x double> undef, double%.unpack, i320%afactor.i1753 = shufflevector <8 x double> %el1.i1752, <8 x double> undef, <8 x i32> zeroinitializer%el2.i1754 = insertelement <8 x double> undef, double%35, i320%bfactor.i1755 = shufflevector <8 x double> %el2.i1754, <8 x double> undef, <8 x i32> zeroinitializer%tmp.i1756 = fmul nsz contract <8 x double> %bfactor.i1755, %6%res.i1757 = call nsz contract <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1758, <8 x double> %afactor.i1753, <8 x double> %tmp.i1756)
%.elt2115 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6412, i320%.unpack2116 = loaddouble, double* %.elt2115, align8%.unpack2118.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6412, i321, i640, i640%37 = bitcastdouble* %.unpack2118.unpack.eltto <8 x double>*
%38 = load <8 x double>, <8 x double>* %37, align8%39 = fmuldouble%.unpack2116, 2.200000e-02%res.i1751 = fmul nsz contract <8 x double> %38, <double2.200000e-02, double2.200000e-02, double2.200000e-02, double2.200000e-02, double2.200000e-02, double2.200000e-02, double2.200000e-02, double2.200000e-02>
%.elt2135 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i649, i320%.unpack2136 = loaddouble, double* %.elt2135, align8%.unpack2138.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i649, i321, i640, i640%40 = bitcastdouble* %.unpack2138.unpack.eltto <8 x double>*
%41 = load <8 x double>, <8 x double>* %40, align8%42 = fmuldouble%.unpack2136, 1.200000e+04%res.i1750 = fmul nsz contract <8 x double> %41, <double1.200000e+04, double1.200000e+04, double1.200000e+04, double1.200000e+04, double1.200000e+04, double1.200000e+04, double1.200000e+04, double1.200000e+04>
%43 = fmuldouble%42, %.unpack1816%el2.i1746 = insertelement <8 x double> undef, double%42, i320%bfactor.i1747 = shufflevector <8 x double> %el2.i1746, <8 x double> undef, <8 x i32> zeroinitializer%tmp.i1748 = fmul nsz contract <8 x double> %bfactor.i1747, %9%res.i1749 = call nsz contract <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1750, <8 x double> %afactor.i1784, <8 x double> %tmp.i1748)
%.elt2175 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6413, i320%.unpack2176 = loaddouble, double* %.elt2175, align8%.unpack2178.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6413, i321, i640, i640%44 = bitcastdouble* %.unpack2178.unpack.eltto <8 x double>*
%45 = load <8 x double>, <8 x double>* %44, align8%46 = fmuldouble%.unpack2176, 1.880000e+00%res.i1743 = fmul nsz contract <8 x double> %45, <double1.880000e+00, double1.880000e+00, double1.880000e+00, double1.880000e+00, double1.880000e+00, double1.880000e+00, double1.880000e+00, double1.880000e+00>
%47 = fmuldouble%.unpack, 1.630000e+04%res.i1742 = fmul nsz contract <8 x double> %6, <double1.630000e+04, double1.630000e+04, double1.630000e+04, double1.630000e+04, double1.630000e+04, double1.630000e+04, double1.630000e+04, double1.630000e+04>
%48 = fmuldouble%47, %.unpack1956%el2.i1738 = insertelement <8 x double> undef, double%47, i320%bfactor.i1739 = shufflevector <8 x double> %el2.i1738, <8 x double> undef, <8 x i32> zeroinitializer%tmp.i1740 = fmul nsz contract <8 x double> %bfactor.i1739, %23%res.i1741 = call nsz contract <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1742, <8 x double> %afactor.i1775, <8 x double> %tmp.i1740)
%.elt2235 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i642, i320%.unpack2236 = loaddouble, double* %.elt2235, align8%.unpack2238.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i642, i321, i640, i640%49 = bitcastdouble* %.unpack2238.unpack.eltto <8 x double>*
%50 = load <8 x double>, <8 x double>* %49, align8%51 = fmuldouble%.unpack2236, 4.800000e+06%res.i1735 = fmul nsz contract <8 x double> %50, <double4.800000e+06, double4.800000e+06, double4.800000e+06, double4.800000e+06, double4.800000e+06, double4.800000e+06, double4.800000e+06, double4.800000e+06>
%52 = fmuldouble%.unpack1836, 3.500000e-04%res.i1734 = fmul nsz contract <8 x double> %11, <double3.500000e-04, double3.500000e-04, double3.500000e-04, double3.500000e-04, double3.500000e-04, double3.500000e-04, double3.500000e-04, double3.500000e-04>
%53 = fmuldouble%.unpack1836, 1.750000e-02%res.i1733 = fmul nsz contract <8 x double> %11, <double1.750000e-02, double1.750000e-02, double1.750000e-02, double1.750000e-02, double1.750000e-02, double1.750000e-02, double1.750000e-02, double1.750000e-02>
%.elt2295 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6415, i320%.unpack2296 = loaddouble, double* %.elt2295, align8%.unpack2298.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6415, i321, i640, i640%54 = bitcastdouble* %.unpack2298.unpack.eltto <8 x double>*
%55 = load <8 x double>, <8 x double>* %54, align8%56 = fmuldouble%.unpack2296, 1.000000e+08%res.i1732 = fmul nsz contract <8 x double> %55, <double1.000000e+08, double1.000000e+08, double1.000000e+08, double1.000000e+08, double1.000000e+08, double1.000000e+08, double1.000000e+08, double1.000000e+08>
%57 = fmuldouble%.unpack2296, 4.440000e+11%res.i1731 = fmul nsz contract <8 x double> %55, <double4.440000e+11, double4.440000e+11, double4.440000e+11, double4.440000e+11, double4.440000e+11, double4.440000e+11, double4.440000e+11, double4.440000e+11>
%.elt2335 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6416, i320%.unpack2336 = loaddouble, double* %.elt2335, align8%.unpack2338.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6416, i321, i640, i640%58 = bitcastdouble* %.unpack2338.unpack.eltto <8 x double>*
%59 = load <8 x double>, <8 x double>* %58, align8%60 = fmuldouble%.unpack2336, 1.240000e+03%res.i1730 = fmul nsz contract <8 x double> %59, <double1.240000e+03, double1.240000e+03, double1.240000e+03, double1.240000e+03, double1.240000e+03, double1.240000e+03, double1.240000e+03, double1.240000e+03>
%61 = fmuldouble%60, %.unpack1956%el2.i1726 = insertelement <8 x double> undef, double%60, i320%bfactor.i1727 = shufflevector <8 x double> %el2.i1726, <8 x double> undef, <8 x i32> zeroinitializer%tmp.i1728 = fmul nsz contract <8 x double> %bfactor.i1727, %23%res.i1729 = call nsz contract <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1730, <8 x double> %afactor.i1775, <8 x double> %tmp.i1728)
%.elt2375 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6418, i320%.unpack2376 = loaddouble, double* %.elt2375, align8%.unpack2378.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6418, i321, i640, i640%62 = bitcastdouble* %.unpack2378.unpack.eltto <8 x double>*
%63 = load <8 x double>, <8 x double>* %62, align8%64 = fmuldouble%.unpack2376, 2.100000e+00%res.i1723 = fmul nsz contract <8 x double> %63, <double2.100000e+00, double2.100000e+00, double2.100000e+00, double2.100000e+00, double2.100000e+00, double2.100000e+00, double2.100000e+00, double2.100000e+00>
%65 = fmuldouble%.unpack2376, 5.780000e+00%res.i1722 = fmul nsz contract <8 x double> %63, <double5.780000e+00, double5.780000e+00, double5.780000e+00, double5.780000e+00, double5.780000e+00, double5.780000e+00, double5.780000e+00, double5.780000e+00>
%66 = fmuldouble%.unpack, 4.740000e-02%res.i1721 = fmul nsz contract <8 x double> %6, <double4.740000e-02, double4.740000e-02, double4.740000e-02, double4.740000e-02, double4.740000e-02, double4.740000e-02, double4.740000e-02, double4.740000e-02>
%67 = fmuldouble%66, %.unpack1836%el2.i1717 = insertelement <8 x double> undef, double%66, i320%bfactor.i1718 = shufflevector <8 x double> %el2.i1717, <8 x double> undef, <8 x i32> zeroinitializer%tmp.i1719 = fmul nsz contract <8 x double> %bfactor.i1718, %11%res.i1720 = call nsz contract <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1721, <8 x double> %afactor.i1791, <8 x double> %tmp.i1719)
%68 = fmuldouble%.unpack2376, 1.780000e+03%res.i1714 = fmul nsz contract <8 x double> %63, <double1.780000e+03, double1.780000e+03, double1.780000e+03, double1.780000e+03, double1.780000e+03, double1.780000e+03, double1.780000e+03, double1.780000e+03>
%69 = fmuldouble%68, %.unpack%el2.i = insertelement <8 x double> undef, double%68, i320%bfactor.i = shufflevector <8 x double> %el2.i, <8 x double> undef, <8 x i32> zeroinitializer%tmp.i = fmul nsz contract <8 x double> %bfactor.i, %6%res.i1713 = call nsz contract <8 x double> @llvm.fmuladd.v8f64(<8 x double> %res.i1714, <8 x double> %afactor.i1753, <8 x double> %tmp.i)
%.elt2495 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6419, i320%.unpack2496 = loaddouble, double* %.elt2495, align8%.unpack2498.unpack.elt = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %4, i6419, i321, i640, i640%70 = bitcastdouble* %.unpack2498.unpack.eltto <8 x double>*
%71 = load <8 x double>, <8 x double>* %70, align8%72 = fmuldouble%.unpack2496, 3.120000e+00%res.i1712 = fmul nsz contract <8 x double> %71, <double3.120000e+00, double3.120000e+00, double3.120000e+00, double3.120000e+00, double3.120000e+00, double3.120000e+00, double3.120000e+00, double3.120000e+00>
%73 = fneg double%7%74 = fsubdouble%73, %36%75 = fadd nsz contract <8 x double> %res.i, %res.i1757%76 = fsubdouble%74, %48%77 = fadd nsz contract <8 x double> %75, %res.i1741%78 = fsubdouble%76, %67%79 = fadd nsz contract <8 x double> %77, %res.i1720%80 = fsubdouble%78, %69%81 = fadd nsz contract <8 x double> %79, %res.i1713%82 = fadddouble%13, %80%res.i1706 = fsub nsz contract <8 x double> %res.i1795, %81%83 = fadddouble%17, %82%res.i1705 = fadd nsz contract <8 x double> %res.i1788, %res.i1706%84 = fadddouble%34, %83%res.i1704 = fadd nsz contract <8 x double> %res.i1764, %res.i1705%85 = fadddouble%39, %84%res.i1703 = fadd nsz contract <8 x double> %res.i1751, %res.i1704%86 = fadddouble%43, %85%res.i1702 = fadd nsz contract <8 x double> %res.i1749, %res.i1703%87 = fadddouble%65, %86%res.i1701 = fadd nsz contract <8 x double> %res.i1722, %res.i1702%88 = fadddouble%87, %72%res.i1700 = fadd nsz contract <8 x double> %res.i1701, %res.i1712%89 = bitcast {}* %0to { double, [1 x [8 x double]] }**
%90 = load { double, [1 x [8 x double]] }*, { double, [1 x [8 x double]] }** %89, align8%.repack = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i640, i320storedouble%88, double* %.repack, align8%91 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i640, i321, i640%92 = bitcast [8 x double]* %91to <8 x double>*
store <8 x double> %res.i1700, <8 x double>* %92, align8%93 = fneg double%13%94 = fsubdouble%93, %17%95 = fadd nsz contract <8 x double> %res.i1795, %res.i1788%96 = fsubdouble%94, %34%97 = fadd nsz contract <8 x double> %95, %res.i1764%98 = fsubdouble%96, %43%99 = fadd nsz contract <8 x double> %97, %res.i1749%100 = fadddouble%7, %98%res.i1695 = fsub nsz contract <8 x double> %res.i, %99%101 = fadddouble%100, %64%res.i1694 = fadd nsz contract <8 x double> %res.i1695, %res.i1723%.repack2517 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i641, i320storedouble%101, double* %.repack2517, align8%102 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i641, i321, i640%103 = bitcast [8 x double]* %102to <8 x double>*
store <8 x double> %res.i1694, <8 x double>* %103, align8%104 = fsubdouble%7, %51%res.i1692 = fsub nsz contract <8 x double> %res.i, %res.i1735%105 = fadddouble%104, %53%res.i1691 = fadd nsz contract <8 x double> %res.i1692, %res.i1733%106 = fadddouble%105, %57%res.i1690 = fadd nsz contract <8 x double> %res.i1691, %res.i1731%107 = fadddouble%106, %65%res.i1689 = fadd nsz contract <8 x double> %res.i1690, %res.i1722%.repack2520 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i642, i320storedouble%107, double* %.repack2520, align8%108 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i642, i321, i640%109 = bitcast [8 x double]* %108to <8 x double>*
store <8 x double> %res.i1689, <8 x double>* %109, align8%110 = fsubdouble%93, %52%111 = fadd nsz contract <8 x double> %res.i1795, %res.i1734%112 = fsubdouble%110, %53%113 = fadd nsz contract <8 x double> %111, %res.i1733%114 = fsubdouble%112, %67%115 = fadd nsz contract <8 x double> %113, %res.i1720%116 = fadddouble%51, %114%res.i1684 = fsub nsz contract <8 x double> %res.i1735, %115%.repack2523 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i643, i320storedouble%116, double* %.repack2523, align8%117 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i643, i321, i640%118 = bitcast [8 x double]* %117to <8 x double>*
store <8 x double> %res.i1684, <8 x double>* %118, align8%119 = fsubdouble%20, %17%res.i1682 = fsub nsz contract <8 x double> %res.i1782, %res.i1788%120 = fadddouble%20, %119%res.i1681 = fadd nsz contract <8 x double> %res.i1782, %res.i1682%121 = fadddouble%120, %25%res.i1680 = fadd nsz contract <8 x double> %res.i1681, %res.i1779%122 = fadddouble%121, %28%res.i1679 = fadd nsz contract <8 x double> %res.i1680, %res.i1773%123 = fadddouble%122, %46%res.i1678 = fadd nsz contract <8 x double> %res.i1679, %res.i1743%124 = fadddouble%123, %61%res.i1677 = fadd nsz contract <8 x double> %res.i1678, %res.i1729%.repack2526 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i644, i320storedouble%124, double* %.repack2526, align8%125 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i644, i321, i640%126 = bitcast [8 x double]* %125to <8 x double>*
store <8 x double> %res.i1677, <8 x double>* %126, align8%127 = fneg double%25%128 = fsubdouble%127, %30%129 = fadd nsz contract <8 x double> %res.i1779, %res.i1771%130 = fsubdouble%128, %48%131 = fadd nsz contract <8 x double> %129, %res.i1741%132 = fsubdouble%130, %61%133 = fadd nsz contract <8 x double> %131, %res.i1729%134 = fadddouble%17, %132%res.i1672 = fsub nsz contract <8 x double> %res.i1788, %133%135 = fadddouble%56, %134%res.i1671 = fadd nsz contract <8 x double> %res.i1732, %res.i1672%136 = fadddouble%56, %135%res.i1670 = fadd nsz contract <8 x double> %res.i1732, %res.i1671%.repack2529 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i645, i320storedouble%136, double* %.repack2529, align8%137 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i645, i321, i640%138 = bitcast [8 x double]* %137to <8 x double>*
store <8 x double> %res.i1670, <8 x double>* %138, align8%139 = fneg double%20%140 = fsubdouble%139, %21%141 = fadd nsz contract <8 x double> %res.i1782, %res.i1781%142 = fsubdouble%140, %25%143 = fadd nsz contract <8 x double> %141, %res.i1779%144 = fadddouble%142, %46%res.i1666 = fsub nsz contract <8 x double> %res.i1743, %143%.repack2532 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i646, i320storedouble%144, double* %.repack2532, align8%145 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i646, i321, i640%146 = bitcast [8 x double]* %145to <8 x double>*
store <8 x double> %res.i1666, <8 x double>* %146, align8%147 = fadddouble%20, %21%148 = fadddouble%147, %25%149 = fadddouble%148, %28%res.i1663 = fadd nsz contract <8 x double> %143, %res.i1773%.repack2535 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i647, i320storedouble%149, double* %.repack2535, align8%150 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %90, i647, i321, i640%151 = bitcast [8 x double]* %150to <8 x double>*
store <8 x double> %res.i1663, <8 x double>* %151, align8%152 = fneg double%28%153 = fsubdouble%152, %30%154 = fadd nsz contract <8 x double> %res.i1773, %res.i1771%res.i1661 = fneg nsz contract <8 x double> %154%155 = load { double, [1 x [8 x double]] }*, { double, [1 x [8 x double]] }** %89, align8%.repack2538 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i648, i320storedouble%153, double* %.repack2538, align8%156 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i648, i321, i640%157 = bitcast [8 x double]* %156to <8 x double>*
store <8 x double> %res.i1661, <8 x double>* %157, align8%158 = fsubdouble%28, %43%res.i1659 = fsub nsz contract <8 x double> %res.i1773, %res.i1749%159 = fadddouble%34, %158%res.i1658 = fadd nsz contract <8 x double> %res.i1764, %res.i1659%.repack2541 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i649, i320storedouble%159, double* %.repack2541, align8%160 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i649, i321, i640%161 = bitcast [8 x double]* %160to <8 x double>*
store <8 x double> %res.i1658, <8 x double>* %161, align8%162 = fneg double%34%163 = fsubdouble%162, %36%164 = fadd nsz contract <8 x double> %res.i1764, %res.i1757%165 = fadddouble%30, %163%res.i1655 = fsub nsz contract <8 x double> %res.i1771, %164%166 = fadddouble%165, %39%res.i1654 = fadd nsz contract <8 x double> %res.i1655, %res.i1751%.repack2544 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6410, i320storedouble%166, double* %.repack2544, align8%167 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6410, i321, i640%168 = bitcast [8 x double]* %167to <8 x double>*
store <8 x double> %res.i1654, <8 x double>* %168, align8%.repack2547 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6411, i320storedouble%34, double* %.repack2547, align8%169 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6411, i321, i640%170 = bitcast [8 x double]* %169to <8 x double>*
store <8 x double> %res.i1764, <8 x double>* %170, align8%171 = fsubdouble%36, %39%res.i1652 = fsub nsz contract <8 x double> %res.i1757, %res.i1751%.repack2550 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6412, i320storedouble%171, double* %.repack2550, align8%172 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6412, i321, i640%173 = bitcast [8 x double]* %172to <8 x double>*
store <8 x double> %res.i1652, <8 x double>* %173, align8%174 = fsubdouble%43, %46%res.i1650 = fsub nsz contract <8 x double> %res.i1749, %res.i1743%.repack2553 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6413, i320storedouble%174, double* %.repack2553, align8%175 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6413, i321, i640%176 = bitcast [8 x double]* %175to <8 x double>*
store <8 x double> %res.i1650, <8 x double>* %176, align8%.repack2556 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6414, i320storedouble%48, double* %.repack2556, align8%177 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6414, i321, i640%178 = bitcast [8 x double]* %177to <8 x double>*
store <8 x double> %res.i1741, <8 x double>* %178, align8%179 = fneg double%56%180 = fsubdouble%179, %57%181 = fadd nsz contract <8 x double> %res.i1732, %res.i1731%182 = fadddouble%52, %180%res.i1647 = fsub nsz contract <8 x double> %res.i1734, %181%.repack2559 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6415, i320storedouble%182, double* %.repack2559, align8%183 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6415, i321, i640%184 = bitcast [8 x double]* %183to <8 x double>*
store <8 x double> %res.i1647, <8 x double>* %184, align8%185 = fneg double%61%res.i1646 = fneg nsz contract <8 x double> %res.i1729%.repack2562 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6416, i320storedouble%185, double* %.repack2562, align8%186 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6416, i321, i640%187 = bitcast [8 x double]* %186to <8 x double>*
store <8 x double> %res.i1646, <8 x double>* %187, align8%.repack2565 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6417, i320storedouble%61, double* %.repack2565, align8%188 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6417, i321, i640%189 = bitcast [8 x double]* %188to <8 x double>*
store <8 x double> %res.i1729, <8 x double>* %189, align8%190 = fneg double%64%191 = fsubdouble%190, %65%192 = fadd nsz contract <8 x double> %res.i1723, %res.i1722%193 = fsubdouble%191, %69%194 = fadd nsz contract <8 x double> %192, %res.i1713%195 = fadddouble%67, %193%res.i1642 = fsub nsz contract <8 x double> %res.i1720, %194%196 = fadddouble%195, %72%res.i1641 = fadd nsz contract <8 x double> %res.i1642, %res.i1712%.repack2568 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6418, i320storedouble%196, double* %.repack2568, align8%197 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6418, i321, i640%198 = bitcast [8 x double]* %197to <8 x double>*
store <8 x double> %res.i1641, <8 x double>* %198, align8%199 = fsubdouble%69, %72%res.i1639 = fsub nsz contract <8 x double> %res.i1713, %res.i1712%.repack2571 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6419, i320storedouble%199, double* %.repack2571, align8%200 = getelementptrinbounds { double, [1 x [8 x double]] }, { double, [1 x [8 x double]] }* %155, i6419, i321, i640%201 = bitcast [8 x double]* %200to <8 x double>*
store <8 x double> %res.i1639, <8 x double>* %201, align8retvoid
}

There are many more named variables (instead of just #%) on this PR.

@chriselrod

Copy link
Copy Markdown
Contributor

The difference is large when the chunk sizes are not a power of 2.
Try using Chunk(7) instead of Chunk(8), like in the example.

@KristofferC

Copy link
Copy Markdown
CollaboratorAuthor

On this PR there are a bunch of nsz contract fastmath flags on the operations? Any idea where those come from?

@KristofferC

Copy link
Copy Markdown
CollaboratorAuthor

Try using Chunk(7) instead of Chunk(8), like in the example.

How do you measure this? Just so we do the same.

@chriselrod

Copy link
Copy Markdown
Contributor

You can test by using this in the script:

cfg = ForwardDiff.JacobianConfig(f!, du, u0, ForwardDiff.Chunk(5));
@time ForwardDiff.jacobian!(J, f!, du, u0, cfg);
@btime ForwardDiff.jacobian!($J, $f!, $du, $u0, $cfg);

I tested at a few different sizes, and at the very least, it did not seem to have a beneficial impact on runtime or compile time performance at the chunk sizes I tested (even though I naively thought the llvm looked better at a glance).

@KristofferC

Copy link
Copy Markdown
CollaboratorAuthor

I meant how you measure the number of instructions. Are you using Cthulhu to step in or just directly calling the function with dual numbers?

@chriselrod

chriselrod commented Nov 22, 2021

Copy link
Copy Markdown
Contributor

Sorry, I apparently switched ForwardDiff commits in between my comments from 5 and 1 hour ago.
Now that I've checked out this commit again, I see a roughly >2x performance improvement; master:

julia>@time ForwardDiff.jacobian!(J, f!, du, u0, cfg);
0.861934 seconds (4.71 M allocations:253.155 MiB, 8.06% gc time, 99.99% compilation time)
julia>@btime ForwardDiff.jacobian!($J, $f!, $du, $u0, $cfg);
2.163 μs (0 allocations:0 bytes)

this PR:

julia>@time ForwardDiff.jacobian!(J, f!, du, u0, cfg);
0.728831 seconds (3.94 M allocations:221.083 MiB, 9.85% gc time, 99.99% compilation time)
julia>@btime ForwardDiff.jacobian!($J, $f!, $du, $u0, $cfg);
1.164 μs (0 allocations:0 bytes)

Lines of llvm are 723 vs 396 for me.
Master has a lot of instances like

%93 = fmuldouble%.unpack1561, 0x3F4C2E33EFF19503%94 = extractelement <4 x double> %90, i320%95 = insertelement <7 x double> undef, double%94, i320%96 = extractelement <4 x double> %90, i321%97 = insertelement <7 x double> %95, double%96, i321%98 = extractelement <4 x double> %90, i322%99 = insertelement <7 x double> %97, double%98, i322%100 = extractelement <4 x double> %90, i323%101 = insertelement <7 x double> %99, double%100, i323%102 = extractelement <2 x double> %92, i320%103 = insertelement <7 x double> %101, double%102, i324%104 = extractelement <2 x double> %92, i321%105 = insertelement <7 x double> %103, double%104, i325%106 = insertelement <7 x double> %105, double%.unpack1563.unpack.unpack1576, i326

The actual assembly doesn't look nearly so bad, and uiCA predicts a much smaller difference than I observe:
master
PR

I meant how you measure the number of instructions. Are you using Cthulhu to step in or just directly calling the function with dual numbers?

Cthulhu. To count the number of lines, I copy/pasted into an editor.

EDIT:
I've only been looking at the vector mode jacobian code, but it's executing the chunk-mode Jacobian, so of course my benchmarks won't follow necessarily follow the difference in assembly or llvm. But it should only matter for the remainder (as it'd still be rhs! being called on the full chunk size).

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@KristofferC@chriselrod