; LLVM IR from gem5/gem5 :: ext/mcpat/cacti/mat.ll (ZN3Mat21compute_bitline_delayEd)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%class.TechnologyParameter = type { double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, i64, %"class.TechnologyParameter::DeviceType", %"class.TechnologyParameter::DeviceType", %"class.TechnologyParameter::DeviceType", %"class.TechnologyParameter::DeviceType", %"class.TechnologyParameter::DeviceType", %"class.TechnologyParameter::InterconnectType", %"class.TechnologyParameter::InterconnectType", %"class.TechnologyParameter::InterconnectType", %"class.TechnologyParameter::ScalingFactor", %"class.TechnologyParameter::MemoryType", %"class.TechnologyParameter::MemoryType", %"class.TechnologyParameter::MemoryType" }
%"class.TechnologyParameter::DeviceType" = type { double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double }
%"class.TechnologyParameter::InterconnectType" = type { double, double, double, double, double, double, double, double }
%"class.TechnologyParameter::ScalingFactor" = type { double, double, double }
%"class.TechnologyParameter::MemoryType" = type { double, double, double, double, double, double }
%class.Mat = type { %class.Component, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, %class.powerDef, %class.powerDef, %class.powerDef, %class.powerDef, %class.powerDef, %class.powerDef, %class.powerDef, %class.powerDef, %class.powerDef, %class.powerDef, %class.powerDef, double, double, double, double, double, double, double, double, double, double, double, double, double, %class.Subarray, %class.powerDef, %class.powerDef, %class.powerDef, double, i32, i32, double, %class.Area, %class.Area, i8, i8, i8, i8, i32, %class.powerDef, double, double, double, double, double, double, %class.powerDef, i32, i32, i32, i32, double, i32, i32, i32, i32, i32, i32 }
%class.Component = type { %class.Area, %class.powerDef, %class.powerDef, double, double }
%class.Subarray = type { %class.Component, ptr, i32, i32, i32, i32, %class.Area, %class.Area, i8, double, double, double, double, double, double, double, double }
%class.Area = type { double, double, double }
%class.powerDef = type { %class.powerComponents, %class.powerComponents, %class.powerComponents }
%class.powerComponents = type { double, double, double, double, double }
%class.DynamicParameter = type <{ i8, i8, i8, i8, i32, i32, i32, double, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i8, [7 x i8], double, i32, i32, i32, i32, i32, i32, i32, i32, i32, [4 x i8], double, i32, i32, i32, i32, i32, i32, i32, i8, [3 x i8], %class.Area, %class.Area, i8, [7 x i8] }>

@g_tp = external global %class.TechnologyParameter, align 8

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #1

declare noundef double @_Z6gate_Cddbbb(double noundef, double noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) #2

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

declare noundef double @_Z7tr_R_ondiibbb(double noundef, i32 noundef, i32 noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) #2

declare noundef double @_Z8drain_C_diiidbbb(double noundef, i32 noundef, i32 noundef, i32 noundef, double noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) #2

; Function Attrs: nounwind
declare double @log(double noundef) #3

; Function Attrs: mustprogress uwtable
define dso_local noundef double @_ZN3Mat21compute_bitline_delayEd(ptr noundef nonnull align 8 dereferenceable(3064) %0, double noundef %1) #4 align 2 {
  %3 = alloca ptr, align 8
  %4 = alloca double, align 8
  %5 = alloca double, align 8
  %6 = alloca double, align 8
  %7 = alloca double, align 8
  %8 = alloca double, align 8
  %9 = alloca double, align 8
  %10 = alloca double, align 8
  %11 = alloca double, align 8
  %12 = alloca double, align 8
  %13 = alloca double, align 8
  %14 = alloca i32, align 4
  %15 = alloca double, align 8
  %16 = alloca double, align 8
  %17 = alloca double, align 8
  %18 = alloca double, align 8
  %19 = alloca double, align 8
  %20 = alloca double, align 8
  %21 = alloca double, align 8
  %22 = alloca double, align 8
  %23 = alloca double, align 8
  %24 = alloca double, align 8
  %25 = alloca double, align 8
  %26 = alloca double, align 8
  %27 = alloca double, align 8
  %28 = alloca double, align 8
  %29 = alloca double, align 8
  %30 = alloca double, align 8
  %31 = alloca double, align 8
  %32 = alloca double, align 8
  %33 = alloca double, align 8
  %34 = alloca double, align 8
  %35 = alloca double, align 8
  %36 = alloca double, align 8
  %37 = alloca i8, align 1
  %38 = alloca double, align 8
  store ptr %0, ptr %3, align 8, !tbaa !5
  store double %1, ptr %4, align 8, !tbaa !9
  %39 = load ptr, ptr %3, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #5
  store double 0.000000e+00, ptr %9, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #5
  store double 0.000000e+00, ptr %10, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #5
  store double 0.000000e+00, ptr %11, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #5
  store double 0.000000e+00, ptr %12, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #5
  store double 0.000000e+00, ptr %13, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #5
  %40 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 1
  %41 = load ptr, ptr %40, align 8, !tbaa !11
  %42 = getelementptr inbounds %class.DynamicParameter, ptr %41, i32 0, i32 13
  %43 = load i32, ptr %42, align 4, !tbaa !20
  %44 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 1
  %45 = load ptr, ptr %44, align 8, !tbaa !11
  %46 = getelementptr inbounds %class.DynamicParameter, ptr %45, i32 0, i32 14
  %47 = load i32, ptr %46, align 8, !tbaa !22
  %48 = mul nsw i32 %43, %47
  store i32 %48, ptr %14, align 4, !tbaa !23
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #5
  %49 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 58
  %50 = load i8, ptr %49, align 1, !tbaa !24, !range !25, !noundef !26
  %51 = trunc i8 %50 to i1
  br i1 %51, label %52, label %56

52:                                               ; preds = %2
  %53 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 54
  %54 = getelementptr inbounds %class.Area, ptr %53, i32 0, i32 1
  %55 = load double, ptr %54, align 8, !tbaa !27
  br label %62

56:                                               ; preds = %2
  %57 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 53
  %58 = getelementptr inbounds %class.Area, ptr %57, i32 0, i32 1
  %59 = load double, ptr %58, align 8, !tbaa !28
  %60 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::InterconnectType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 50), i32 0, i32 1), align 8, !tbaa !29
  %61 = fmul double %59, %60
  br label %62

62:                                               ; preds = %56, %52
  %63 = phi double [ %55, %52 ], [ %61, %56 ]
  store double %63, ptr %15, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #5
  %64 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 45
  %65 = getelementptr inbounds %class.Subarray, ptr %64, i32 0, i32 2
  %66 = load i32, ptr %65, align 8, !tbaa !36
  %67 = uitofp i32 %66 to double
  %68 = load double, ptr %15, align 8, !tbaa !9
  %69 = fmul double %67, %68
  store double %69, ptr %16, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #5
  %70 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 45
  %71 = getelementptr inbounds %class.Subarray, ptr %70, i32 0, i32 15
  %72 = load double, ptr %71, align 8, !tbaa !37
  store double %72, ptr %17, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #5
  store double 0.000000e+00, ptr %18, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #5
  store double 0.000000e+00, ptr %19, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #5
  store double 0.000000e+00, ptr %20, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #5
  store double 0.000000e+00, ptr %21, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #5
  store double 0.000000e+00, ptr %22, align 8, !tbaa !9
  %73 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 55
  %74 = load i8, ptr %73, align 8, !tbaa !38, !range !25, !noundef !26
  %75 = trunc i8 %74 to i1
  %76 = zext i1 %75 to i32
  %77 = icmp eq i32 %76, 1
  br i1 %77, label %78, label %90

78:                                               ; preds = %62
  %79 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::MemoryType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 55), i32 0, i32 5), align 8, !tbaa !39
  store double %79, ptr %5, align 8, !tbaa !9
  %80 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 46), i32 0, i32 10), align 8, !tbaa !40
  store double %80, ptr %6, align 8, !tbaa !9
  %81 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 7), align 8, !tbaa !41
  store double %81, ptr %7, align 8, !tbaa !9
  %82 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::MemoryType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 55), i32 0, i32 2), align 8, !tbaa !42
  %83 = call noundef double @_Z7tr_R_ondiibbb(double noundef %82, i32 noundef 1, i32 noundef 1, i1 noundef zeroext true, i1 noundef zeroext true, i1 noundef zeroext false)
  store double %83, ptr %12, align 8, !tbaa !9
  %84 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 28), align 8, !tbaa !43
  %85 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 27), align 8, !tbaa !44
  %86 = fdiv double %84, %85
  %87 = load double, ptr %16, align 8, !tbaa !9
  %88 = fdiv double %87, 2.000000e+00
  %89 = fadd double %86, %88
  store double %89, ptr %13, align 8, !tbaa !9
  br label %126

90:                                               ; preds = %62
  %91 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::MemoryType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 54), i32 0, i32 5), align 8, !tbaa !45
  store double %91, ptr %5, align 8, !tbaa !9
  %92 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 10), align 8, !tbaa !46
  store double %92, ptr %6, align 8, !tbaa !9
  %93 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 9), align 8, !tbaa !47
  store double %93, ptr %7, align 8, !tbaa !9
  %94 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::MemoryType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 54), i32 0, i32 4), align 8, !tbaa !48
  %95 = call noundef double @_Z7tr_R_ondiibbb(double noundef %94, i32 noundef 1, i32 noundef 1, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false)
  store double %95, ptr %11, align 8, !tbaa !9
  %96 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::MemoryType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 54), i32 0, i32 2), align 8, !tbaa !49
  %97 = call noundef double @_Z7tr_R_ondiibbb(double noundef %96, i32 noundef 1, i32 noundef 1, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false)
  store double %97, ptr %12, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #5
  %98 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::MemoryType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 54), i32 0, i32 2), align 8, !tbaa !49
  %99 = call noundef double @_Z17cmos_Isub_leakageddi9Gate_typebbb17Half_net_topology(double noundef %98, double noundef 0.000000e+00, i32 noundef 1, i32 noundef 0, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false, i32 noundef 1)
  store double %99, ptr %23, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #5
  %100 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::MemoryType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 54), i32 0, i32 2), align 8, !tbaa !49
  %101 = call noundef double @_Z17cmos_Isub_leakageddi9Gate_typebbb17Half_net_topology(double noundef %100, double noundef 0.000000e+00, i32 noundef 2, i32 noundef 0, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false, i32 noundef 1)
  store double %101, ptr %24, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #5
  %102 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::MemoryType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 54), i32 0, i32 4), align 8, !tbaa !48
  %103 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::MemoryType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 54), i32 0, i32 3), align 8, !tbaa !50
  %104 = call noundef double @_Z17cmos_Isub_leakageddi9Gate_typebbb17Half_net_topology(double noundef %102, double noundef %103, i32 noundef 1, i32 noundef 2, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false, i32 noundef 1)
  %105 = fmul double %104, 2.000000e+00
  store double %105, ptr %25, align 8, !tbaa !9
  %106 = load double, ptr %25, align 8, !tbaa !9
  %107 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 9), align 8, !tbaa !47
  %108 = fmul double %106, %107
  store double %108, ptr %18, align 8, !tbaa !9
  %109 = load double, ptr %23, align 8, !tbaa !9
  %110 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 9), align 8, !tbaa !47
  %111 = fmul double %109, %110
  store double %111, ptr %20, align 8, !tbaa !9
  %112 = load double, ptr %24, align 8, !tbaa !9
  %113 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 9), align 8, !tbaa !47
  %114 = fmul double %112, %113
  store double %114, ptr %21, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #5
  %115 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::MemoryType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 54), i32 0, i32 2), align 8, !tbaa !49
  %116 = call noundef double @_Z15cmos_Ig_leakageddi9Gate_typebbb17Half_net_topology(double noundef %115, double noundef 0.000000e+00, i32 noundef 1, i32 noundef 0, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false, i32 noundef 1)
  store double %116, ptr %26, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #5
  %117 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::MemoryType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 54), i32 0, i32 4), align 8, !tbaa !48
  %118 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::MemoryType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 54), i32 0, i32 3), align 8, !tbaa !50
  %119 = call noundef double @_Z15cmos_Ig_leakageddi9Gate_typebbb17Half_net_topology(double noundef %117, double noundef %118, i32 noundef 1, i32 noundef 2, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false, i32 noundef 1)
  store double %119, ptr %27, align 8, !tbaa !9
  %120 = load double, ptr %27, align 8, !tbaa !9
  %121 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 9), align 8, !tbaa !47
  %122 = fmul double %120, %121
  store double %122, ptr %19, align 8, !tbaa !9
  %123 = load double, ptr %26, align 8, !tbaa !9
  %124 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 9), align 8, !tbaa !47
  %125 = fmul double %123, %124
  store double %125, ptr %22, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #5
  br label %126

126:                                              ; preds = %90, %78
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #5
  %127 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 32), align 8, !tbaa !51
  %128 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 58
  %129 = load i8, ptr %128, align 1, !tbaa !24, !range !25, !noundef !26
  %130 = trunc i8 %129 to i1
  br i1 %130, label %131, label %135

131:                                              ; preds = %126
  %132 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 54
  %133 = getelementptr inbounds %class.Area, ptr %132, i32 0, i32 0
  %134 = load double, ptr %133, align 8, !tbaa !52
  br label %150

135:                                              ; preds = %126
  %136 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 53
  %137 = getelementptr inbounds %class.Area, ptr %136, i32 0, i32 0
  %138 = load double, ptr %137, align 8, !tbaa !53
  %139 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 75
  %140 = load i32, ptr %139, align 8, !tbaa !54
  %141 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 76
  %142 = load i32, ptr %141, align 4, !tbaa !55
  %143 = add nsw i32 %140, %142
  %144 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 78
  %145 = load i32, ptr %144, align 4, !tbaa !56
  %146 = add nsw i32 %143, %145
  %147 = mul nsw i32 2, %146
  %148 = sitofp i32 %147 to double
  %149 = fdiv double %138, %148
  br label %150

150:                                              ; preds = %135, %131
  %151 = phi double [ %134, %131 ], [ %149, %135 ]
  %152 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 55
  %153 = load i8, ptr %152, align 8, !tbaa !38, !range !25, !noundef !26
  %154 = trunc i8 %153 to i1
  %155 = call noundef double @_Z8drain_C_diiidbbb(double noundef %127, i32 noundef 1, i32 noundef 1, i32 noundef 0, double noundef %151, i1 noundef zeroext %154, i1 noundef zeroext false, i1 noundef zeroext false)
  store double %155, ptr %28, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #5
  %156 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 32), align 8, !tbaa !51
  %157 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 55
  %158 = load i8, ptr %157, align 8, !tbaa !38, !range !25, !noundef !26
  %159 = trunc i8 %158 to i1
  %160 = call noundef double @_Z7tr_R_ondiibbb(double noundef %156, i32 noundef 1, i32 noundef 1, i1 noundef zeroext %159, i1 noundef zeroext false, i1 noundef zeroext false)
  store double %160, ptr %29, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #5
  %161 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 13), align 8, !tbaa !57
  %162 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 58
  %163 = load i8, ptr %162, align 1, !tbaa !24, !range !25, !noundef !26
  %164 = trunc i8 %163 to i1
  br i1 %164, label %165, label %169

165:                                              ; preds = %150
  %166 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 54
  %167 = getelementptr inbounds %class.Area, ptr %166, i32 0, i32 0
  %168 = load double, ptr %167, align 8, !tbaa !52
  br label %187

169:                                              ; preds = %150
  %170 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 53
  %171 = getelementptr inbounds %class.Area, ptr %170, i32 0, i32 0
  %172 = load double, ptr %171, align 8, !tbaa !53
  %173 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 50
  %174 = load i32, ptr %173, align 8, !tbaa !58
  %175 = sitofp i32 %174 to double
  %176 = fmul double %172, %175
  %177 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 75
  %178 = load i32, ptr %177, align 8, !tbaa !54
  %179 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 76
  %180 = load i32, ptr %179, align 4, !tbaa !55
  %181 = add nsw i32 %178, %180
  %182 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 78
  %183 = load i32, ptr %182, align 4, !tbaa !56
  %184 = add nsw i32 %181, %183
  %185 = sitofp i32 %184 to double
  %186 = fdiv double %176, %185
  br label %187

187:                                              ; preds = %169, %165
  %188 = phi double [ %168, %165 ], [ %186, %169 ]
  %189 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 55
  %190 = load i8, ptr %189, align 8, !tbaa !38, !range !25, !noundef !26
  %191 = trunc i8 %190 to i1
  %192 = call noundef double @_Z8drain_C_diiidbbb(double noundef %161, i32 noundef 0, i32 noundef 1, i32 noundef 0, double noundef %188, i1 noundef zeroext %191, i1 noundef zeroext false, i1 noundef zeroext false)
  store double %192, ptr %30, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #5
  %193 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 13), align 8, !tbaa !57
  %194 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 55
  %195 = load i8, ptr %194, align 8, !tbaa !38, !range !25, !noundef !26
  %196 = trunc i8 %195 to i1
  %197 = call noundef double @_Z7tr_R_ondiibbb(double noundef %193, i32 noundef 0, i32 noundef 1, i1 noundef zeroext %196, i1 noundef zeroext false, i1 noundef zeroext false)
  store double %197, ptr %31, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #5
  %198 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 10), align 8, !tbaa !59
  %199 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 9), align 8, !tbaa !60
  %200 = fadd double %198, %199
  %201 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 55
  %202 = load i8, ptr %201, align 8, !tbaa !38, !range !25, !noundef !26
  %203 = trunc i8 %202 to i1
  %204 = call noundef double @_Z6gate_Cddbbb(double noundef %200, double noundef 0.000000e+00, i1 noundef zeroext %203, i1 noundef zeroext false, i1 noundef zeroext false)
  %205 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 9), align 8, !tbaa !60
  %206 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 58
  %207 = load i8, ptr %206, align 1, !tbaa !24, !range !25, !noundef !26
  %208 = trunc i8 %207 to i1
  br i1 %208, label %209, label %213

209:                                              ; preds = %187
  %210 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 54
  %211 = getelementptr inbounds %class.Area, ptr %210, i32 0, i32 0
  %212 = load double, ptr %211, align 8, !tbaa !52
  br label %231

213:                                              ; preds = %187
  %214 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 53
  %215 = getelementptr inbounds %class.Area, ptr %214, i32 0, i32 0
  %216 = load double, ptr %215, align 8, !tbaa !53
  %217 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 50
  %218 = load i32, ptr %217, align 8, !tbaa !58
  %219 = sitofp i32 %218 to double
  %220 = fmul double %216, %219
  %221 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 75
  %222 = load i32, ptr %221, align 8, !tbaa !54
  %223 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 76
  %224 = load i32, ptr %223, align 4, !tbaa !55
  %225 = add nsw i32 %222, %224
  %226 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 78
  %227 = load i32, ptr %226, align 4, !tbaa !56
  %228 = add nsw i32 %225, %227
  %229 = sitofp i32 %228 to double
  %230 = fdiv double %220, %229
  br label %231

231:                                              ; preds = %213, %209
  %232 = phi double [ %212, %209 ], [ %230, %213 ]
  %233 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 55
  %234 = load i8, ptr %233, align 8, !tbaa !38, !range !25, !noundef !26
  %235 = trunc i8 %234 to i1
  %236 = call noundef double @_Z8drain_C_diiidbbb(double noundef %205, i32 noundef 1, i32 noundef 1, i32 noundef 0, double noundef %232, i1 noundef zeroext %235, i1 noundef zeroext false, i1 noundef zeroext false)
  %237 = fadd double %204, %236
  %238 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 10), align 8, !tbaa !59
  %239 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 58
  %240 = load i8, ptr %239, align 1, !tbaa !24, !range !25, !noundef !26
  %241 = trunc i8 %240 to i1
  br i1 %241, label %242, label %246

242:                                              ; preds = %231
  %243 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 54
  %244 = getelementptr inbounds %class.Area, ptr %243, i32 0, i32 0
  %245 = load double, ptr %244, align 8, !tbaa !52
  br label %264

246:                                              ; preds = %231
  %247 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 53
  %248 = getelementptr inbounds %class.Area, ptr %247, i32 0, i32 0
  %249 = load double, ptr %248, align 8, !tbaa !53
  %250 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 50
  %251 = load i32, ptr %250, align 8, !tbaa !58
  %252 = sitofp i32 %251 to double
  %253 = fmul double %249, %252
  %254 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 75
  %255 = load i32, ptr %254, align 8, !tbaa !54
  %256 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 76
  %257 = load i32, ptr %256, align 4, !tbaa !55
  %258 = add nsw i32 %255, %257
  %259 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 78
  %260 = load i32, ptr %259, align 4, !tbaa !56
  %261 = add nsw i32 %258, %260
  %262 = sitofp i32 %261 to double
  %263 = fdiv double %253, %262
  br label %264

264:                                              ; preds = %246, %242
  %265 = phi double [ %245, %242 ], [ %263, %246 ]
  %266 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 55
  %267 = load i8, ptr %266, align 8, !tbaa !38, !range !25, !noundef !26
  %268 = trunc i8 %267 to i1
  %269 = call noundef double @_Z8drain_C_diiidbbb(double noundef %238, i32 noundef 0, i32 noundef 1, i32 noundef 0, double noundef %265, i1 noundef zeroext %268, i1 noundef zeroext false, i1 noundef zeroext false)
  %270 = fadd double %237, %269
  store double %270, ptr %32, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #5
  %271 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 33), align 8, !tbaa !61
  %272 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 58
  %273 = load i8, ptr %272, align 1, !tbaa !24, !range !25, !noundef !26
  %274 = trunc i8 %273 to i1
  br i1 %274, label %275, label %279

275:                                              ; preds = %264
  %276 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 54
  %277 = getelementptr inbounds %class.Area, ptr %276, i32 0, i32 0
  %278 = load double, ptr %277, align 8, !tbaa !52
  br label %297

279:                                              ; preds = %264
  %280 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 53
  %281 = getelementptr inbounds %class.Area, ptr %280, i32 0, i32 0
  %282 = load double, ptr %281, align 8, !tbaa !53
  %283 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 50
  %284 = load i32, ptr %283, align 8, !tbaa !58
  %285 = sitofp i32 %284 to double
  %286 = fmul double %282, %285
  %287 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 75
  %288 = load i32, ptr %287, align 8, !tbaa !54
  %289 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 76
  %290 = load i32, ptr %289, align 4, !tbaa !55
  %291 = add nsw i32 %288, %290
  %292 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 78
  %293 = load i32, ptr %292, align 4, !tbaa !56
  %294 = add nsw i32 %291, %293
  %295 = sitofp i32 %294 to double
  %296 = fdiv double %286, %295
  br label %297

297:                                              ; preds = %279, %275
  %298 = phi double [ %278, %275 ], [ %296, %279 ]
  %299 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 55
  %300 = load i8, ptr %299, align 8, !tbaa !38, !range !25, !noundef !26
  %301 = trunc i8 %300 to i1
  %302 = call noundef double @_Z8drain_C_diiidbbb(double noundef %271, i32 noundef 1, i32 noundef 1, i32 noundef 0, double noundef %298, i1 noundef zeroext %301, i1 noundef zeroext false, i1 noundef zeroext false)
  store double %302, ptr %33, align 8, !tbaa !9
  %303 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 55
  %304 = load i8, ptr %303, align 8, !tbaa !38, !range !25, !noundef !26
  %305 = trunc i8 %304 to i1
  br i1 %305, label %306, label %388

306:                                              ; preds = %297
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #5
  %307 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 1
  %308 = load ptr, ptr %307, align 8, !tbaa !11
  %309 = getelementptr inbounds %class.DynamicParameter, ptr %308, i32 0, i32 34
  %310 = load double, ptr %309, align 8, !tbaa !62
  %311 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 28), align 8, !tbaa !43
  %312 = fdiv double %311, 2.000000e+00
  %313 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 30), align 8, !tbaa !63
  %314 = fmul double %312, %313
  %315 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 30), align 8, !tbaa !63
  %316 = load double, ptr %17, align 8, !tbaa !9
  %317 = fadd double %315, %316
  %318 = fdiv double %314, %317
  %319 = fdiv double %310, %318
  store double %319, ptr %34, align 8, !tbaa !9
  %320 = load double, ptr %34, align 8, !tbaa !9
  %321 = fmul double 2.300000e+00, %320
  %322 = load double, ptr %13, align 8, !tbaa !9
  %323 = fmul double %321, %322
  %324 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 30), align 8, !tbaa !63
  %325 = load double, ptr %17, align 8, !tbaa !9
  %326 = load double, ptr %30, align 8, !tbaa !9
  %327 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %326, double %325)
  %328 = load double, ptr %32, align 8, !tbaa !9
  %329 = fadd double %327, %328
  %330 = load double, ptr %33, align 8, !tbaa !9
  %331 = fadd double %329, %330
  %332 = fmul double %324, %331
  %333 = fmul double %323, %332
  %334 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 30), align 8, !tbaa !63
  %335 = load double, ptr %17, align 8, !tbaa !9
  %336 = load double, ptr %30, align 8, !tbaa !9
  %337 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %336, double %335)
  %338 = load double, ptr %32, align 8, !tbaa !9
  %339 = fadd double %337, %338
  %340 = load double, ptr %33, align 8, !tbaa !9
  %341 = fadd double %339, %340
  %342 = fadd double %334, %341
  %343 = fdiv double %333, %342
  store double %343, ptr %8, align 8, !tbaa !9
  %344 = load double, ptr %8, align 8, !tbaa !9
  %345 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 52
  store double %344, ptr %345, align 8, !tbaa !64
  %346 = load double, ptr %17, align 8, !tbaa !9
  %347 = load double, ptr %30, align 8, !tbaa !9
  %348 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %347, double %346)
  %349 = load double, ptr %32, align 8, !tbaa !9
  %350 = fadd double %348, %349
  %351 = load double, ptr %33, align 8, !tbaa !9
  %352 = fadd double %350, %351
  %353 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 28), align 8, !tbaa !43
  %354 = fdiv double %353, 2.000000e+00
  %355 = fmul double %352, %354
  %356 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 28), align 8, !tbaa !43
  %357 = load double, ptr %9, align 8, !tbaa !9
  %358 = call double @llvm.fmuladd.f64(double %355, double %356, double %357)
  store double %358, ptr %9, align 8, !tbaa !9
  %359 = load double, ptr %17, align 8, !tbaa !9
  %360 = load double, ptr %30, align 8, !tbaa !9
  %361 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %360, double %359)
  %362 = load double, ptr %32, align 8, !tbaa !9
  %363 = fadd double %361, %362
  %364 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 28), align 8, !tbaa !43
  %365 = fdiv double %364, 2.000000e+00
  %366 = fmul double %363, %365
  %367 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 28), align 8, !tbaa !43
  %368 = fmul double %366, %367
  %369 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 51
  %370 = load i32, ptr %369, align 4, !tbaa !65
  %371 = sitofp i32 %370 to double
  %372 = fmul double %368, %371
  %373 = load double, ptr %10, align 8, !tbaa !9
  %374 = call double @llvm.fmuladd.f64(double %372, double 1.000000e+02, double %373)
  store double %374, ptr %10, align 8, !tbaa !9
  %375 = load double, ptr %17, align 8, !tbaa !9
  %376 = load double, ptr %30, align 8, !tbaa !9
  %377 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %376, double %375)
  %378 = load double, ptr %32, align 8, !tbaa !9
  %379 = fadd double %377, %378
  %380 = load double, ptr %33, align 8, !tbaa !9
  %381 = fadd double %379, %380
  %382 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 28), align 8, !tbaa !43
  %383 = fdiv double %382, 2.000000e+00
  %384 = fmul double %381, %383
  %385 = load double, ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 28), align 8, !tbaa !43
  %386 = fmul double %384, %385
  %387 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 49
  store double %386, ptr %387, align 8, !tbaa !66
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #5
  br label %585

388:                                              ; preds = %297
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #5
  %389 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 50
  %390 = load i32, ptr %389, align 8, !tbaa !58
  %391 = icmp sgt i32 %390, 1
  br i1 %391, label %392, label %486

392:                                              ; preds = %388
  %393 = load double, ptr %11, align 8, !tbaa !9
  %394 = load double, ptr %12, align 8, !tbaa !9
  %395 = fadd double %393, %394
  %396 = load double, ptr %17, align 8, !tbaa !9
  %397 = load double, ptr %28, align 8, !tbaa !9
  %398 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %397, double %396)
  %399 = load double, ptr %30, align 8, !tbaa !9
  %400 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %399, double %398)
  %401 = load double, ptr %32, align 8, !tbaa !9
  %402 = fadd double %400, %401
  %403 = load double, ptr %33, align 8, !tbaa !9
  %404 = fadd double %402, %403
  %405 = load double, ptr %16, align 8, !tbaa !9
  %406 = load double, ptr %17, align 8, !tbaa !9
  %407 = fdiv double %406, 2.000000e+00
  %408 = load double, ptr %28, align 8, !tbaa !9
  %409 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %408, double %407)
  %410 = load double, ptr %30, align 8, !tbaa !9
  %411 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %410, double %409)
  %412 = load double, ptr %32, align 8, !tbaa !9
  %413 = fadd double %411, %412
  %414 = load double, ptr %33, align 8, !tbaa !9
  %415 = fadd double %413, %414
  %416 = fmul double %405, %415
  %417 = call double @llvm.fmuladd.f64(double %395, double %404, double %416)
  %418 = load double, ptr %29, align 8, !tbaa !9
  %419 = load double, ptr %28, align 8, !tbaa !9
  %420 = load double, ptr %30, align 8, !tbaa !9
  %421 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %420, double %419)
  %422 = load double, ptr %32, align 8, !tbaa !9
  %423 = fadd double %421, %422
  %424 = load double, ptr %33, align 8, !tbaa !9
  %425 = fadd double %423, %424
  %426 = call double @llvm.fmuladd.f64(double %418, double %425, double %417)
  %427 = load double, ptr %31, align 8, !tbaa !9
  %428 = load double, ptr %30, align 8, !tbaa !9
  %429 = load double, ptr %32, align 8, !tbaa !9
  %430 = fadd double %428, %429
  %431 = load double, ptr %33, align 8, !tbaa !9
  %432 = fadd double %430, %431
  %433 = call double @llvm.fmuladd.f64(double %427, double %432, double %426)
  store double %433, ptr %35, align 8, !tbaa !9
  %434 = load double, ptr %17, align 8, !tbaa !9
  %435 = load double, ptr %28, align 8, !tbaa !9
  %436 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %435, double %434)
  %437 = fmul double %436, 2.000000e+00
  %438 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 1
  %439 = load ptr, ptr %438, align 8, !tbaa !11
  %440 = getelementptr inbounds %class.DynamicParameter, ptr %439, i32 0, i32 34
  %441 = load double, ptr %440, align 8, !tbaa !62
  %442 = fmul double %437, %441
  %443 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 9), align 8, !tbaa !47
  %444 = load double, ptr %9, align 8, !tbaa !9
  %445 = call double @llvm.fmuladd.f64(double %442, double %443, double %444)
  store double %445, ptr %9, align 8, !tbaa !9
  %446 = load double, ptr %30, align 8, !tbaa !9
  %447 = load double, ptr %32, align 8, !tbaa !9
  %448 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %446, double %447)
  %449 = load double, ptr %33, align 8, !tbaa !9
  %450 = fadd double %448, %449
  %451 = fmul double %450, 2.000000e+00
  %452 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 1
  %453 = load ptr, ptr %452, align 8, !tbaa !11
  %454 = getelementptr inbounds %class.DynamicParameter, ptr %453, i32 0, i32 34
  %455 = load double, ptr %454, align 8, !tbaa !62
  %456 = fmul double %451, %455
  %457 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 9), align 8, !tbaa !47
  %458 = fmul double %456, %457
  %459 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 50
  %460 = load i32, ptr %459, align 8, !tbaa !58
  %461 = sitofp i32 %460 to double
  %462 = fdiv double 1.000000e+00, %461
  %463 = load double, ptr %9, align 8, !tbaa !9
  %464 = call double @llvm.fmuladd.f64(double %458, double %462, double %463)
  store double %464, ptr %9, align 8, !tbaa !9
  %465 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 50
  %466 = load i32, ptr %465, align 8, !tbaa !58
  %467 = sitofp i32 %466 to double
  %468 = fdiv double 1.000000e+00, %467
  %469 = load i32, ptr %14, align 4, !tbaa !23
  %470 = sitofp i32 %469 to double
  %471 = fdiv double %468, %470
  %472 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 51
  %473 = load i32, ptr %472, align 4, !tbaa !65
  %474 = sitofp i32 %473 to double
  %475 = fmul double %471, %474
  %476 = load double, ptr %17, align 8, !tbaa !9
  %477 = load double, ptr %28, align 8, !tbaa !9
  %478 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %477, double %476)
  %479 = fmul double %475, %478
  %480 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 9), align 8, !tbaa !47
  %481 = fmul double %479, %480
  %482 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 9), align 8, !tbaa !47
  %483 = fmul double %481, %482
  %484 = load double, ptr %10, align 8, !tbaa !9
  %485 = call double @llvm.fmuladd.f64(double %483, double 2.000000e+00, double %484)
  store double %485, ptr %10, align 8, !tbaa !9
  br label %544

486:                                              ; preds = %388
  %487 = load double, ptr %11, align 8, !tbaa !9
  %488 = load double, ptr %12, align 8, !tbaa !9
  %489 = fadd double %487, %488
  %490 = load double, ptr %17, align 8, !tbaa !9
  %491 = load double, ptr %30, align 8, !tbaa !9
  %492 = fadd double %490, %491
  %493 = load double, ptr %32, align 8, !tbaa !9
  %494 = fadd double %492, %493
  %495 = load double, ptr %33, align 8, !tbaa !9
  %496 = fadd double %494, %495
  %497 = load double, ptr %16, align 8, !tbaa !9
  %498 = load double, ptr %17, align 8, !tbaa !9
  %499 = fmul double %497, %498
  %500 = fdiv double %499, 2.000000e+00
  %501 = call double @llvm.fmuladd.f64(double %489, double %496, double %500)
  %502 = load double, ptr %31, align 8, !tbaa !9
  %503 = load double, ptr %30, align 8, !tbaa !9
  %504 = load double, ptr %32, align 8, !tbaa !9
  %505 = fadd double %503, %504
  %506 = load double, ptr %33, align 8, !tbaa !9
  %507 = fadd double %505, %506
  %508 = call double @llvm.fmuladd.f64(double %502, double %507, double %501)
  store double %508, ptr %35, align 8, !tbaa !9
  %509 = load double, ptr %17, align 8, !tbaa !9
  %510 = load double, ptr %30, align 8, !tbaa !9
  %511 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %510, double %509)
  %512 = load double, ptr %32, align 8, !tbaa !9
  %513 = fadd double %511, %512
  %514 = load double, ptr %33, align 8, !tbaa !9
  %515 = fadd double %513, %514
  %516 = fmul double %515, 2.000000e+00
  %517 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 1
  %518 = load ptr, ptr %517, align 8, !tbaa !11
  %519 = getelementptr inbounds %class.DynamicParameter, ptr %518, i32 0, i32 34
  %520 = load double, ptr %519, align 8, !tbaa !62
  %521 = fmul double %516, %520
  %522 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 9), align 8, !tbaa !47
  %523 = load double, ptr %9, align 8, !tbaa !9
  %524 = call double @llvm.fmuladd.f64(double %521, double %522, double %523)
  store double %524, ptr %9, align 8, !tbaa !9
  %525 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 50
  %526 = load i32, ptr %525, align 8, !tbaa !58
  %527 = sitofp i32 %526 to double
  %528 = fdiv double 1.000000e+00, %527
  %529 = load i32, ptr %14, align 4, !tbaa !23
  %530 = sitofp i32 %529 to double
  %531 = fdiv double %528, %530
  %532 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 51
  %533 = load i32, ptr %532, align 4, !tbaa !65
  %534 = sitofp i32 %533 to double
  %535 = fmul double %531, %534
  %536 = load double, ptr %17, align 8, !tbaa !9
  %537 = fmul double %535, %536
  %538 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 9), align 8, !tbaa !47
  %539 = fmul double %537, %538
  %540 = load double, ptr getelementptr inbounds (%"class.TechnologyParameter::DeviceType", ptr getelementptr inbounds (%class.TechnologyParameter, ptr @g_tp, i32 0, i32 45), i32 0, i32 9), align 8, !tbaa !47
  %541 = fmul double %539, %540
  %542 = load double, ptr %10, align 8, !tbaa !9
  %543 = call double @llvm.fmuladd.f64(double %541, double 2.000000e+00, double %542)
  store double %543, ptr %10, align 8, !tbaa !9
  br label %544

544:                                              ; preds = %486, %392
  %545 = load double, ptr %35, align 8, !tbaa !9
  %546 = load double, ptr %5, align 8, !tbaa !9
  %547 = load double, ptr %5, align 8, !tbaa !9
  %548 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 1
  %549 = load ptr, ptr %548, align 8, !tbaa !11
  %550 = getelementptr inbounds %class.DynamicParameter, ptr %549, i32 0, i32 34
  %551 = load double, ptr %550, align 8, !tbaa !62
  %552 = fsub double %547, %551
  %553 = fdiv double %546, %552
  %554 = call double @log(double noundef %553) #5
  %555 = fmul double %545, %554
  store double %555, ptr %8, align 8, !tbaa !9
  %556 = load double, ptr %18, align 8, !tbaa !9
  %557 = load double, ptr %20, align 8, !tbaa !9
  %558 = fadd double %556, %557
  %559 = load double, ptr %20, align 8, !tbaa !9
  %560 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 75
  %561 = load i32, ptr %560, align 8, !tbaa !54
  %562 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 77
  %563 = load i32, ptr %562, align 8, !tbaa !67
  %564 = add nsw i32 %561, %563
  %565 = sub nsw i32 %564, 1
  %566 = sitofp i32 %565 to double
  %567 = call double @llvm.fmuladd.f64(double %559, double %566, double %558)
  %568 = load double, ptr %21, align 8, !tbaa !9
  %569 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 76
  %570 = load i32, ptr %569, align 4, !tbaa !55
  %571 = sitofp i32 %570 to double
  %572 = call double @llvm.fmuladd.f64(double %568, double %571, double %567)
  %573 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 46
  %574 = getelementptr inbounds %class.powerDef, ptr %573, i32 0, i32 0
  %575 = getelementptr inbounds %class.powerComponents, ptr %574, i32 0, i32 1
  store double %572, ptr %575, align 8, !tbaa !68
  %576 = load double, ptr %19, align 8, !tbaa !9
  %577 = load double, ptr %22, align 8, !tbaa !9
  %578 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 76
  %579 = load i32, ptr %578, align 4, !tbaa !55
  %580 = sitofp i32 %579 to double
  %581 = call double @llvm.fmuladd.f64(double %577, double %580, double %576)
  %582 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 46
  %583 = getelementptr inbounds %class.powerDef, ptr %582, i32 0, i32 0
  %584 = getelementptr inbounds %class.powerComponents, ptr %583, i32 0, i32 2
  store double %581, ptr %584, align 8, !tbaa !69
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #5
  br label %585

585:                                              ; preds = %544, %306
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #5
  %586 = load double, ptr %7, align 8, !tbaa !9
  %587 = load double, ptr %4, align 8, !tbaa !9
  %588 = fdiv double %586, %587
  store double %588, ptr %36, align 8, !tbaa !9
  %589 = load double, ptr %8, align 8, !tbaa !9
  %590 = load double, ptr %7, align 8, !tbaa !9
  %591 = load double, ptr %6, align 8, !tbaa !9
  %592 = fsub double %590, %591
  %593 = fmul double 5.000000e-01, %592
  %594 = load double, ptr %36, align 8, !tbaa !9
  %595 = fdiv double %593, %594
  %596 = fcmp ole double %589, %595
  br i1 %596, label %597, label %608

597:                                              ; preds = %585
  %598 = load double, ptr %8, align 8, !tbaa !9
  %599 = fmul double 2.000000e+00, %598
  %600 = load double, ptr %7, align 8, !tbaa !9
  %601 = load double, ptr %6, align 8, !tbaa !9
  %602 = fsub double %600, %601
  %603 = fmul double %599, %602
  %604 = load double, ptr %36, align 8, !tbaa !9
  %605 = fdiv double %603, %604
  %606 = call double @sqrt(double noundef %605) #5
  %607 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 35
  store double %606, ptr %607, align 8, !tbaa !70
  br label %618

608:                                              ; preds = %585
  %609 = load double, ptr %8, align 8, !tbaa !9
  %610 = load double, ptr %7, align 8, !tbaa !9
  %611 = load double, ptr %6, align 8, !tbaa !9
  %612 = fsub double %610, %611
  %613 = load double, ptr %36, align 8, !tbaa !9
  %614 = fmul double 2.000000e+00, %613
  %615 = fdiv double %612, %614
  %616 = fadd double %609, %615
  %617 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 35
  store double %616, ptr %617, align 8, !tbaa !70
  br label %618

618:                                              ; preds = %608, %597
  call void @llvm.lifetime.start.p0(i64 1, ptr %37) #5
  %619 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 1
  %620 = load ptr, ptr %619, align 8, !tbaa !11
  %621 = getelementptr inbounds %class.DynamicParameter, ptr %620, i32 0, i32 3
  %622 = load i8, ptr %621, align 1, !tbaa !71, !range !25, !noundef !26
  %623 = trunc i8 %622 to i1
  %624 = zext i1 %623 to i64
  %625 = select i1 %623, i1 true, i1 false
  %626 = zext i1 %625 to i8
  store i8 %626, ptr %37, align 1, !tbaa !72
  %627 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 1
  %628 = load ptr, ptr %627, align 8, !tbaa !11
  %629 = getelementptr inbounds %class.DynamicParameter, ptr %628, i32 0, i32 0
  %630 = load i8, ptr %629, align 8, !tbaa !73, !range !25, !noundef !26
  %631 = trunc i8 %630 to i1
  %632 = zext i1 %631 to i32
  %633 = icmp eq i32 %632, 0
  br i1 %633, label %639, label %634

634:                                              ; preds = %618
  %635 = load i8, ptr %37, align 1, !tbaa !72, !range !25, !noundef !26
  %636 = trunc i8 %635 to i1
  %637 = zext i1 %636 to i32
  %638 = icmp eq i32 %637, 0
  br i1 %638, label %639, label %648

639:                                              ; preds = %634, %618
  %640 = load double, ptr %9, align 8, !tbaa !9
  %641 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 46
  %642 = getelementptr inbounds %class.powerDef, ptr %641, i32 0, i32 0
  %643 = getelementptr inbounds %class.powerComponents, ptr %642, i32 0, i32 0
  store double %640, ptr %643, align 8, !tbaa !74
  %644 = load double, ptr %10, align 8, !tbaa !9
  %645 = getelementptr inbounds %class.Mat, ptr %39, i32 0, i32 46
  %646 = getelementptr inbounds %class.powerDef, ptr %645, i32 0, i32 1
  %647 = getelementptr inbounds %class.powerComponents, ptr %646, i32 0, i32 0
  store double %644, ptr %647, align 8, !tbaa !75
  br label %648

648:                                              ; preds = %639, %634
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #5
  store double 0.000000e+00, ptr %38, align 8, !tbaa !9
  %649 = load double, ptr %38, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #5
  call void @llvm.lifetime.end.p0(i64 1, ptr %37) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #5
  ret double %649
}

declare noundef double @_Z17cmos_Isub_leakageddi9Gate_typebbb17Half_net_topology(double noundef, double noundef, i32 noundef, i32 noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext, i32 noundef) #2

declare noundef double @_Z15cmos_Ig_leakageddi9Gate_typebbb17Half_net_topology(double noundef, double noundef, i32 noundef, i32 noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext, i32 noundef) #2

; Function Attrs: nounwind
declare double @sqrt(double noundef) #3

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"double", !7, i64 0}
!11 = !{!12, !6, i64 280}
!12 = !{!"_ZTS3Mat", !13, i64 0, !6, i64 280, !6, i64 288, !6, i64 296, !6, i64 304, !6, i64 312, !6, i64 320, !6, i64 328, !6, i64 336, !6, i64 344, !6, i64 352, !6, i64 360, !6, i64 368, !6, i64 376, !6, i64 384, !6, i64 392, !6, i64 400, !6, i64 408, !6, i64 416, !6, i64 424, !6, i64 432, !15, i64 440, !15, i64 560, !15, i64 680, !15, i64 800, !15, i64 920, !15, i64 1040, !15, i64 1160, !15, i64 1280, !15, i64 1400, !15, i64 1520, !15, i64 1640, !10, i64 1760, !10, i64 1768, !10, i64 1776, !10, i64 1784, !10, i64 1792, !10, i64 1800, !10, i64 1808, !10, i64 1816, !10, i64 1824, !10, i64 1832, !10, i64 1840, !10, i64 1848, !10, i64 1856, !17, i64 1864, !15, i64 2288, !15, i64 2408, !15, i64 2528, !10, i64 2648, !18, i64 2656, !18, i64 2660, !10, i64 2664, !14, i64 2672, !14, i64 2696, !19, i64 2720, !19, i64 2721, !19, i64 2722, !19, i64 2723, !18, i64 2724, !15, i64 2728, !10, i64 2848, !10, i64 2856, !10, i64 2864, !10, i64 2872, !10, i64 2880, !10, i64 2888, !15, i64 2896, !18, i64 3016, !18, i64 3020, !18, i64 3024, !18, i64 3028, !10, i64 3032, !18, i64 3040, !18, i64 3044, !18, i64 3048, !18, i64 3052, !18, i64 3056, !18, i64 3060}
!13 = !{!"_ZTS9Component", !14, i64 0, !15, i64 24, !15, i64 144, !10, i64 264, !10, i64 272}
!14 = !{!"_ZTS4Area", !10, i64 0, !10, i64 8, !10, i64 16}
!15 = !{!"_ZTS8powerDef", !16, i64 0, !16, i64 40, !16, i64 80}
!16 = !{!"_ZTS15powerComponents", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32}
!17 = !{!"_ZTS8Subarray", !13, i64 0, !6, i64 280, !18, i64 288, !18, i64 292, !18, i64 296, !18, i64 300, !14, i64 304, !14, i64 328, !19, i64 352, !10, i64 360, !10, i64 368, !10, i64 376, !10, i64 384, !10, i64 392, !10, i64 400, !10, i64 408, !10, i64 416}
!18 = !{!"int", !7, i64 0}
!19 = !{!"bool", !7, i64 0}
!20 = !{!21, !18, i64 44}
!21 = !{!"_ZTS16DynamicParameter", !19, i64 0, !19, i64 1, !19, i64 2, !19, i64 3, !18, i64 4, !18, i64 8, !18, i64 12, !10, i64 16, !18, i64 24, !18, i64 28, !18, i64 32, !18, i64 36, !18, i64 40, !18, i64 44, !18, i64 48, !18, i64 52, !18, i64 56, !18, i64 60, !18, i64 64, !18, i64 68, !18, i64 72, !18, i64 76, !18, i64 80, !18, i64 84, !18, i64 88, !18, i64 92, !18, i64 96, !18, i64 100, !18, i64 104, !18, i64 108, !18, i64 112, !18, i64 116, !19, i64 120, !10, i64 128, !18, i64 136, !18, i64 140, !18, i64 144, !18, i64 148, !18, i64 152, !18, i64 156, !18, i64 160, !18, i64 164, !18, i64 168, !10, i64 176, !18, i64 184, !18, i64 188, !18, i64 192, !18, i64 196, !18, i64 200, !18, i64 204, !18, i64 208, !19, i64 212, !14, i64 216, !14, i64 240, !19, i64 264}
!22 = !{!21, !18, i64 48}
!23 = !{!18, !18, i64 0}
!24 = !{!12, !19, i64 2723}
!25 = !{i8 0, i8 2}
!26 = !{}
!27 = !{!12, !10, i64 2704}
!28 = !{!12, !10, i64 2680}
!29 = !{!30, !10, i64 1208}
!30 = !{!"_ZTS19TechnologyParameter", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !10, i64 128, !10, i64 136, !10, i64 144, !10, i64 152, !10, i64 160, !10, i64 168, !10, i64 176, !10, i64 184, !10, i64 192, !10, i64 200, !10, i64 208, !10, i64 216, !10, i64 224, !10, i64 232, !10, i64 240, !10, i64 248, !10, i64 256, !10, i64 264, !10, i64 272, !10, i64 280, !10, i64 288, !10, i64 296, !10, i64 304, !10, i64 312, !10, i64 320, !10, i64 328, !10, i64 336, !10, i64 344, !31, i64 352, !32, i64 360, !32, i64 528, !32, i64 696, !32, i64 864, !32, i64 1032, !33, i64 1200, !33, i64 1264, !33, i64 1328, !34, i64 1392, !35, i64 1416, !35, i64 1464, !35, i64 1512}
!31 = !{!"long", !7, i64 0}
!32 = !{!"_ZTSN19TechnologyParameter10DeviceTypeE", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !10, i64 128, !10, i64 136, !10, i64 144, !10, i64 152, !10, i64 160}
!33 = !{!"_ZTSN19TechnologyParameter16InterconnectTypeE", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56}
!34 = !{!"_ZTSN19TechnologyParameter13ScalingFactorE", !10, i64 0, !10, i64 8, !10, i64 16}
!35 = !{!"_ZTSN19TechnologyParameter10MemoryTypeE", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !10, i64 40}
!36 = !{!12, !18, i64 2152}
!37 = !{!12, !10, i64 2272}
!38 = !{!12, !19, i64 2720}
!39 = !{!30, !10, i64 1504}
!40 = !{!30, !10, i64 608}
!41 = !{!30, !10, i64 56}
!42 = !{!30, !10, i64 1480}
!43 = !{!30, !10, i64 224}
!44 = !{!30, !10, i64 216}
!45 = !{!30, !10, i64 1456}
!46 = !{!30, !10, i64 440}
!47 = !{!30, !10, i64 432}
!48 = !{!30, !10, i64 1448}
!49 = !{!30, !10, i64 1432}
!50 = !{!30, !10, i64 1440}
!51 = !{!30, !10, i64 256}
!52 = !{!12, !10, i64 2696}
!53 = !{!12, !10, i64 2672}
!54 = !{!12, !18, i64 3048}
!55 = !{!12, !18, i64 3052}
!56 = !{!12, !18, i64 3060}
!57 = !{!30, !10, i64 104}
!58 = !{!12, !18, i64 2656}
!59 = !{!30, !10, i64 80}
!60 = !{!30, !10, i64 72}
!61 = !{!30, !10, i64 264}
!62 = !{!21, !10, i64 128}
!63 = !{!30, !10, i64 240}
!64 = !{!12, !10, i64 2664}
!65 = !{!12, !18, i64 2660}
!66 = !{!12, !10, i64 2648}
!67 = !{!12, !18, i64 3056}
!68 = !{!12, !10, i64 2296}
!69 = !{!12, !10, i64 2304}
!70 = !{!12, !10, i64 1784}
!71 = !{!21, !19, i64 3}
!72 = !{!19, !19, i64 0}
!73 = !{!21, !19, i64 0}
!74 = !{!12, !10, i64 2288}
!75 = !{!12, !10, i64 2328}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%class.TechnologyParameter = type { double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, i64, %"class.TechnologyParameter::DeviceType", %"class.TechnologyParameter::DeviceType", %"class.TechnologyParameter::DeviceType", %"class.TechnologyParameter::DeviceType", %"class.TechnologyParameter::DeviceType", %"class.TechnologyParameter::InterconnectType", %"class.TechnologyParameter::InterconnectType", %"class.TechnologyParameter::InterconnectType", %"class.TechnologyParameter::ScalingFactor", %"class.TechnologyParameter::MemoryType", %"class.TechnologyParameter::MemoryType", %"class.TechnologyParameter::MemoryType" }
%"class.TechnologyParameter::DeviceType" = type { double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double, double }
%"class.TechnologyParameter::InterconnectType" = type { double, double, double, double, double, double, double, double }
%"class.TechnologyParameter::ScalingFactor" = type { double, double, double }
%"class.TechnologyParameter::MemoryType" = type { double, double, double, double, double, double }

@g_tp = external local_unnamed_addr global %class.TechnologyParameter, align 8

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #0

declare noundef double @_Z6gate_Cddbbb(double noundef, double noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) local_unnamed_addr #1

declare noundef double @_Z7tr_R_ondiibbb(double noundef, i32 noundef, i32 noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) local_unnamed_addr #1

declare noundef double @_Z8drain_C_diiidbbb(double noundef, i32 noundef, i32 noundef, i32 noundef, double noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext) local_unnamed_addr #1

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare double @log(double noundef) local_unnamed_addr #2

; Function Attrs: mustprogress uwtable
define dso_local noundef double @_ZN3Mat21compute_bitline_delayEd(ptr noundef nonnull align 8 dereferenceable(3064) %0, double noundef %1) local_unnamed_addr #3 align 2 {
  %3 = getelementptr inbounds i8, ptr %0, i64 280
  %4 = load ptr, ptr %3, align 8, !tbaa !5
  %5 = getelementptr inbounds i8, ptr %4, i64 44
  %6 = load i32, ptr %5, align 4, !tbaa !18
  %7 = getelementptr inbounds i8, ptr %4, i64 48
  %8 = load i32, ptr %7, align 8, !tbaa !20
  %9 = mul nsw i32 %8, %6
  %10 = getelementptr inbounds i8, ptr %0, i64 2723
  %11 = load i8, ptr %10, align 1, !tbaa !21, !range !22, !noundef !23
  %12 = trunc nuw i8 %11 to i1
  %13 = getelementptr inbounds i8, ptr %0, i64 2704
  %14 = load double, ptr %13, align 8
  %15 = getelementptr inbounds i8, ptr %0, i64 2680
  %16 = load double, ptr %15, align 8
  %17 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 1208), align 8
  %18 = fmul double %16, %17
  %19 = select i1 %12, double %14, double %18
  %20 = getelementptr inbounds i8, ptr %0, i64 2152
  %21 = load i32, ptr %20, align 8, !tbaa !24
  %22 = uitofp i32 %21 to double
  %23 = fmul double %19, %22
  %24 = getelementptr inbounds i8, ptr %0, i64 2272
  %25 = load double, ptr %24, align 8, !tbaa !25
  %26 = getelementptr inbounds i8, ptr %0, i64 2720
  %27 = load i8, ptr %26, align 8, !tbaa !26, !range !22, !noundef !23
  %28 = trunc nuw i8 %27 to i1
  br i1 %28, label %29, label %40

29:                                               ; preds = %2
  %30 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 1504), align 8, !tbaa !27
  %31 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 608), align 8, !tbaa !34
  %32 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 56), align 8, !tbaa !35
  %33 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 1480), align 8, !tbaa !36
  %34 = tail call noundef double @_Z7tr_R_ondiibbb(double noundef %33, i32 noundef 1, i32 noundef 1, i1 noundef zeroext true, i1 noundef zeroext true, i1 noundef zeroext false)
  %35 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 224), align 8, !tbaa !37
  %36 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 216), align 8, !tbaa !38
  %37 = fdiv double %35, %36
  %38 = fmul double %23, 5.000000e-01
  %39 = fadd double %38, %37
  br label %68

40:                                               ; preds = %2
  %41 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 1456), align 8, !tbaa !39
  %42 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 440), align 8, !tbaa !40
  %43 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 432), align 8, !tbaa !41
  %44 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 1448), align 8, !tbaa !42
  %45 = tail call noundef double @_Z7tr_R_ondiibbb(double noundef %44, i32 noundef 1, i32 noundef 1, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false)
  %46 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 1432), align 8, !tbaa !43
  %47 = tail call noundef double @_Z7tr_R_ondiibbb(double noundef %46, i32 noundef 1, i32 noundef 1, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false)
  %48 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 1432), align 8, !tbaa !43
  %49 = tail call noundef double @_Z17cmos_Isub_leakageddi9Gate_typebbb17Half_net_topology(double noundef %48, double noundef 0.000000e+00, i32 noundef 1, i32 noundef 0, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false, i32 noundef 1)
  %50 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 1432), align 8, !tbaa !43
  %51 = tail call noundef double @_Z17cmos_Isub_leakageddi9Gate_typebbb17Half_net_topology(double noundef %50, double noundef 0.000000e+00, i32 noundef 2, i32 noundef 0, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false, i32 noundef 1)
  %52 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 1448), align 8, !tbaa !42
  %53 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 1440), align 8, !tbaa !44
  %54 = tail call noundef double @_Z17cmos_Isub_leakageddi9Gate_typebbb17Half_net_topology(double noundef %52, double noundef %53, i32 noundef 1, i32 noundef 2, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false, i32 noundef 1)
  %55 = fmul double %54, 2.000000e+00
  %56 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 432), align 8, !tbaa !41
  %57 = fmul double %55, %56
  %58 = fmul double %49, %56
  %59 = fmul double %51, %56
  %60 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 1432), align 8, !tbaa !43
  %61 = tail call noundef double @_Z15cmos_Ig_leakageddi9Gate_typebbb17Half_net_topology(double noundef %60, double noundef 0.000000e+00, i32 noundef 1, i32 noundef 0, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false, i32 noundef 1)
  %62 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 1448), align 8, !tbaa !42
  %63 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 1440), align 8, !tbaa !44
  %64 = tail call noundef double @_Z15cmos_Ig_leakageddi9Gate_typebbb17Half_net_topology(double noundef %62, double noundef %63, i32 noundef 1, i32 noundef 2, i1 noundef zeroext false, i1 noundef zeroext true, i1 noundef zeroext false, i32 noundef 1)
  %65 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 432), align 8, !tbaa !41
  %66 = fmul double %64, %65
  %67 = fmul double %61, %65
  br label %68

68:                                               ; preds = %40, %29
  %.0126 = phi double [ 0.000000e+00, %29 ], [ %67, %40 ]
  %.0125 = phi double [ 0.000000e+00, %29 ], [ %59, %40 ]
  %.0124 = phi double [ 0.000000e+00, %29 ], [ %58, %40 ]
  %.0123 = phi double [ 0.000000e+00, %29 ], [ %66, %40 ]
  %.0122 = phi double [ 0.000000e+00, %29 ], [ %57, %40 ]
  %.0121 = phi double [ %39, %29 ], [ 0.000000e+00, %40 ]
  %.0120 = phi double [ %34, %29 ], [ %47, %40 ]
  %.0119 = phi double [ 0.000000e+00, %29 ], [ %45, %40 ]
  %.0113 = phi double [ %32, %29 ], [ %43, %40 ]
  %.0112 = phi double [ %31, %29 ], [ %42, %40 ]
  %.0 = phi double [ %30, %29 ], [ %41, %40 ]
  %69 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 256), align 8, !tbaa !45
  %70 = load i8, ptr %10, align 1, !tbaa !21, !range !22, !noundef !23
  %71 = trunc nuw i8 %70 to i1
  br i1 %71, label %72, label %75

72:                                               ; preds = %68
  %73 = getelementptr inbounds i8, ptr %0, i64 2696
  %74 = load double, ptr %73, align 8, !tbaa !46
  br label %89

75:                                               ; preds = %68
  %76 = getelementptr inbounds i8, ptr %0, i64 2672
  %77 = load double, ptr %76, align 8, !tbaa !47
  %78 = getelementptr inbounds i8, ptr %0, i64 3048
  %79 = load i32, ptr %78, align 8, !tbaa !48
  %80 = getelementptr inbounds i8, ptr %0, i64 3052
  %81 = load i32, ptr %80, align 4, !tbaa !49
  %82 = add nsw i32 %81, %79
  %83 = getelementptr inbounds i8, ptr %0, i64 3060
  %84 = load i32, ptr %83, align 4, !tbaa !50
  %85 = add nsw i32 %82, %84
  %86 = shl nsw i32 %85, 1
  %87 = sitofp i32 %86 to double
  %88 = fdiv double %77, %87
  br label %89

89:                                               ; preds = %75, %72
  %90 = phi double [ %74, %72 ], [ %88, %75 ]
  %91 = load i8, ptr %26, align 8, !tbaa !26, !range !22, !noundef !23
  %92 = trunc nuw i8 %91 to i1
  %93 = tail call noundef double @_Z8drain_C_diiidbbb(double noundef %69, i32 noundef 1, i32 noundef 1, i32 noundef 0, double noundef %90, i1 noundef zeroext %92, i1 noundef zeroext false, i1 noundef zeroext false)
  %94 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 256), align 8, !tbaa !45
  %95 = load i8, ptr %26, align 8, !tbaa !26, !range !22, !noundef !23
  %96 = trunc nuw i8 %95 to i1
  %97 = tail call noundef double @_Z7tr_R_ondiibbb(double noundef %94, i32 noundef 1, i32 noundef 1, i1 noundef zeroext %96, i1 noundef zeroext false, i1 noundef zeroext false)
  %98 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 104), align 8, !tbaa !51
  %99 = load i8, ptr %10, align 1, !tbaa !21, !range !22, !noundef !23
  %100 = trunc nuw i8 %99 to i1
  br i1 %100, label %101, label %104

101:                                              ; preds = %89
  %102 = getelementptr inbounds i8, ptr %0, i64 2696
  %103 = load double, ptr %102, align 8, !tbaa !46
  br label %121

104:                                              ; preds = %89
  %105 = getelementptr inbounds i8, ptr %0, i64 2672
  %106 = load double, ptr %105, align 8, !tbaa !47
  %107 = getelementptr inbounds i8, ptr %0, i64 2656
  %108 = load i32, ptr %107, align 8, !tbaa !52
  %109 = sitofp i32 %108 to double
  %110 = fmul double %106, %109
  %111 = getelementptr inbounds i8, ptr %0, i64 3048
  %112 = load i32, ptr %111, align 8, !tbaa !48
  %113 = getelementptr inbounds i8, ptr %0, i64 3052
  %114 = load i32, ptr %113, align 4, !tbaa !49
  %115 = add nsw i32 %114, %112
  %116 = getelementptr inbounds i8, ptr %0, i64 3060
  %117 = load i32, ptr %116, align 4, !tbaa !50
  %118 = add nsw i32 %115, %117
  %119 = sitofp i32 %118 to double
  %120 = fdiv double %110, %119
  br label %121

121:                                              ; preds = %104, %101
  %122 = phi double [ %103, %101 ], [ %120, %104 ]
  %123 = load i8, ptr %26, align 8, !tbaa !26, !range !22, !noundef !23
  %124 = trunc nuw i8 %123 to i1
  %125 = tail call noundef double @_Z8drain_C_diiidbbb(double noundef %98, i32 noundef 0, i32 noundef 1, i32 noundef 0, double noundef %122, i1 noundef zeroext %124, i1 noundef zeroext false, i1 noundef zeroext false)
  %126 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 104), align 8, !tbaa !51
  %127 = load i8, ptr %26, align 8, !tbaa !26, !range !22, !noundef !23
  %128 = trunc nuw i8 %127 to i1
  %129 = tail call noundef double @_Z7tr_R_ondiibbb(double noundef %126, i32 noundef 0, i32 noundef 1, i1 noundef zeroext %128, i1 noundef zeroext false, i1 noundef zeroext false)
  %130 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 80), align 8, !tbaa !53
  %131 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 72), align 8, !tbaa !54
  %132 = fadd double %130, %131
  %133 = load i8, ptr %26, align 8, !tbaa !26, !range !22, !noundef !23
  %134 = trunc nuw i8 %133 to i1
  %135 = tail call noundef double @_Z6gate_Cddbbb(double noundef %132, double noundef 0.000000e+00, i1 noundef zeroext %134, i1 noundef zeroext false, i1 noundef zeroext false)
  %136 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 72), align 8, !tbaa !54
  %137 = load i8, ptr %10, align 1, !tbaa !21, !range !22, !noundef !23
  %138 = trunc nuw i8 %137 to i1
  br i1 %138, label %139, label %142

139:                                              ; preds = %121
  %140 = getelementptr inbounds i8, ptr %0, i64 2696
  %141 = load double, ptr %140, align 8, !tbaa !46
  br label %159

142:                                              ; preds = %121
  %143 = getelementptr inbounds i8, ptr %0, i64 2672
  %144 = load double, ptr %143, align 8, !tbaa !47
  %145 = getelementptr inbounds i8, ptr %0, i64 2656
  %146 = load i32, ptr %145, align 8, !tbaa !52
  %147 = sitofp i32 %146 to double
  %148 = fmul double %144, %147
  %149 = getelementptr inbounds i8, ptr %0, i64 3048
  %150 = load i32, ptr %149, align 8, !tbaa !48
  %151 = getelementptr inbounds i8, ptr %0, i64 3052
  %152 = load i32, ptr %151, align 4, !tbaa !49
  %153 = add nsw i32 %152, %150
  %154 = getelementptr inbounds i8, ptr %0, i64 3060
  %155 = load i32, ptr %154, align 4, !tbaa !50
  %156 = add nsw i32 %153, %155
  %157 = sitofp i32 %156 to double
  %158 = fdiv double %148, %157
  br label %159

159:                                              ; preds = %142, %139
  %160 = phi double [ %141, %139 ], [ %158, %142 ]
  %161 = load i8, ptr %26, align 8, !tbaa !26, !range !22, !noundef !23
  %162 = trunc nuw i8 %161 to i1
  %163 = tail call noundef double @_Z8drain_C_diiidbbb(double noundef %136, i32 noundef 1, i32 noundef 1, i32 noundef 0, double noundef %160, i1 noundef zeroext %162, i1 noundef zeroext false, i1 noundef zeroext false)
  %164 = fadd double %135, %163
  %165 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 80), align 8, !tbaa !53
  %166 = load i8, ptr %10, align 1, !tbaa !21, !range !22, !noundef !23
  %167 = trunc nuw i8 %166 to i1
  br i1 %167, label %168, label %171

168:                                              ; preds = %159
  %169 = getelementptr inbounds i8, ptr %0, i64 2696
  %170 = load double, ptr %169, align 8, !tbaa !46
  br label %188

171:                                              ; preds = %159
  %172 = getelementptr inbounds i8, ptr %0, i64 2672
  %173 = load double, ptr %172, align 8, !tbaa !47
  %174 = getelementptr inbounds i8, ptr %0, i64 2656
  %175 = load i32, ptr %174, align 8, !tbaa !52
  %176 = sitofp i32 %175 to double
  %177 = fmul double %173, %176
  %178 = getelementptr inbounds i8, ptr %0, i64 3048
  %179 = load i32, ptr %178, align 8, !tbaa !48
  %180 = getelementptr inbounds i8, ptr %0, i64 3052
  %181 = load i32, ptr %180, align 4, !tbaa !49
  %182 = add nsw i32 %181, %179
  %183 = getelementptr inbounds i8, ptr %0, i64 3060
  %184 = load i32, ptr %183, align 4, !tbaa !50
  %185 = add nsw i32 %182, %184
  %186 = sitofp i32 %185 to double
  %187 = fdiv double %177, %186
  br label %188

188:                                              ; preds = %171, %168
  %189 = phi double [ %170, %168 ], [ %187, %171 ]
  %190 = load i8, ptr %26, align 8, !tbaa !26, !range !22, !noundef !23
  %191 = trunc nuw i8 %190 to i1
  %192 = tail call noundef double @_Z8drain_C_diiidbbb(double noundef %165, i32 noundef 0, i32 noundef 1, i32 noundef 0, double noundef %189, i1 noundef zeroext %191, i1 noundef zeroext false, i1 noundef zeroext false)
  %193 = fadd double %164, %192
  %194 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 264), align 8, !tbaa !55
  %195 = load i8, ptr %10, align 1, !tbaa !21, !range !22, !noundef !23
  %196 = trunc nuw i8 %195 to i1
  br i1 %196, label %197, label %200

197:                                              ; preds = %188
  %198 = getelementptr inbounds i8, ptr %0, i64 2696
  %199 = load double, ptr %198, align 8, !tbaa !46
  br label %217

200:                                              ; preds = %188
  %201 = getelementptr inbounds i8, ptr %0, i64 2672
  %202 = load double, ptr %201, align 8, !tbaa !47
  %203 = getelementptr inbounds i8, ptr %0, i64 2656
  %204 = load i32, ptr %203, align 8, !tbaa !52
  %205 = sitofp i32 %204 to double
  %206 = fmul double %202, %205
  %207 = getelementptr inbounds i8, ptr %0, i64 3048
  %208 = load i32, ptr %207, align 8, !tbaa !48
  %209 = getelementptr inbounds i8, ptr %0, i64 3052
  %210 = load i32, ptr %209, align 4, !tbaa !49
  %211 = add nsw i32 %210, %208
  %212 = getelementptr inbounds i8, ptr %0, i64 3060
  %213 = load i32, ptr %212, align 4, !tbaa !50
  %214 = add nsw i32 %211, %213
  %215 = sitofp i32 %214 to double
  %216 = fdiv double %206, %215
  br label %217

217:                                              ; preds = %200, %197
  %218 = phi double [ %199, %197 ], [ %216, %200 ]
  %219 = load i8, ptr %26, align 8, !tbaa !26, !range !22, !noundef !23
  %220 = trunc nuw i8 %219 to i1
  %221 = tail call noundef double @_Z8drain_C_diiidbbb(double noundef %194, i32 noundef 1, i32 noundef 1, i32 noundef 0, double noundef %218, i1 noundef zeroext %220, i1 noundef zeroext false, i1 noundef zeroext false)
  %222 = load i8, ptr %26, align 8, !tbaa !26, !range !22, !noundef !23
  %223 = trunc nuw i8 %222 to i1
  br i1 %223, label %224, label %255

224:                                              ; preds = %217
  %225 = load ptr, ptr %3, align 8, !tbaa !5
  %226 = getelementptr inbounds i8, ptr %225, i64 128
  %227 = load double, ptr %226, align 8, !tbaa !56
  %228 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 224), align 8, !tbaa !37
  %229 = fmul double %228, 5.000000e-01
  %230 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 240), align 8, !tbaa !57
  %231 = fmul double %229, %230
  %232 = fadd double %25, %230
  %233 = fdiv double %231, %232
  %234 = fdiv double %227, %233
  %235 = fmul double %234, 2.300000e+00
  %236 = fmul double %.0121, %235
  %237 = tail call double @llvm.fmuladd.f64(double %125, double 2.000000e+00, double %25)
  %238 = fadd double %237, %193
  %239 = fadd double %238, %221
  %240 = fmul double %239, %230
  %241 = fmul double %240, %236
  %242 = fadd double %239, %230
  %243 = fdiv double %241, %242
  %244 = getelementptr inbounds i8, ptr %0, i64 2664
  store double %243, ptr %244, align 8, !tbaa !58
  %245 = fmul double %239, %229
  %246 = tail call double @llvm.fmuladd.f64(double %245, double %228, double 0.000000e+00)
  %247 = fmul double %238, %229
  %248 = fmul double %228, %247
  %249 = getelementptr inbounds i8, ptr %0, i64 2660
  %250 = load i32, ptr %249, align 4, !tbaa !59
  %251 = sitofp i32 %250 to double
  %252 = fmul double %248, %251
  %253 = tail call double @llvm.fmuladd.f64(double %252, double 1.000000e+02, double 0.000000e+00)
  %254 = fmul double %228, %245
  br label %347

255:                                              ; preds = %217
  %256 = getelementptr inbounds i8, ptr %0, i64 2656
  %257 = load i32, ptr %256, align 8, !tbaa !52
  %258 = icmp sgt i32 %257, 1
  %259 = fadd double %.0120, %.0119
  br i1 %258, label %260, label %294

260:                                              ; preds = %255
  %261 = tail call double @llvm.fmuladd.f64(double %93, double 2.000000e+00, double %25)
  %262 = tail call double @llvm.fmuladd.f64(double %125, double 2.000000e+00, double %261)
  %263 = fadd double %262, %193
  %264 = fadd double %263, %221
  %265 = fmul double %25, 5.000000e-01
  %266 = tail call double @llvm.fmuladd.f64(double %93, double 2.000000e+00, double %265)
  %267 = tail call double @llvm.fmuladd.f64(double %125, double 2.000000e+00, double %266)
  %268 = fadd double %267, %193
  %269 = fadd double %268, %221
  %270 = fmul double %23, %269
  %271 = tail call double @llvm.fmuladd.f64(double %259, double %264, double %270)
  %272 = tail call double @llvm.fmuladd.f64(double %125, double 2.000000e+00, double %93)
  %273 = fadd double %272, %193
  %274 = fadd double %273, %221
  %275 = tail call double @llvm.fmuladd.f64(double %97, double %274, double %271)
  %276 = fadd double %125, %193
  %277 = fadd double %276, %221
  %278 = tail call double @llvm.fmuladd.f64(double %129, double %277, double %275)
  %279 = fmul double %261, 2.000000e+00
  %280 = load ptr, ptr %3, align 8, !tbaa !5
  %281 = getelementptr inbounds i8, ptr %280, i64 128
  %282 = load double, ptr %281, align 8, !tbaa !56
  %283 = fmul double %279, %282
  %284 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 432), align 8, !tbaa !41
  %285 = tail call double @llvm.fmuladd.f64(double %283, double %284, double 0.000000e+00)
  %286 = tail call double @llvm.fmuladd.f64(double %125, double 2.000000e+00, double %193)
  %287 = fadd double %286, %221
  %288 = fmul double %287, 2.000000e+00
  %289 = fmul double %288, %282
  %290 = fmul double %289, %284
  %291 = uitofp nneg i32 %257 to double
  %292 = fdiv double 1.000000e+00, %291
  %293 = tail call double @llvm.fmuladd.f64(double %290, double %292, double %285)
  br label %316

294:                                              ; preds = %255
  %295 = fadd double %25, %125
  %296 = fadd double %295, %193
  %297 = fadd double %296, %221
  %298 = fmul double %25, %23
  %299 = fmul double %298, 5.000000e-01
  %300 = tail call double @llvm.fmuladd.f64(double %259, double %297, double %299)
  %301 = fadd double %125, %193
  %302 = fadd double %301, %221
  %303 = tail call double @llvm.fmuladd.f64(double %129, double %302, double %300)
  %304 = tail call double @llvm.fmuladd.f64(double %125, double 2.000000e+00, double %25)
  %305 = fadd double %304, %193
  %306 = fadd double %305, %221
  %307 = fmul double %306, 2.000000e+00
  %308 = load ptr, ptr %3, align 8, !tbaa !5
  %309 = getelementptr inbounds i8, ptr %308, i64 128
  %310 = load double, ptr %309, align 8, !tbaa !56
  %311 = fmul double %307, %310
  %312 = load double, ptr getelementptr inbounds (i8, ptr @g_tp, i64 432), align 8, !tbaa !41
  %313 = tail call double @llvm.fmuladd.f64(double %311, double %312, double 0.000000e+00)
  %314 = sitofp i32 %257 to double
  %315 = fdiv double 1.000000e+00, %314
  br label %316

316:                                              ; preds = %294, %260
  %.sink140 = phi double [ %315, %294 ], [ %292, %260 ]
  %.sink134 = phi double [ %25, %294 ], [ %261, %260 ]
  %.sink132 = phi double [ %312, %294 ], [ %284, %260 ]
  %317 = phi double [ %310, %294 ], [ %282, %260 ]
  %.0116 = phi double [ %313, %294 ], [ %293, %260 ]
  %.0114 = phi double [ %303, %294 ], [ %278, %260 ]
  %318 = sitofp i32 %9 to double
  %319 = fdiv double %.sink140, %318
  %320 = getelementptr inbounds i8, ptr %0, i64 2660
  %321 = load i32, ptr %320, align 4, !tbaa !59
  %322 = sitofp i32 %321 to double
  %323 = fmul double %319, %322
  %324 = fmul double %.sink134, %323
  %325 = fmul double %.sink132, %324
  %326 = fmul double %.sink132, %325
  %327 = tail call double @llvm.fmuladd.f64(double %326, double 2.000000e+00, double 0.000000e+00)
  %328 = fsub double %.0, %317
  %329 = fdiv double %.0, %328
  %330 = tail call double @log(double noundef %329) #4
  %331 = fmul double %.0114, %330
  %332 = fadd double %.0124, %.0122
  %333 = getelementptr inbounds i8, ptr %0, i64 3048
  %334 = load i32, ptr %333, align 8, !tbaa !48
  %335 = getelementptr inbounds i8, ptr %0, i64 3056
  %336 = load i32, ptr %335, align 8, !tbaa !60
  %337 = add i32 %334, -1
  %338 = add i32 %337, %336
  %339 = sitofp i32 %338 to double
  %340 = tail call double @llvm.fmuladd.f64(double %.0124, double %339, double %332)
  %341 = getelementptr inbounds i8, ptr %0, i64 3052
  %342 = load i32, ptr %341, align 4, !tbaa !49
  %343 = sitofp i32 %342 to double
  %344 = tail call double @llvm.fmuladd.f64(double %.0125, double %343, double %340)
  %345 = getelementptr inbounds i8, ptr %0, i64 2296
  store double %344, ptr %345, align 8, !tbaa !61
  %346 = tail call double @llvm.fmuladd.f64(double %.0126, double %343, double %.0123)
  br label %347

347:                                              ; preds = %316, %224
  %.sink144 = phi i64 [ 2304, %316 ], [ 2648, %224 ]
  %.sink142 = phi double [ %346, %316 ], [ %254, %224 ]
  %.1118 = phi double [ %327, %316 ], [ %253, %224 ]
  %.1 = phi double [ %.0116, %316 ], [ %246, %224 ]
  %.0115 = phi double [ %331, %316 ], [ %243, %224 ]
  %348 = getelementptr inbounds i8, ptr %0, i64 %.sink144
  store double %.sink142, ptr %348, align 8, !tbaa !62
  %349 = fdiv double %.0113, %1
  %350 = fsub double %.0113, %.0112
  %351 = fmul double %350, 5.000000e-01
  %352 = fdiv double %351, %349
  %353 = fcmp ugt double %.0115, %352
  br i1 %353, label %359, label %354

354:                                              ; preds = %347
  %355 = fmul double %.0115, 2.000000e+00
  %356 = fmul double %350, %355
  %357 = fdiv double %356, %349
  %358 = tail call double @sqrt(double noundef %357) #4
  br label %363

359:                                              ; preds = %347
  %360 = fmul double %349, 2.000000e+00
  %361 = fdiv double %350, %360
  %362 = fadd double %361, %.0115
  br label %363

363:                                              ; preds = %359, %354
  %.sink = phi double [ %362, %359 ], [ %358, %354 ]
  %364 = getelementptr inbounds i8, ptr %0, i64 1784
  store double %.sink, ptr %364, align 8
  %365 = load ptr, ptr %3, align 8, !tbaa !5
  %366 = load i8, ptr %365, align 8, !tbaa !63, !range !22, !noundef !23
  %367 = icmp eq i8 %366, 0
  br i1 %367, label %372, label %368

368:                                              ; preds = %363
  %369 = getelementptr inbounds i8, ptr %365, i64 3
  %370 = load i8, ptr %369, align 1, !tbaa !64, !range !22, !noundef !23
  %371 = icmp eq i8 %370, 0
  br i1 %371, label %372, label %375

372:                                              ; preds = %368, %363
  %373 = getelementptr inbounds i8, ptr %0, i64 2288
  store double %.1, ptr %373, align 8, !tbaa !65
  %374 = getelementptr inbounds i8, ptr %0, i64 2328
  store double %.1118, ptr %374, align 8, !tbaa !66
  br label %375

375:                                              ; preds = %372, %368
  ret double 0.000000e+00
}

declare noundef double @_Z17cmos_Isub_leakageddi9Gate_typebbb17Half_net_topology(double noundef, double noundef, i32 noundef, i32 noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext, i32 noundef) local_unnamed_addr #1

declare noundef double @_Z15cmos_Ig_leakageddi9Gate_typebbb17Half_net_topology(double noundef, double noundef, i32 noundef, i32 noundef, i1 noundef zeroext, i1 noundef zeroext, i1 noundef zeroext, i32 noundef) local_unnamed_addr #1

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare double @sqrt(double noundef) local_unnamed_addr #2

attributes #0 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { mustprogress nofree nounwind willreturn memory(write) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !14, i64 280}
!6 = !{!"_ZTS3Mat", !7, i64 0, !14, i64 280, !14, i64 288, !14, i64 296, !14, i64 304, !14, i64 312, !14, i64 320, !14, i64 328, !14, i64 336, !14, i64 344, !14, i64 352, !14, i64 360, !14, i64 368, !14, i64 376, !14, i64 384, !14, i64 392, !14, i64 400, !14, i64 408, !14, i64 416, !14, i64 424, !14, i64 432, !12, i64 440, !12, i64 560, !12, i64 680, !12, i64 800, !12, i64 920, !12, i64 1040, !12, i64 1160, !12, i64 1280, !12, i64 1400, !12, i64 1520, !12, i64 1640, !9, i64 1760, !9, i64 1768, !9, i64 1776, !9, i64 1784, !9, i64 1792, !9, i64 1800, !9, i64 1808, !9, i64 1816, !9, i64 1824, !9, i64 1832, !9, i64 1840, !9, i64 1848, !9, i64 1856, !15, i64 1864, !12, i64 2288, !12, i64 2408, !12, i64 2528, !9, i64 2648, !16, i64 2656, !16, i64 2660, !9, i64 2664, !8, i64 2672, !8, i64 2696, !17, i64 2720, !17, i64 2721, !17, i64 2722, !17, i64 2723, !16, i64 2724, !12, i64 2728, !9, i64 2848, !9, i64 2856, !9, i64 2864, !9, i64 2872, !9, i64 2880, !9, i64 2888, !12, i64 2896, !16, i64 3016, !16, i64 3020, !16, i64 3024, !16, i64 3028, !9, i64 3032, !16, i64 3040, !16, i64 3044, !16, i64 3048, !16, i64 3052, !16, i64 3056, !16, i64 3060}
!7 = !{!"_ZTS9Component", !8, i64 0, !12, i64 24, !12, i64 144, !9, i64 264, !9, i64 272}
!8 = !{!"_ZTS4Area", !9, i64 0, !9, i64 8, !9, i64 16}
!9 = !{!"double", !10, i64 0}
!10 = !{!"omnipotent char", !11, i64 0}
!11 = !{!"Simple C++ TBAA"}
!12 = !{!"_ZTS8powerDef", !13, i64 0, !13, i64 40, !13, i64 80}
!13 = !{!"_ZTS15powerComponents", !9, i64 0, !9, i64 8, !9, i64 16, !9, i64 24, !9, i64 32}
!14 = !{!"any pointer", !10, i64 0}
!15 = !{!"_ZTS8Subarray", !7, i64 0, !14, i64 280, !16, i64 288, !16, i64 292, !16, i64 296, !16, i64 300, !8, i64 304, !8, i64 328, !17, i64 352, !9, i64 360, !9, i64 368, !9, i64 376, !9, i64 384, !9, i64 392, !9, i64 400, !9, i64 408, !9, i64 416}
!16 = !{!"int", !10, i64 0}
!17 = !{!"bool", !10, i64 0}
!18 = !{!19, !16, i64 44}
!19 = !{!"_ZTS16DynamicParameter", !17, i64 0, !17, i64 1, !17, i64 2, !17, i64 3, !16, i64 4, !16, i64 8, !16, i64 12, !9, i64 16, !16, i64 24, !16, i64 28, !16, i64 32, !16, i64 36, !16, i64 40, !16, i64 44, !16, i64 48, !16, i64 52, !16, i64 56, !16, i64 60, !16, i64 64, !16, i64 68, !16, i64 72, !16, i64 76, !16, i64 80, !16, i64 84, !16, i64 88, !16, i64 92, !16, i64 96, !16, i64 100, !16, i64 104, !16, i64 108, !16, i64 112, !16, i64 116, !17, i64 120, !9, i64 128, !16, i64 136, !16, i64 140, !16, i64 144, !16, i64 148, !16, i64 152, !16, i64 156, !16, i64 160, !16, i64 164, !16, i64 168, !9, i64 176, !16, i64 184, !16, i64 188, !16, i64 192, !16, i64 196, !16, i64 200, !16, i64 204, !16, i64 208, !17, i64 212, !8, i64 216, !8, i64 240, !17, i64 264}
!20 = !{!19, !16, i64 48}
!21 = !{!6, !17, i64 2723}
!22 = !{i8 0, i8 2}
!23 = !{}
!24 = !{!6, !16, i64 2152}
!25 = !{!6, !9, i64 2272}
!26 = !{!6, !17, i64 2720}
!27 = !{!28, !9, i64 1504}
!28 = !{!"_ZTS19TechnologyParameter", !9, i64 0, !9, i64 8, !9, i64 16, !9, i64 24, !9, i64 32, !9, i64 40, !9, i64 48, !9, i64 56, !9, i64 64, !9, i64 72, !9, i64 80, !9, i64 88, !9, i64 96, !9, i64 104, !9, i64 112, !9, i64 120, !9, i64 128, !9, i64 136, !9, i64 144, !9, i64 152, !9, i64 160, !9, i64 168, !9, i64 176, !9, i64 184, !9, i64 192, !9, i64 200, !9, i64 208, !9, i64 216, !9, i64 224, !9, i64 232, !9, i64 240, !9, i64 248, !9, i64 256, !9, i64 264, !9, i64 272, !9, i64 280, !9, i64 288, !9, i64 296, !9, i64 304, !9, i64 312, !9, i64 320, !9, i64 328, !9, i64 336, !9, i64 344, !29, i64 352, !30, i64 360, !30, i64 528, !30, i64 696, !30, i64 864, !30, i64 1032, !31, i64 1200, !31, i64 1264, !31, i64 1328, !32, i64 1392, !33, i64 1416, !33, i64 1464, !33, i64 1512}
!29 = !{!"long", !10, i64 0}
!30 = !{!"_ZTSN19TechnologyParameter10DeviceTypeE", !9, i64 0, !9, i64 8, !9, i64 16, !9, i64 24, !9, i64 32, !9, i64 40, !9, i64 48, !9, i64 56, !9, i64 64, !9, i64 72, !9, i64 80, !9, i64 88, !9, i64 96, !9, i64 104, !9, i64 112, !9, i64 120, !9, i64 128, !9, i64 136, !9, i64 144, !9, i64 152, !9, i64 160}
!31 = !{!"_ZTSN19TechnologyParameter16InterconnectTypeE", !9, i64 0, !9, i64 8, !9, i64 16, !9, i64 24, !9, i64 32, !9, i64 40, !9, i64 48, !9, i64 56}
!32 = !{!"_ZTSN19TechnologyParameter13ScalingFactorE", !9, i64 0, !9, i64 8, !9, i64 16}
!33 = !{!"_ZTSN19TechnologyParameter10MemoryTypeE", !9, i64 0, !9, i64 8, !9, i64 16, !9, i64 24, !9, i64 32, !9, i64 40}
!34 = !{!28, !9, i64 608}
!35 = !{!28, !9, i64 56}
!36 = !{!28, !9, i64 1480}
!37 = !{!28, !9, i64 224}
!38 = !{!28, !9, i64 216}
!39 = !{!28, !9, i64 1456}
!40 = !{!28, !9, i64 440}
!41 = !{!28, !9, i64 432}
!42 = !{!28, !9, i64 1448}
!43 = !{!28, !9, i64 1432}
!44 = !{!28, !9, i64 1440}
!45 = !{!28, !9, i64 256}
!46 = !{!6, !9, i64 2696}
!47 = !{!6, !9, i64 2672}
!48 = !{!6, !16, i64 3048}
!49 = !{!6, !16, i64 3052}
!50 = !{!6, !16, i64 3060}
!51 = !{!28, !9, i64 104}
!52 = !{!6, !16, i64 2656}
!53 = !{!28, !9, i64 80}
!54 = !{!28, !9, i64 72}
!55 = !{!28, !9, i64 264}
!56 = !{!19, !9, i64 128}
!57 = !{!28, !9, i64 240}
!58 = !{!6, !9, i64 2664}
!59 = !{!6, !16, i64 2660}
!60 = !{!6, !16, i64 3056}
!61 = !{!6, !9, i64 2296}
!62 = !{!9, !9, i64 0}
!63 = !{!19, !17, i64 0}
!64 = !{!19, !17, i64 3}
!65 = !{!6, !9, i64 2288}
!66 = !{!6, !9, i64 2328}


; Effective O3 passes: BDCEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,MergedLoadStoreMotionPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass