Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

LLVM to MLIR Conversion Error #121965

Closed
wsmoses opened this issue Jan 7, 2025 · 12 comments
Closed

LLVM to MLIR Conversion Error #121965

wsmoses opened this issue Jan 7, 2025 · 12 comments
Assignees

Comments

@wsmoses
Copy link
Member

wsmoses commented Jan 7, 2025

Unsupported alias scope node: !7 = !{!"jnoalias_const", !8}

@llvmbot llvmbot added the mlir label Jan 7, 2025
@wsmoses
Copy link
Member Author

wsmoses commented Jan 7, 2025

cc @ftynse @mofeing @vchuravy

@llvmbot
Copy link
Member

llvmbot commented Jan 7, 2025

@llvm/issue-subscribers-mlir

Author: William Moses (wsmoses)

Unsupported alias scope node: `!7 = !{!"jnoalias_const", !8}`

@wsmoses
Copy link
Member Author

wsmoses commented Jan 7, 2025

unsupported alias scope node: !7 = !{!"jnoalias_const", !8}
; ModuleID = 'start'
source_filename = "start"
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-n16:32:64"
target triple = "nvptx64-nvidia-cuda"

; Function Attrs: cold nounwind
declare void @llvm.trap() #0

declare nonnull {}* @ijl_apply_generic({}*, {}** noalias nocapture noundef readonly, i32)

declare nonnull {}* @ijl_box_int64(i64 signext) local_unnamed_addr

; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
declare i32 @llvm.nvvm.read.ptx.sreg.ctaid.x() #1

; Function Attrs: nocallback nofree nosync nounwind readnone speculatable willreturn
declare i32 @llvm.nvvm.read.ptx.sreg.tid.x() #1

define ptx_kernel void @_Z30gpu__fill_bottom_and_top_halo_16CompilerMetadataI16OffsetStaticSizeI12_1_20__1_20_E12DynamicCheckvv7NDRangeILl2E10StaticSizeI6_2__2_ES3_I8_16__16_E5TupleI5Int64S5_E13KernelOffsetsIS4_IS5_S5_EEEES4_I11OffsetArrayI7Float64Ll3E13CuTracedArrayIS8_Ll3ELl1E12_35__34__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__35__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__16_EEES4_I17BoundaryConditionI4FluxvES10_IS11_vES10_IS11_vES10_IS11_vEES4_IS10_IS11_vES10_IS11_vES10_IS11_vES10_IS11_5FieldI6CenterS13_vvvvS7_IS8_Ll3ES9_IS8_Ll3ELl1E11_34__34__1_EES8_vvvEEES4_IS4_I4FaceS13_S13_ES4_IS13_S14_S13_ES4_IS13_S13_S13_ES4_IS13_S13_S13_EE21LatitudeLongitudeGridIS8_7BoundedS16_S16_24StaticVerticalCoordinateIS7_IS8_Ll1ES9_IS8_Ll1ELl1E5_17__EES7_IS8_Ll1ES9_IS8_Ll1ELl1E5_16__EES7_IS8_Ll1ES9_IS8_Ll1ELl1E5_17__EES7_IS8_Ll1ES9_IS8_Ll1ELl1E5_16__EEES7_IS8_Ll1ES9_IS8_Ll1ELl1E5_34__EES8_S8_S8_S7_IS8_Ll1E12StepRangeLenIS8_14TwicePrecisionIS8_ES19_IS8_ES5_EES7_IS8_Ll1ES18_IS8_S19_IS8_ES19_IS8_ES5_EEvES4_I10NamedTupleI53__time___last__t___last_stage__t___iteration___stage_S4_IS8_S8_S8_S5_S5_EES20_I32__u___v___w_______U___V___b___c_S4_IS7_IS8_Ll3ES9_IS8_Ll3ELl1E12_35__34__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__35__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__17_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E11_34__34__1_EES12_IS14_S13_vvvvS7_IS8_Ll3ES9_IS8_Ll3ELl1E11_35__34__1_EES8_vvvES12_IS13_S14_vvvvS7_IS8_Ll3ES9_IS8_Ll3ELl1E11_34__35__1_EES8_vvvES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__16_EEEEE({ { [2 x i64], [1 x [2 x i64]] } } %0, [4 x { [1 x i8 addrspace(1)*], [3 x i64] }] %1, { { { { [1 x i8 addrspace(1)*], [3 x i64] } } } } %2, { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, { { double, double, double, i64, i64 }, { { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] } } } %4) local_unnamed_addr {
conversion:
  %5 = alloca [8 x {}*], align 8
  %6 = extractvalue { { [2 x i64], [1 x [2 x i64]] } } %0, 0
  %.elt2 = extractvalue { [2 x i64], [1 x [2 x i64]] } %6, 1
  %7 = extractvalue [1 x [2 x i64]] %.elt2, 0
  %.elt5 = extractvalue [2 x i64] %7, 0
  %.elt7 = extractvalue [2 x i64] %7, 1
  %8 = call i32 @llvm.nvvm.read.ptx.sreg.tid.x(), !range !4
  %9 = call i32 @llvm.nvvm.read.ptx.sreg.ctaid.x(), !range !5
  %10 = zext i32 %9 to i64
  %11 = zext i32 %8 to i64
  %12 = lshr i64 %11, 4
  %13 = and i64 %11, 15
  %14 = add nuw nsw i64 %13, 1
  %15 = add nuw nsw i64 %12, 1
  %16 = shl nuw nsw i64 %10, 4
  %17 = and i64 %16, 16
  %18 = add nuw nsw i64 %14, %17
  %19 = add i64 %18, %.elt5
  %20 = add i64 %19, -21
  %21 = icmp ult i64 %20, -20
  %22 = shl nuw nsw i64 %10, 3
  %23 = and i64 %22, 17179869168
  %24 = add nuw nsw i64 %15, %23
  %25 = add i64 %24, %.elt7
  %26 = add i64 %25, -21
  %27 = icmp ult i64 %26, -20
  %28 = or i1 %21, %27
  br i1 %28, label %L324, label %pass10

L324:                                             ; preds = %conversion
  ret void

pass10:                                           ; preds = %conversion
  %.sub = getelementptr inbounds [8 x {}*], [8 x {}*]* %5, i64 0, i64 0
  %.elt183 = extractvalue { { double, double, double, i64, i64 }, { { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] } } } %4, 1
  %.elt183.elt205 = extractvalue { { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] } } %.elt183, 7
  %.elt183.elt205.elt253 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt183.elt205, 1
  %.elt183.elt205.elt253.elt257 = extractvalue [3 x i64] %.elt183.elt205.elt253, 2
  %.elt183.elt205.elt253.elt255 = extractvalue [3 x i64] %.elt183.elt205.elt253, 1
  %.elt183.elt205.elt253.elt = extractvalue [3 x i64] %.elt183.elt205.elt253, 0
  %.elt183.elt205.elt = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt183.elt205, 0
  %29 = extractvalue [1 x i8 addrspace(1)*] %.elt183.elt205.elt, 0
  %.elt183.elt203 = extractvalue { { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] } } %.elt183, 6
  %.elt183.elt203.elt247 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt183.elt203, 1
  %.elt183.elt203.elt247.elt251 = extractvalue [3 x i64] %.elt183.elt203.elt247, 2
  %.elt183.elt203.elt247.elt249 = extractvalue [3 x i64] %.elt183.elt203.elt247, 1
  %.elt183.elt203.elt247.elt = extractvalue [3 x i64] %.elt183.elt203.elt247, 0
  %.elt183.elt203.elt = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt183.elt203, 0
  %30 = extractvalue [1 x i8 addrspace(1)*] %.elt183.elt203.elt, 0
  %.elt183.elt201 = extractvalue { { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] } } %.elt183, 5
  %31 = extractvalue { { [1 x i8 addrspace(1)*], [3 x i64] } } %.elt183.elt201, 0
  %.elt241 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %31, 1
  %.elt241.elt245 = extractvalue [3 x i64] %.elt241, 2
  %.elt241.elt243 = extractvalue [3 x i64] %.elt241, 1
  %.elt241.elt = extractvalue [3 x i64] %.elt241, 0
  %.elt239 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %31, 0
  %32 = extractvalue [1 x i8 addrspace(1)*] %.elt239, 0
  %.elt183.elt199 = extractvalue { { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] } } %.elt183, 4
  %33 = extractvalue { { [1 x i8 addrspace(1)*], [3 x i64] } } %.elt183.elt199, 0
  %.elt233 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %33, 1
  %.elt233.elt237 = extractvalue [3 x i64] %.elt233, 2
  %.elt233.elt235 = extractvalue [3 x i64] %.elt233, 1
  %.elt233.elt = extractvalue [3 x i64] %.elt233, 0
  %.elt231 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %33, 0
  %34 = extractvalue [1 x i8 addrspace(1)*] %.elt231, 0
  %.elt183.elt197 = extractvalue { { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] } } %.elt183, 3
  %.elt183.elt197.elt225 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt183.elt197, 1
  %.elt183.elt197.elt225.elt229 = extractvalue [3 x i64] %.elt183.elt197.elt225, 2
  %.elt183.elt197.elt225.elt227 = extractvalue [3 x i64] %.elt183.elt197.elt225, 1
  %.elt183.elt197.elt225.elt = extractvalue [3 x i64] %.elt183.elt197.elt225, 0
  %.elt183.elt197.elt = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt183.elt197, 0
  %35 = extractvalue [1 x i8 addrspace(1)*] %.elt183.elt197.elt, 0
  %.elt183.elt195 = extractvalue { { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] } } %.elt183, 2
  %.elt183.elt195.elt219 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt183.elt195, 1
  %.elt183.elt195.elt219.elt223 = extractvalue [3 x i64] %.elt183.elt195.elt219, 2
  %.elt183.elt195.elt219.elt221 = extractvalue [3 x i64] %.elt183.elt195.elt219, 1
  %.elt183.elt195.elt219.elt = extractvalue [3 x i64] %.elt183.elt195.elt219, 0
  %.elt183.elt195.elt = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt183.elt195, 0
  %36 = extractvalue [1 x i8 addrspace(1)*] %.elt183.elt195.elt, 0
  %.elt183.elt193 = extractvalue { { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] } } %.elt183, 1
  %.elt183.elt193.elt213 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt183.elt193, 1
  %.elt183.elt193.elt213.elt217 = extractvalue [3 x i64] %.elt183.elt193.elt213, 2
  %.elt183.elt193.elt213.elt215 = extractvalue [3 x i64] %.elt183.elt193.elt213, 1
  %.elt183.elt193.elt213.elt = extractvalue [3 x i64] %.elt183.elt193.elt213, 0
  %.elt183.elt193.elt = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt183.elt193, 0
  %37 = extractvalue [1 x i8 addrspace(1)*] %.elt183.elt193.elt, 0
  %.elt183.elt = extractvalue { { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] } } %.elt183, 0
  %.elt183.elt.elt207 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt183.elt, 1
  %.elt183.elt.elt207.elt211 = extractvalue [3 x i64] %.elt183.elt.elt207, 2
  %.elt183.elt.elt207.elt209 = extractvalue [3 x i64] %.elt183.elt.elt207, 1
  %.elt183.elt.elt207.elt = extractvalue [3 x i64] %.elt183.elt.elt207, 0
  %.elt183.elt.elt = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt183.elt, 0
  %38 = extractvalue [1 x i8 addrspace(1)*] %.elt183.elt.elt, 0
  %.elt181 = extractvalue { { double, double, double, i64, i64 }, { { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] } } } %4, 0
  %.elt181.elt191 = extractvalue { double, double, double, i64, i64 } %.elt181, 4
  %.elt181.elt189 = extractvalue { double, double, double, i64, i64 } %.elt181, 3
  %.elt181.elt187 = extractvalue { double, double, double, i64, i64 } %.elt181, 2
  %.elt181.elt185 = extractvalue { double, double, double, i64, i64 } %.elt181, 1
  %.elt181.elt = extractvalue { double, double, double, i64, i64 } %.elt181, 0
  %.elt101 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 28
  %.elt99 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 27
  %.elt99.elt179 = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt99, 1
  %39 = extractvalue [1 x i64] %.elt99.elt179, 0
  %.elt99.elt = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt99, 0
  %40 = extractvalue [1 x i8 addrspace(1)*] %.elt99.elt, 0
  %.elt97 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 26
  %.elt97.elt177 = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt97, 1
  %41 = extractvalue [1 x i64] %.elt97.elt177, 0
  %.elt97.elt = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt97, 0
  %42 = extractvalue [1 x i8 addrspace(1)*] %.elt97.elt, 0
  %.elt95 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 25
  %.elt95.elt175 = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt95, 1
  %43 = extractvalue [1 x i64] %.elt95.elt175, 0
  %.elt95.elt = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt95, 0
  %44 = extractvalue [1 x i8 addrspace(1)*] %.elt95.elt, 0
  %.elt93 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 24
  %.elt93.elt173 = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt93, 1
  %45 = extractvalue [1 x i64] %.elt93.elt173, 0
  %.elt93.elt = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt93, 0
  %46 = extractvalue [1 x i8 addrspace(1)*] %.elt93.elt, 0
  %.elt91 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 23
  %.elt89 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 22
  %.elt87 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 21
  %.elt87.elt171 = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt87, 1
  %47 = extractvalue [1 x i64] %.elt87.elt171, 0
  %.elt87.elt = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt87, 0
  %48 = extractvalue [1 x i8 addrspace(1)*] %.elt87.elt, 0
  %.elt85 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 20
  %.elt85.elt169 = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt85, 1
  %49 = extractvalue [1 x i64] %.elt85.elt169, 0
  %.elt85.elt = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt85, 0
  %50 = extractvalue [1 x i8 addrspace(1)*] %.elt85.elt, 0
  %.elt83 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 19
  %.elt83.elt167 = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt83, 1
  %51 = extractvalue [1 x i64] %.elt83.elt167, 0
  %.elt83.elt = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt83, 0
  %52 = extractvalue [1 x i8 addrspace(1)*] %.elt83.elt, 0
  %.elt81 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 18
  %.elt81.elt165 = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt81, 1
  %53 = extractvalue [1 x i64] %.elt81.elt165, 0
  %.elt81.elt = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt81, 0
  %54 = extractvalue [1 x i8 addrspace(1)*] %.elt81.elt, 0
  %.elt79 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 17
  %.elt79.elt155 = extractvalue [4 x { [1 x i8 addrspace(1)*], [1 x i64] }] %.elt79, 3
  %.elt79.elt155.elt163 = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt79.elt155, 1
  %55 = extractvalue [1 x i64] %.elt79.elt155.elt163, 0
  %.elt79.elt155.elt = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt79.elt155, 0
  %56 = extractvalue [1 x i8 addrspace(1)*] %.elt79.elt155.elt, 0
  %.elt79.elt153 = extractvalue [4 x { [1 x i8 addrspace(1)*], [1 x i64] }] %.elt79, 2
  %.elt79.elt153.elt161 = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt79.elt153, 1
  %57 = extractvalue [1 x i64] %.elt79.elt153.elt161, 0
  %.elt79.elt153.elt = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt79.elt153, 0
  %58 = extractvalue [1 x i8 addrspace(1)*] %.elt79.elt153.elt, 0
  %.elt79.elt151 = extractvalue [4 x { [1 x i8 addrspace(1)*], [1 x i64] }] %.elt79, 1
  %.elt79.elt151.elt159 = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt79.elt151, 1
  %59 = extractvalue [1 x i64] %.elt79.elt151.elt159, 0
  %.elt79.elt151.elt = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt79.elt151, 0
  %60 = extractvalue [1 x i8 addrspace(1)*] %.elt79.elt151.elt, 0
  %.elt79.elt = extractvalue [4 x { [1 x i8 addrspace(1)*], [1 x i64] }] %.elt79, 0
  %.elt79.elt.elt157 = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt79.elt, 1
  %61 = extractvalue [1 x i64] %.elt79.elt.elt157, 0
  %.elt79.elt.elt = extractvalue { [1 x i8 addrspace(1)*], [1 x i64] } %.elt79.elt, 0
  %62 = extractvalue [1 x i8 addrspace(1)*] %.elt79.elt.elt, 0
  %.elt77 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 16
  %.elt77.elt139 = extractvalue { { [2 x double], [2 x double], i64, i64 }, [1 x i64] } %.elt77, 1
  %63 = extractvalue [1 x i64] %.elt77.elt139, 0
  %.elt77.elt = extractvalue { { [2 x double], [2 x double], i64, i64 }, [1 x i64] } %.elt77, 0
  %.elt77.elt.elt145 = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt77.elt, 3
  %.elt77.elt.elt143 = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt77.elt, 2
  %.elt77.elt.elt141 = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt77.elt, 1
  %.elt77.elt.elt141.elt149 = extractvalue [2 x double] %.elt77.elt.elt141, 1
  %.elt77.elt.elt141.elt = extractvalue [2 x double] %.elt77.elt.elt141, 0
  %.elt77.elt.elt = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt77.elt, 0
  %.elt77.elt.elt.elt147 = extractvalue [2 x double] %.elt77.elt.elt, 1
  %.elt77.elt.elt.elt = extractvalue [2 x double] %.elt77.elt.elt, 0
  %.elt75 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 15
  %.elt75.elt127 = extractvalue { { [2 x double], [2 x double], i64, i64 }, [1 x i64] } %.elt75, 1
  %64 = extractvalue [1 x i64] %.elt75.elt127, 0
  %.elt75.elt = extractvalue { { [2 x double], [2 x double], i64, i64 }, [1 x i64] } %.elt75, 0
  %.elt75.elt.elt133 = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt75.elt, 3
  %.elt75.elt.elt131 = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt75.elt, 2
  %.elt75.elt.elt129 = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt75.elt, 1
  %.elt75.elt.elt129.elt137 = extractvalue [2 x double] %.elt75.elt.elt129, 1
  %.elt75.elt.elt129.elt = extractvalue [2 x double] %.elt75.elt.elt129, 0
  %.elt75.elt.elt = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt75.elt, 0
  %.elt75.elt.elt.elt135 = extractvalue [2 x double] %.elt75.elt.elt, 1
  %.elt75.elt.elt.elt = extractvalue [2 x double] %.elt75.elt.elt, 0
  %.elt73 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 14
  %.elt71 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 13
  %.elt69 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 12
  %.elt69.elt115 = extractvalue { { [2 x double], [2 x double], i64, i64 }, [1 x i64] } %.elt69, 1
  %65 = extractvalue [1 x i64] %.elt69.elt115, 0
  %.elt69.elt = extractvalue { { [2 x double], [2 x double], i64, i64 }, [1 x i64] } %.elt69, 0
  %.elt69.elt.elt121 = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt69.elt, 3
  %.elt69.elt.elt119 = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt69.elt, 2
  %.elt69.elt.elt117 = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt69.elt, 1
  %.elt69.elt.elt117.elt125 = extractvalue [2 x double] %.elt69.elt.elt117, 1
  %.elt69.elt.elt117.elt = extractvalue [2 x double] %.elt69.elt.elt117, 0
  %.elt69.elt.elt = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt69.elt, 0
  %.elt69.elt.elt.elt123 = extractvalue [2 x double] %.elt69.elt.elt, 1
  %.elt69.elt.elt.elt = extractvalue [2 x double] %.elt69.elt.elt, 0
  %.elt67 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 11
  %.elt67.elt103 = extractvalue { { [2 x double], [2 x double], i64, i64 }, [1 x i64] } %.elt67, 1
  %66 = extractvalue [1 x i64] %.elt67.elt103, 0
  %.elt67.elt = extractvalue { { [2 x double], [2 x double], i64, i64 }, [1 x i64] } %.elt67, 0
  %.elt67.elt.elt109 = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt67.elt, 3
  %.elt67.elt.elt107 = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt67.elt, 2
  %.elt67.elt.elt105 = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt67.elt, 1
  %.elt67.elt.elt105.elt113 = extractvalue [2 x double] %.elt67.elt.elt105, 1
  %.elt67.elt.elt105.elt = extractvalue [2 x double] %.elt67.elt.elt105, 0
  %.elt67.elt.elt = extractvalue { [2 x double], [2 x double], i64, i64 } %.elt67.elt, 0
  %.elt67.elt.elt.elt111 = extractvalue [2 x double] %.elt67.elt.elt, 1
  %.elt67.elt.elt.elt = extractvalue [2 x double] %.elt67.elt.elt, 0
  %.elt65 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 10
  %.elt63 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 9
  %.elt61 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 8
  %.elt59 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 7
  %.elt57 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 6
  %.elt55 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 5
  %.elt53 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 4
  %.elt51 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 3
  %.elt49 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 2
  %.elt47 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 1
  %.elt45 = extractvalue { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double } %3, 0
  %.elt15 = extractvalue [4 x { [1 x i8 addrspace(1)*], [3 x i64] }] %1, 3
  %.elt15.elt39 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt15, 1
  %.elt15.elt39.elt43 = extractvalue [3 x i64] %.elt15.elt39, 2
  %.elt15.elt39.elt41 = extractvalue [3 x i64] %.elt15.elt39, 1
  %.elt15.elt39.elt = extractvalue [3 x i64] %.elt15.elt39, 0
  %.elt15.elt = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt15, 0
  %67 = extractvalue [1 x i8 addrspace(1)*] %.elt15.elt, 0
  %.elt13 = extractvalue [4 x { [1 x i8 addrspace(1)*], [3 x i64] }] %1, 2
  %.elt13.elt32 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt13, 1
  %.elt13.elt32.elt36 = extractvalue [3 x i64] %.elt13.elt32, 2
  %.elt13.elt32.elt34 = extractvalue [3 x i64] %.elt13.elt32, 1
  %.elt13.elt32.elt = extractvalue [3 x i64] %.elt13.elt32, 0
  %.elt13.elt = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt13, 0
  %68 = extractvalue [1 x i8 addrspace(1)*] %.elt13.elt, 0
  %.elt11 = extractvalue [4 x { [1 x i8 addrspace(1)*], [3 x i64] }] %1, 1
  %.elt11.elt25 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt11, 1
  %.elt11.elt25.elt29 = extractvalue [3 x i64] %.elt11.elt25, 2
  %.elt11.elt25.elt27 = extractvalue [3 x i64] %.elt11.elt25, 1
  %.elt11.elt25.elt = extractvalue [3 x i64] %.elt11.elt25, 0
  %.elt11.elt = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt11, 0
  %69 = extractvalue [1 x i8 addrspace(1)*] %.elt11.elt, 0
  %.elt9 = extractvalue [4 x { [1 x i8 addrspace(1)*], [3 x i64] }] %1, 0
  %.elt9.elt18 = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt9, 1
  %.elt9.elt18.elt22 = extractvalue [3 x i64] %.elt9.elt18, 2
  %.elt9.elt18.elt20 = extractvalue [3 x i64] %.elt9.elt18, 1
  %.elt9.elt18.elt = extractvalue [3 x i64] %.elt9.elt18, 0
  %.elt9.elt = extractvalue { [1 x i8 addrspace(1)*], [3 x i64] } %.elt9, 0
  %70 = extractvalue [1 x i8 addrspace(1)*] %.elt9.elt, 0
  %71 = call nonnull {}* @ijl_box_int64(i64 signext %19)
  %72 = call nonnull {}* @ijl_box_int64(i64 signext %25)
  %73 = call {}* @gpu_gc_pool_alloc(i64 544)
  %74 = bitcast {}* %73 to i8*
  %.sroa.0262.0..sroa_cast = bitcast {}* %73 to i64*
  store i64 %.elt45, i64* %.sroa.0262.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.2263.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 8
  %.sroa.2263.0..sroa_cast = bitcast i8* %.sroa.2263.0..sroa_idx to i64*
  store i64 %.elt47, i64* %.sroa.2263.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.3264.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 16
  %.sroa.3264.0..sroa_cast = bitcast i8* %.sroa.3264.0..sroa_idx to i64*
  store i64 %.elt49, i64* %.sroa.3264.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.4265.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 24
  %.sroa.4265.0..sroa_cast = bitcast i8* %.sroa.4265.0..sroa_idx to i64*
  store i64 %.elt51, i64* %.sroa.4265.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.5266.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 32
  %.sroa.5266.0..sroa_cast = bitcast i8* %.sroa.5266.0..sroa_idx to i64*
  store i64 %.elt53, i64* %.sroa.5266.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.6267.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 40
  %.sroa.6267.0..sroa_cast = bitcast i8* %.sroa.6267.0..sroa_idx to i64*
  store i64 %.elt55, i64* %.sroa.6267.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.7.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 48
  %.sroa.7.0..sroa_cast = bitcast i8* %.sroa.7.0..sroa_idx to double*
  store double %.elt57, double* %.sroa.7.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.8268.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 56
  %.sroa.8268.0..sroa_cast = bitcast i8* %.sroa.8268.0..sroa_idx to double*
  store double %.elt59, double* %.sroa.8268.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.9269.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 64
  %.sroa.9269.0..sroa_cast = bitcast i8* %.sroa.9269.0..sroa_idx to double*
  store double %.elt61, double* %.sroa.9269.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.10270.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 72
  %.sroa.10270.0..sroa_cast = bitcast i8* %.sroa.10270.0..sroa_idx to double*
  store double %.elt63, double* %.sroa.10270.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.11271.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 80
  %.sroa.11271.0..sroa_cast = bitcast i8* %.sroa.11271.0..sroa_idx to double*
  store double %.elt65, double* %.sroa.11271.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.12272.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 88
  %.sroa.12272.0..sroa_cast = bitcast i8* %.sroa.12272.0..sroa_idx to double*
  store double %.elt67.elt.elt.elt, double* %.sroa.12272.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.13273.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 96
  %.sroa.13273.0..sroa_cast = bitcast i8* %.sroa.13273.0..sroa_idx to double*
  store double %.elt67.elt.elt.elt111, double* %.sroa.13273.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.14274.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 104
  %.sroa.14274.0..sroa_cast = bitcast i8* %.sroa.14274.0..sroa_idx to double*
  store double %.elt67.elt.elt105.elt, double* %.sroa.14274.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.15275.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 112
  %.sroa.15275.0..sroa_cast = bitcast i8* %.sroa.15275.0..sroa_idx to double*
  store double %.elt67.elt.elt105.elt113, double* %.sroa.15275.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.16276.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 120
  %.sroa.16276.0..sroa_cast = bitcast i8* %.sroa.16276.0..sroa_idx to i64*
  store i64 %.elt67.elt.elt107, i64* %.sroa.16276.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.17277.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 128
  %.sroa.17277.0..sroa_cast = bitcast i8* %.sroa.17277.0..sroa_idx to i64*
  store i64 %.elt67.elt.elt109, i64* %.sroa.17277.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.18278.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 136
  %.sroa.18278.0..sroa_cast = bitcast i8* %.sroa.18278.0..sroa_idx to i64*
  store i64 %66, i64* %.sroa.18278.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.19279.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 144
  %.sroa.19279.0..sroa_cast = bitcast i8* %.sroa.19279.0..sroa_idx to double*
  store double %.elt69.elt.elt.elt, double* %.sroa.19279.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.20280.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 152
  %.sroa.20280.0..sroa_cast = bitcast i8* %.sroa.20280.0..sroa_idx to double*
  store double %.elt69.elt.elt.elt123, double* %.sroa.20280.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.21281.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 160
  %.sroa.21281.0..sroa_cast = bitcast i8* %.sroa.21281.0..sroa_idx to double*
  store double %.elt69.elt.elt117.elt, double* %.sroa.21281.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.22282.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 168
  %.sroa.22282.0..sroa_cast = bitcast i8* %.sroa.22282.0..sroa_idx to double*
  store double %.elt69.elt.elt117.elt125, double* %.sroa.22282.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.23283.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 176
  %.sroa.23283.0..sroa_cast = bitcast i8* %.sroa.23283.0..sroa_idx to i64*
  store i64 %.elt69.elt.elt119, i64* %.sroa.23283.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.24284.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 184
  %.sroa.24284.0..sroa_cast = bitcast i8* %.sroa.24284.0..sroa_idx to i64*
  store i64 %.elt69.elt.elt121, i64* %.sroa.24284.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.25285.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 192
  %.sroa.25285.0..sroa_cast = bitcast i8* %.sroa.25285.0..sroa_idx to i64*
  store i64 %65, i64* %.sroa.25285.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.26286.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 200
  %.sroa.26286.0..sroa_cast = bitcast i8* %.sroa.26286.0..sroa_idx to double*
  store double %.elt71, double* %.sroa.26286.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.27287.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 208
  %.sroa.27287.0..sroa_cast = bitcast i8* %.sroa.27287.0..sroa_idx to double*
  store double %.elt73, double* %.sroa.27287.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.28288.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 216
  %.sroa.28288.0..sroa_cast = bitcast i8* %.sroa.28288.0..sroa_idx to double*
  store double %.elt75.elt.elt.elt, double* %.sroa.28288.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.29289.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 224
  %.sroa.29289.0..sroa_cast = bitcast i8* %.sroa.29289.0..sroa_idx to double*
  store double %.elt75.elt.elt.elt135, double* %.sroa.29289.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.30290.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 232
  %.sroa.30290.0..sroa_cast = bitcast i8* %.sroa.30290.0..sroa_idx to double*
  store double %.elt75.elt.elt129.elt, double* %.sroa.30290.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.31291.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 240
  %.sroa.31291.0..sroa_cast = bitcast i8* %.sroa.31291.0..sroa_idx to double*
  store double %.elt75.elt.elt129.elt137, double* %.sroa.31291.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.32292.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 248
  %.sroa.32292.0..sroa_cast = bitcast i8* %.sroa.32292.0..sroa_idx to i64*
  store i64 %.elt75.elt.elt131, i64* %.sroa.32292.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.33293.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 256
  %.sroa.33293.0..sroa_cast = bitcast i8* %.sroa.33293.0..sroa_idx to i64*
  store i64 %.elt75.elt.elt133, i64* %.sroa.33293.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.34294.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 264
  %.sroa.34294.0..sroa_cast = bitcast i8* %.sroa.34294.0..sroa_idx to i64*
  store i64 %64, i64* %.sroa.34294.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.35295.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 272
  %.sroa.35295.0..sroa_cast = bitcast i8* %.sroa.35295.0..sroa_idx to double*
  store double %.elt77.elt.elt.elt, double* %.sroa.35295.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.36296.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 280
  %.sroa.36296.0..sroa_cast = bitcast i8* %.sroa.36296.0..sroa_idx to double*
  store double %.elt77.elt.elt.elt147, double* %.sroa.36296.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.37297.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 288
  %.sroa.37297.0..sroa_cast = bitcast i8* %.sroa.37297.0..sroa_idx to double*
  store double %.elt77.elt.elt141.elt, double* %.sroa.37297.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.38298.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 296
  %.sroa.38298.0..sroa_cast = bitcast i8* %.sroa.38298.0..sroa_idx to double*
  store double %.elt77.elt.elt141.elt149, double* %.sroa.38298.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.39.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 304
  %.sroa.39.0..sroa_cast = bitcast i8* %.sroa.39.0..sroa_idx to i64*
  store i64 %.elt77.elt.elt143, i64* %.sroa.39.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.40.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 312
  %.sroa.40.0..sroa_cast = bitcast i8* %.sroa.40.0..sroa_idx to i64*
  store i64 %.elt77.elt.elt145, i64* %.sroa.40.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.41.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 320
  %.sroa.41.0..sroa_cast = bitcast i8* %.sroa.41.0..sroa_idx to i64*
  store i64 %63, i64* %.sroa.41.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.42.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 328
  %.sroa.42.0..sroa_cast = bitcast i8* %.sroa.42.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %62, i8 addrspace(1)** %.sroa.42.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.43.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 336
  %.sroa.43.0..sroa_cast = bitcast i8* %.sroa.43.0..sroa_idx to i64*
  store i64 %61, i64* %.sroa.43.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.44.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 344
  %.sroa.44.0..sroa_cast = bitcast i8* %.sroa.44.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %60, i8 addrspace(1)** %.sroa.44.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.45.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 352
  %.sroa.45.0..sroa_cast = bitcast i8* %.sroa.45.0..sroa_idx to i64*
  store i64 %59, i64* %.sroa.45.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.46.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 360
  %.sroa.46.0..sroa_cast = bitcast i8* %.sroa.46.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %58, i8 addrspace(1)** %.sroa.46.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.47.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 368
  %.sroa.47.0..sroa_cast = bitcast i8* %.sroa.47.0..sroa_idx to i64*
  store i64 %57, i64* %.sroa.47.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.48.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 376
  %.sroa.48.0..sroa_cast = bitcast i8* %.sroa.48.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %56, i8 addrspace(1)** %.sroa.48.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.49.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 384
  %.sroa.49.0..sroa_cast = bitcast i8* %.sroa.49.0..sroa_idx to i64*
  store i64 %55, i64* %.sroa.49.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.50.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 392
  %.sroa.50.0..sroa_cast = bitcast i8* %.sroa.50.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %54, i8 addrspace(1)** %.sroa.50.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.51.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 400
  %.sroa.51.0..sroa_cast = bitcast i8* %.sroa.51.0..sroa_idx to i64*
  store i64 %53, i64* %.sroa.51.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.52.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 408
  %.sroa.52.0..sroa_cast = bitcast i8* %.sroa.52.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %52, i8 addrspace(1)** %.sroa.52.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.53.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 416
  %.sroa.53.0..sroa_cast = bitcast i8* %.sroa.53.0..sroa_idx to i64*
  store i64 %51, i64* %.sroa.53.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.54.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 424
  %.sroa.54.0..sroa_cast = bitcast i8* %.sroa.54.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %50, i8 addrspace(1)** %.sroa.54.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.55.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 432
  %.sroa.55.0..sroa_cast = bitcast i8* %.sroa.55.0..sroa_idx to i64*
  store i64 %49, i64* %.sroa.55.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.56.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 440
  %.sroa.56.0..sroa_cast = bitcast i8* %.sroa.56.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %48, i8 addrspace(1)** %.sroa.56.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.57.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 448
  %.sroa.57.0..sroa_cast = bitcast i8* %.sroa.57.0..sroa_idx to i64*
  store i64 %47, i64* %.sroa.57.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.58.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 456
  %.sroa.58.0..sroa_cast = bitcast i8* %.sroa.58.0..sroa_idx to double*
  store double %.elt89, double* %.sroa.58.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.59.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 464
  %.sroa.59.0..sroa_cast = bitcast i8* %.sroa.59.0..sroa_idx to double*
  store double %.elt91, double* %.sroa.59.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.60.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 472
  %.sroa.60.0..sroa_cast = bitcast i8* %.sroa.60.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %46, i8 addrspace(1)** %.sroa.60.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.61.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 480
  %.sroa.61.0..sroa_cast = bitcast i8* %.sroa.61.0..sroa_idx to i64*
  store i64 %45, i64* %.sroa.61.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.62.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 488
  %.sroa.62.0..sroa_cast = bitcast i8* %.sroa.62.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %44, i8 addrspace(1)** %.sroa.62.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.63.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 496
  %.sroa.63.0..sroa_cast = bitcast i8* %.sroa.63.0..sroa_idx to i64*
  store i64 %43, i64* %.sroa.63.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.64.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 504
  %.sroa.64.0..sroa_cast = bitcast i8* %.sroa.64.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %42, i8 addrspace(1)** %.sroa.64.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.65.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 512
  %.sroa.65.0..sroa_cast = bitcast i8* %.sroa.65.0..sroa_idx to i64*
  store i64 %41, i64* %.sroa.65.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.66.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 520
  %.sroa.66.0..sroa_cast = bitcast i8* %.sroa.66.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %40, i8 addrspace(1)** %.sroa.66.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.67.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 528
  %.sroa.67.0..sroa_cast = bitcast i8* %.sroa.67.0..sroa_idx to i64*
  store i64 %39, i64* %.sroa.67.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.68.0..sroa_idx = getelementptr inbounds i8, i8* %74, i64 536
  %.sroa.68.0..sroa_cast = bitcast i8* %.sroa.68.0..sroa_idx to double*
  store double %.elt101, double* %.sroa.68.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %75 = call {}* @gpu_gc_pool_alloc(i64 128)
  %76 = bitcast {}* %75 to i8*
  %.sroa.0299.0..sroa_cast = bitcast {}* %75 to i8 addrspace(1)**
  store i8 addrspace(1)* %70, i8 addrspace(1)** %.sroa.0299.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.2300.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 8
  %.sroa.2300.0..sroa_cast = bitcast i8* %.sroa.2300.0..sroa_idx to i64*
  store i64 %.elt9.elt18.elt, i64* %.sroa.2300.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.3301.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 16
  %.sroa.3301.0..sroa_cast = bitcast i8* %.sroa.3301.0..sroa_idx to i64*
  store i64 %.elt9.elt18.elt20, i64* %.sroa.3301.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.4302.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 24
  %.sroa.4302.0..sroa_cast = bitcast i8* %.sroa.4302.0..sroa_idx to i64*
  store i64 %.elt9.elt18.elt22, i64* %.sroa.4302.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.5303.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 32
  %.sroa.5303.0..sroa_cast = bitcast i8* %.sroa.5303.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %69, i8 addrspace(1)** %.sroa.5303.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.6304.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 40
  %.sroa.6304.0..sroa_cast = bitcast i8* %.sroa.6304.0..sroa_idx to i64*
  store i64 %.elt11.elt25.elt, i64* %.sroa.6304.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.7305.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 48
  %.sroa.7305.0..sroa_cast = bitcast i8* %.sroa.7305.0..sroa_idx to i64*
  store i64 %.elt11.elt25.elt27, i64* %.sroa.7305.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.8306.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 56
  %.sroa.8306.0..sroa_cast = bitcast i8* %.sroa.8306.0..sroa_idx to i64*
  store i64 %.elt11.elt25.elt29, i64* %.sroa.8306.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.9307.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 64
  %.sroa.9307.0..sroa_cast = bitcast i8* %.sroa.9307.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %68, i8 addrspace(1)** %.sroa.9307.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.10308.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 72
  %.sroa.10308.0..sroa_cast = bitcast i8* %.sroa.10308.0..sroa_idx to i64*
  store i64 %.elt13.elt32.elt, i64* %.sroa.10308.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.11309.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 80
  %.sroa.11309.0..sroa_cast = bitcast i8* %.sroa.11309.0..sroa_idx to i64*
  store i64 %.elt13.elt32.elt34, i64* %.sroa.11309.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.12310.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 88
  %.sroa.12310.0..sroa_cast = bitcast i8* %.sroa.12310.0..sroa_idx to i64*
  store i64 %.elt13.elt32.elt36, i64* %.sroa.12310.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.13311.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 96
  %.sroa.13311.0..sroa_cast = bitcast i8* %.sroa.13311.0..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %67, i8 addrspace(1)** %.sroa.13311.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.14312.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 104
  %.sroa.14312.0..sroa_cast = bitcast i8* %.sroa.14312.0..sroa_idx to i64*
  store i64 %.elt15.elt39.elt, i64* %.sroa.14312.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.15313.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 112
  %.sroa.15313.0..sroa_cast = bitcast i8* %.sroa.15313.0..sroa_idx to i64*
  store i64 %.elt15.elt39.elt41, i64* %.sroa.15313.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.16314.0..sroa_idx = getelementptr inbounds i8, i8* %76, i64 120
  %.sroa.16314.0..sroa_cast = bitcast i8* %.sroa.16314.0..sroa_idx to i64*
  store i64 %.elt15.elt39.elt43, i64* %.sroa.16314.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %77 = call {}* @gpu_gc_pool_alloc(i64 40)
  %78 = bitcast {}* %77 to i8*
  %.sroa.0.0..sroa_cast = bitcast {}* %77 to double*
  store double %.elt181.elt, double* %.sroa.0.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.2.0..sroa_idx = getelementptr inbounds i8, i8* %78, i64 8
  %.sroa.2.0..sroa_cast = bitcast i8* %.sroa.2.0..sroa_idx to double*
  store double %.elt181.elt185, double* %.sroa.2.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.3.0..sroa_idx = getelementptr inbounds i8, i8* %78, i64 16
  %.sroa.3.0..sroa_cast = bitcast i8* %.sroa.3.0..sroa_idx to double*
  store double %.elt181.elt187, double* %.sroa.3.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.4.0..sroa_idx = getelementptr inbounds i8, i8* %78, i64 24
  %.sroa.4.0..sroa_cast = bitcast i8* %.sroa.4.0..sroa_idx to i64*
  store i64 %.elt181.elt189, i64* %.sroa.4.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.5.0..sroa_idx = getelementptr inbounds i8, i8* %78, i64 32
  %.sroa.5.0..sroa_cast = bitcast i8* %.sroa.5.0..sroa_idx to i64*
  store i64 %.elt181.elt191, i64* %.sroa.5.0..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %79 = call {}* @gpu_gc_pool_alloc(i64 256)
  %80 = bitcast {}* %79 to i8*
  %.sroa.6.40..sroa_cast = bitcast {}* %79 to i8 addrspace(1)**
  store i8 addrspace(1)* %38, i8 addrspace(1)** %.sroa.6.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.8.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 8
  %.sroa.8.40..sroa_cast = bitcast i8* %.sroa.8.40..sroa_idx to i64*
  store i64 %.elt183.elt.elt207.elt, i64* %.sroa.8.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.9.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 16
  %.sroa.9.40..sroa_cast = bitcast i8* %.sroa.9.40..sroa_idx to i64*
  store i64 %.elt183.elt.elt207.elt209, i64* %.sroa.9.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.10.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 24
  %.sroa.10.40..sroa_cast = bitcast i8* %.sroa.10.40..sroa_idx to i64*
  store i64 %.elt183.elt.elt207.elt211, i64* %.sroa.10.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.11.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 32
  %.sroa.11.40..sroa_cast = bitcast i8* %.sroa.11.40..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %37, i8 addrspace(1)** %.sroa.11.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.12.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 40
  %.sroa.12.40..sroa_cast = bitcast i8* %.sroa.12.40..sroa_idx to i64*
  store i64 %.elt183.elt193.elt213.elt, i64* %.sroa.12.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.13.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 48
  %.sroa.13.40..sroa_cast = bitcast i8* %.sroa.13.40..sroa_idx to i64*
  store i64 %.elt183.elt193.elt213.elt215, i64* %.sroa.13.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.14.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 56
  %.sroa.14.40..sroa_cast = bitcast i8* %.sroa.14.40..sroa_idx to i64*
  store i64 %.elt183.elt193.elt213.elt217, i64* %.sroa.14.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.15.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 64
  %.sroa.15.40..sroa_cast = bitcast i8* %.sroa.15.40..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %36, i8 addrspace(1)** %.sroa.15.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.16.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 72
  %.sroa.16.40..sroa_cast = bitcast i8* %.sroa.16.40..sroa_idx to i64*
  store i64 %.elt183.elt195.elt219.elt, i64* %.sroa.16.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.17.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 80
  %.sroa.17.40..sroa_cast = bitcast i8* %.sroa.17.40..sroa_idx to i64*
  store i64 %.elt183.elt195.elt219.elt221, i64* %.sroa.17.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.18.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 88
  %.sroa.18.40..sroa_cast = bitcast i8* %.sroa.18.40..sroa_idx to i64*
  store i64 %.elt183.elt195.elt219.elt223, i64* %.sroa.18.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.19.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 96
  %.sroa.19.40..sroa_cast = bitcast i8* %.sroa.19.40..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %35, i8 addrspace(1)** %.sroa.19.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.20.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 104
  %.sroa.20.40..sroa_cast = bitcast i8* %.sroa.20.40..sroa_idx to i64*
  store i64 %.elt183.elt197.elt225.elt, i64* %.sroa.20.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.21.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 112
  %.sroa.21.40..sroa_cast = bitcast i8* %.sroa.21.40..sroa_idx to i64*
  store i64 %.elt183.elt197.elt225.elt227, i64* %.sroa.21.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.22.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 120
  %.sroa.22.40..sroa_cast = bitcast i8* %.sroa.22.40..sroa_idx to i64*
  store i64 %.elt183.elt197.elt225.elt229, i64* %.sroa.22.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.23.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 128
  %.sroa.23.40..sroa_cast = bitcast i8* %.sroa.23.40..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %34, i8 addrspace(1)** %.sroa.23.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.24.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 136
  %.sroa.24.40..sroa_cast = bitcast i8* %.sroa.24.40..sroa_idx to i64*
  store i64 %.elt233.elt, i64* %.sroa.24.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.25.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 144
  %.sroa.25.40..sroa_cast = bitcast i8* %.sroa.25.40..sroa_idx to i64*
  store i64 %.elt233.elt235, i64* %.sroa.25.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.26.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 152
  %.sroa.26.40..sroa_cast = bitcast i8* %.sroa.26.40..sroa_idx to i64*
  store i64 %.elt233.elt237, i64* %.sroa.26.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.27.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 160
  %.sroa.27.40..sroa_cast = bitcast i8* %.sroa.27.40..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %32, i8 addrspace(1)** %.sroa.27.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.28.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 168
  %.sroa.28.40..sroa_cast = bitcast i8* %.sroa.28.40..sroa_idx to i64*
  store i64 %.elt241.elt, i64* %.sroa.28.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.29.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 176
  %.sroa.29.40..sroa_cast = bitcast i8* %.sroa.29.40..sroa_idx to i64*
  store i64 %.elt241.elt243, i64* %.sroa.29.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.30.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 184
  %.sroa.30.40..sroa_cast = bitcast i8* %.sroa.30.40..sroa_idx to i64*
  store i64 %.elt241.elt245, i64* %.sroa.30.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.31.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 192
  %.sroa.31.40..sroa_cast = bitcast i8* %.sroa.31.40..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %30, i8 addrspace(1)** %.sroa.31.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.32.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 200
  %.sroa.32.40..sroa_cast = bitcast i8* %.sroa.32.40..sroa_idx to i64*
  store i64 %.elt183.elt203.elt247.elt, i64* %.sroa.32.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.33.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 208
  %.sroa.33.40..sroa_cast = bitcast i8* %.sroa.33.40..sroa_idx to i64*
  store i64 %.elt183.elt203.elt247.elt249, i64* %.sroa.33.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.34.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 216
  %.sroa.34.40..sroa_cast = bitcast i8* %.sroa.34.40..sroa_idx to i64*
  store i64 %.elt183.elt203.elt247.elt251, i64* %.sroa.34.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.35.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 224
  %.sroa.35.40..sroa_cast = bitcast i8* %.sroa.35.40..sroa_idx to i8 addrspace(1)**
  store i8 addrspace(1)* %29, i8 addrspace(1)** %.sroa.35.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.36.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 232
  %.sroa.36.40..sroa_cast = bitcast i8* %.sroa.36.40..sroa_idx to i64*
  store i64 %.elt183.elt205.elt253.elt, i64* %.sroa.36.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.37.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 240
  %.sroa.37.40..sroa_cast = bitcast i8* %.sroa.37.40..sroa_idx to i64*
  store i64 %.elt183.elt205.elt253.elt255, i64* %.sroa.37.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  %.sroa.38.40..sroa_idx = getelementptr inbounds i8, i8* %80, i64 248
  %.sroa.38.40..sroa_cast = bitcast i8* %.sroa.38.40..sroa_idx to i64*
  store i64 %.elt183.elt205.elt253.elt257, i64* %.sroa.38.40..sroa_cast, align 8, !alias.scope !6, !noalias !10
  store {}* %71, {}** %.sub, align 8
  %81 = getelementptr inbounds [8 x {}*], [8 x {}*]* %5, i64 0, i64 1
  store {}* %72, {}** %81, align 8
  %82 = getelementptr inbounds [8 x {}*], [8 x {}*]* %5, i64 0, i64 2
  store {}* %73, {}** %82, align 8
  %83 = getelementptr inbounds [8 x {}*], [8 x {}*]* %5, i64 0, i64 3
  store {}* %75, {}** %83, align 8
  %84 = getelementptr inbounds [8 x {}*], [8 x {}*]* %5, i64 0, i64 4
  store {}* inttoptr (i64 129626576620672 to {}*), {}** %84, align 8
  %85 = getelementptr inbounds [8 x {}*], [8 x {}*]* %5, i64 0, i64 5
  store {}* inttoptr (i64 129626576614160 to {}*), {}** %85, align 8
  %86 = getelementptr inbounds [8 x {}*], [8 x {}*]* %5, i64 0, i64 6
  store {}* %77, {}** %86, align 8
  %87 = getelementptr inbounds [8 x {}*], [8 x {}*]* %5, i64 0, i64 7
  store {}* %79, {}** %87, align 8
  %88 = call nonnull {}* @ijl_apply_generic({}* nonnull inttoptr (i64 129626763962080 to {}*), {}** nonnull %.sub, i32 8)
  call void @llvm.trap()
  call void @llvm.trap()
  call void asm sideeffect "exit;", ""() #2
  unreachable
}

declare {}* @gpu_gc_pool_alloc(i64)

attributes #0 = { cold nounwind }
attributes #1 = { nocallback nofree nosync nounwind readnone speculatable willreturn }
attributes #2 = { nounwind }

!llvm.module.flags = !{!0, !1}
!julia.kernel = !{!2}
!nvvm.annotations = !{!3}

!0 = !{i32 2, !"Dwarf Version", i32 2}
!1 = !{i32 2, !"Debug Info Version", i32 3}
!2 = !{void ({ { [2 x i64], [1 x [2 x i64]] } }, [4 x { [1 x i8 addrspace(1)*], [3 x i64] }], { { { { [1 x i8 addrspace(1)*], [3 x i64] } } } }, { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double }, { { double, double, double, i64, i64 }, { { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] } } })* @_Z30gpu__fill_bottom_and_top_halo_16CompilerMetadataI16OffsetStaticSizeI12_1_20__1_20_E12DynamicCheckvv7NDRangeILl2E10StaticSizeI6_2__2_ES3_I8_16__16_E5TupleI5Int64S5_E13KernelOffsetsIS4_IS5_S5_EEEES4_I11OffsetArrayI7Float64Ll3E13CuTracedArrayIS8_Ll3ELl1E12_35__34__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__35__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__16_EEES4_I17BoundaryConditionI4FluxvES10_IS11_vES10_IS11_vES10_IS11_vEES4_IS10_IS11_vES10_IS11_vES10_IS11_vES10_IS11_5FieldI6CenterS13_vvvvS7_IS8_Ll3ES9_IS8_Ll3ELl1E11_34__34__1_EES8_vvvEEES4_IS4_I4FaceS13_S13_ES4_IS13_S14_S13_ES4_IS13_S13_S13_ES4_IS13_S13_S13_EE21LatitudeLongitudeGridIS8_7BoundedS16_S16_24StaticVerticalCoordinateIS7_IS8_Ll1ES9_IS8_Ll1ELl1E5_17__EES7_IS8_Ll1ES9_IS8_Ll1ELl1E5_16__EES7_IS8_Ll1ES9_IS8_Ll1ELl1E5_17__EES7_IS8_Ll1ES9_IS8_Ll1ELl1E5_16__EEES7_IS8_Ll1ES9_IS8_Ll1ELl1E5_34__EES8_S8_S8_S7_IS8_Ll1E12StepRangeLenIS8_14TwicePrecisionIS8_ES19_IS8_ES5_EES7_IS8_Ll1ES18_IS8_S19_IS8_ES19_IS8_ES5_EEvES4_I10NamedTupleI53__time___last__t___last_stage__t___iteration___stage_S4_IS8_S8_S8_S5_S5_EES20_I32__u___v___w_______U___V___b___c_S4_IS7_IS8_Ll3ES9_IS8_Ll3ELl1E12_35__34__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__35__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__17_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E11_34__34__1_EES12_IS14_S13_vvvvS7_IS8_Ll3ES9_IS8_Ll3ELl1E11_35__34__1_EES8_vvvES12_IS13_S14_vvvvS7_IS8_Ll3ES9_IS8_Ll3ELl1E11_34__35__1_EES8_vvvES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__16_EEEEE}
!3 = !{void ({ { [2 x i64], [1 x [2 x i64]] } }, [4 x { [1 x i8 addrspace(1)*], [3 x i64] }], { { { { [1 x i8 addrspace(1)*], [3 x i64] } } } }, { i64, i64, i64, i64, i64, i64, double, double, double, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, double, double, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, { { [2 x double], [2 x double], i64, i64 }, [1 x i64] }, [4 x { [1 x i8 addrspace(1)*], [1 x i64] }], { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double, double, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, { [1 x i8 addrspace(1)*], [1 x i64] }, double }, { { double, double, double, i64, i64 }, { { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { { [1 x i8 addrspace(1)*], [3 x i64] } }, { [1 x i8 addrspace(1)*], [3 x i64] }, { [1 x i8 addrspace(1)*], [3 x i64] } } })* @_Z30gpu__fill_bottom_and_top_halo_16CompilerMetadataI16OffsetStaticSizeI12_1_20__1_20_E12DynamicCheckvv7NDRangeILl2E10StaticSizeI6_2__2_ES3_I8_16__16_E5TupleI5Int64S5_E13KernelOffsetsIS4_IS5_S5_EEEES4_I11OffsetArrayI7Float64Ll3E13CuTracedArrayIS8_Ll3ELl1E12_35__34__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__35__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__16_EEES4_I17BoundaryConditionI4FluxvES10_IS11_vES10_IS11_vES10_IS11_vEES4_IS10_IS11_vES10_IS11_vES10_IS11_vES10_IS11_5FieldI6CenterS13_vvvvS7_IS8_Ll3ES9_IS8_Ll3ELl1E11_34__34__1_EES8_vvvEEES4_IS4_I4FaceS13_S13_ES4_IS13_S14_S13_ES4_IS13_S13_S13_ES4_IS13_S13_S13_EE21LatitudeLongitudeGridIS8_7BoundedS16_S16_24StaticVerticalCoordinateIS7_IS8_Ll1ES9_IS8_Ll1ELl1E5_17__EES7_IS8_Ll1ES9_IS8_Ll1ELl1E5_16__EES7_IS8_Ll1ES9_IS8_Ll1ELl1E5_17__EES7_IS8_Ll1ES9_IS8_Ll1ELl1E5_16__EEES7_IS8_Ll1ES9_IS8_Ll1ELl1E5_34__EES8_S8_S8_S7_IS8_Ll1E12StepRangeLenIS8_14TwicePrecisionIS8_ES19_IS8_ES5_EES7_IS8_Ll1ES18_IS8_S19_IS8_ES19_IS8_ES5_EEvES4_I10NamedTupleI53__time___last__t___last_stage__t___iteration___stage_S4_IS8_S8_S8_S5_S5_EES20_I32__u___v___w_______U___V___b___c_S4_IS7_IS8_Ll3ES9_IS8_Ll3ELl1E12_35__34__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__35__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__17_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E11_34__34__1_EES12_IS14_S13_vvvvS7_IS8_Ll3ES9_IS8_Ll3ELl1E11_35__34__1_EES8_vvvES12_IS13_S14_vvvvS7_IS8_Ll3ES9_IS8_Ll3ELl1E11_34__35__1_EES8_vvvES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__16_EES7_IS8_Ll3ES9_IS8_Ll3ELl1E12_34__34__16_EEEEE, !"kernel", i32 1}
!4 = !{i32 0, i32 1023}
!5 = !{i32 0, i32 2147483646}
!6 = !{!7, !9}
!7 = !{!"jnoalias_const", !8}
!8 = !{!"jnoalias"}
!9 = !{!"jnoalias_data", !8}
!10 = !{!11, !12, !13}
!11 = !{!"jnoalias_gcframe", !8}
!12 = !{!"jnoalias_stack", !8}
!13 = !{!"jnoalias_typemd", !8}

@wsmoses
Copy link
Member Author

wsmoses commented Jan 7, 2025

llvm parse code is here

MDNode *MDNode::getMostGenericAliasScope(MDNode *A, MDNode *B) {

MDNode *MDNode::getMostGenericAliasScope(MDNode *A, MDNode *B) {
  if (!A || !B)
    return nullptr;

  // Take the intersection of domains then union the scopes
  // within those domains
  SmallPtrSet<const MDNode *, 16> ADomains;
  SmallPtrSet<const MDNode *, 16> IntersectDomains;
  SmallSetVector<Metadata *, 4> MDs;
  for (const MDOperand &MDOp : A->operands())
    if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
      if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
        ADomains.insert(Domain);

So here we would have

A :=   !6 = !{!7, !9}
MDOp/NAMD :=  !7 = !{!"jnoalias_const", !8}
!8 = !{!"jnoalias"}
MDOp/NAMD :=.  !9 = !{!"jnoalias_data", !8}

const MDNode *getDomain() const {

class AliasScopeNode {
  const MDNode *Node = nullptr;

public:
  AliasScopeNode() = default;
  explicit AliasScopeNode(const MDNode *N) : Node(N) {}

  /// Get the MDNode for this AliasScopeNode.
  const MDNode *getNode() const { return Node; }

  /// Get the MDNode for this AliasScopeNode's domain.
  const MDNode *getDomain() const {
    if (Node->getNumOperands() < 2)
      return nullptr;
    return dyn_cast_or_null<MDNode>(Node->getOperand(1));
  }
  StringRef getName() const {
    if (Node->getNumOperands() > 2)
      if (MDString *N = dyn_cast_or_null<MDString>(Node->getOperand(2)))
        return N->getString();
    return StringRef();
  }
};

This makes !8 the domain. It looks like if there's no self ref (like here) the description is index 0.

@gysit
Copy link
Contributor

gysit commented Jan 7, 2025

That looks like a missing feature of the import and LLVM dialect. The import assumes the first entry of an alias scope is a self-reference (

if (!verifySelfRef(scope) || !domain || !verifyDescription(scope, 2))
). The alias scope attribute of LLVM dialect the uses a distinct attribute to model that self reference ( ).

These two things would have to be extend to support string identifiers. IUC the string identifiers should be separate from the distinct attribute since they may be merged when merging compilation units.

Out of curiosity, how did you get such alias scopes? We never encountered them in real-life.

@wsmoses
Copy link
Member Author

wsmoses commented Jan 7, 2025

It's emitted via Julia

@gysit
Copy link
Contributor

gysit commented Jan 7, 2025

This makes !8 the domain. It looks like if there's no self ref (like here) the description is index 0.

Yes a self-reference is not necessary. Form the language ref:

"The first entry is the name of the scope. Note that if the name is a string then it can be combined across functions and translation units."

@gysit
Copy link
Contributor

gysit commented Jan 7, 2025

It's emitted via Julia

Ah that explains why we never saw this :). I think it is just a missing feature in LLVM dialect. If you can generate self-references instead that would be an alternative quick fix.

@wsmoses
Copy link
Member Author

wsmoses commented Jan 7, 2025

potentially, but unfortunately Julia's codegen is out of my control (I could attempt a nasty shim but at that point we might as well fix it).

What if we changed the distinctattr to be optional here:

and if not set, one must set the description (representing the string name here)

@gysit
Copy link
Contributor

gysit commented Jan 7, 2025

I would not use the description since it may be used to store the actual description: Maybe something like this:

def LLVM_AliasScopeAttr : LLVM_Attr<"AliasScope", "alias_scope"> {
  let parameters = (ins
    "Attribute":$id,
    "AliasScopeDomainAttr":$domain,
    OptionalParameter<"StringAttr">:$description
  );

with a verifier that checks that id is either a string or a distinct attribute makes sense? I am unfortunately not aware of a better way to model this. Alternatively we could have an optional distinct attribute and an optional string attribute parameter.

@ftynse
Copy link
Member

ftynse commented Jan 7, 2025

For completeness, metadata nodes with self-references are an outdated mechanism of ensuring distinctness. !1 = {!1, "foo"} makes it different from !2 = {!2, "foo"} from the uniquer perspective.

@llvmbot
Copy link
Member

llvmbot commented Jan 8, 2025

@llvm/issue-subscribers-mlir-llvm

Author: William Moses (wsmoses)

Unsupported alias scope node: `!7 = !{!"jnoalias_const", !8}`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants