diff --git a/examples/tabs/Tabs.ll b/examples/tabs/Tabs.ll index 99536cd..33173e0 100644 --- a/examples/tabs/Tabs.ll +++ b/examples/tabs/Tabs.ll @@ -2,72 +2,78 @@ ; Components: VerticalTabs, Tabs ; String constants -@.str.0 = private unnamed_addr constant [7 x i8] c"button\00" -@.str.1 = private unnamed_addr constant [6 x i8] c"class\00" -@.str.2 = private unnamed_addr constant [20 x i8] c"vertical-tab active\00" -@.str.3 = private unnamed_addr constant [6 x i8] c"click\00" -@.str.4 = private unnamed_addr constant [14 x i8] c"set_setting_0\00" -@.str.5 = private unnamed_addr constant [15 x i8] c"⚙️ General\00" -@.str.6 = private unnamed_addr constant [13 x i8] c"vertical-tab\00" -@.str.7 = private unnamed_addr constant [14 x i8] c"set_setting_1\00" -@.str.8 = private unnamed_addr constant [13 x i8] c"🔒 Privacy\00" -@.str.9 = private unnamed_addr constant [14 x i8] c"set_setting_2\00" -@.str.10 = private unnamed_addr constant [14 x i8] c"🚀 Advanced\00" -@.str.11 = private unnamed_addr constant [4 x i8] c"div\00" -@.str.12 = private unnamed_addr constant [13 x i8] c"setting-pane\00" -@.str.13 = private unnamed_addr constant [3 x i8] c"h3\00" -@.str.14 = private unnamed_addr constant [24 x i8] c"⚙️ General Settings\00" -@.str.15 = private unnamed_addr constant [2 x i8] c"p\00" -@.str.16 = private unnamed_addr constant [18 x i8] c"Language: English\00" -@.str.17 = private unnamed_addr constant [15 x i8] c"Time Zone: UTC\00" -@.str.18 = private unnamed_addr constant [22 x i8] c"🔒 Privacy Settings\00" -@.str.19 = private unnamed_addr constant [26 x i8] c"Data Collection: Disabled\00" -@.str.20 = private unnamed_addr constant [19 x i8] c"Analytics: Opt-out\00" -@.str.21 = private unnamed_addr constant [23 x i8] c"🚀 Advanced Settings\00" -@.str.22 = private unnamed_addr constant [16 x i8] c"Debug Mode: Off\00" -@.str.23 = private unnamed_addr constant [32 x i8] c"Experimental Features: Disabled\00" -@.str.24 = private unnamed_addr constant [16 x i8] c"Invalid setting\00" -@.str.25 = private unnamed_addr constant [14 x i8] c"vertical-tabs\00" -@.str.26 = private unnamed_addr constant [18 x i8] c"vertical-tab-menu\00" -@.str.27 = private unnamed_addr constant [21 x i8] c"vertical-tab-content\00" -@.str.28 = private unnamed_addr constant [3 x i8] c"li\00" -@.str.29 = private unnamed_addr constant [11 x i8] c"tab active\00" -@.str.30 = private unnamed_addr constant [10 x i8] c"set_tab_0\00" -@.str.31 = private unnamed_addr constant [10 x i8] c"🏠 Home\00" -@.str.32 = private unnamed_addr constant [4 x i8] c"tab\00" -@.str.33 = private unnamed_addr constant [10 x i8] c"set_tab_1\00" -@.str.34 = private unnamed_addr constant [13 x i8] c"👤 Profile\00" -@.str.35 = private unnamed_addr constant [10 x i8] c"set_tab_2\00" -@.str.36 = private unnamed_addr constant [16 x i8] c"⚙️ Settings\00" -@.str.37 = private unnamed_addr constant [14 x i8] c"tab-pane home\00" -@.str.38 = private unnamed_addr constant [3 x i8] c"h2\00" -@.str.39 = private unnamed_addr constant [18 x i8] c"🏠 Welcome Home\00" -@.str.40 = private unnamed_addr constant [29 x i8] c"This is your home dashboard.\00" -@.str.41 = private unnamed_addr constant [37 x i8] c"All your important info at a glance.\00" -@.str.42 = private unnamed_addr constant [3 x i8] c"ul\00" -@.str.43 = private unnamed_addr constant [20 x i8] c"✓ Recent activity\00" -@.str.44 = private unnamed_addr constant [18 x i8] c"✓ Quick actions\00" -@.str.45 = private unnamed_addr constant [18 x i8] c"✓ Summary stats\00" -@.str.46 = private unnamed_addr constant [17 x i8] c"tab-pane profile\00" -@.str.47 = private unnamed_addr constant [18 x i8] c"👤 Your Profile\00" -@.str.48 = private unnamed_addr constant [30 x i8] c"Manage your account settings.\00" -@.str.49 = private unnamed_addr constant [13 x i8] c"profile-info\00" -@.str.50 = private unnamed_addr constant [16 x i8] c"Name: Ritz User\00" -@.str.51 = private unnamed_addr constant [21 x i8] c"Email: user@ritz.dev\00" -@.str.52 = private unnamed_addr constant [19 x i8] c"Member since: 2025\00" -@.str.53 = private unnamed_addr constant [18 x i8] c"tab-pane settings\00" -@.str.54 = private unnamed_addr constant [55 x i8] c"Configure your preferences using the categories below:\00" -@.str.55 = private unnamed_addr constant [15 x i8] c"tab-pane error\00" -@.str.56 = private unnamed_addr constant [28 x i8] c"⚠️ Invalid tab selected\00" -@.str.57 = private unnamed_addr constant [15 x i8] c"tabs-container\00" -@.str.58 = private unnamed_addr constant [3 x i8] c"h1\00" -@.str.59 = private unnamed_addr constant [19 x i8] c"Tab Component Demo\00" -@.str.60 = private unnamed_addr constant [9 x i8] c"subtitle\00" -@.str.61 = private unnamed_addr constant [58 x i8] c"Beautiful composition with TabMenu and TabPane components\00" -@.str.62 = private unnamed_addr constant [9 x i8] c"tab-menu\00" -@.str.63 = private unnamed_addr constant [12 x i8] c"tab-content\00" -@.str.64 = private unnamed_addr constant [13 x i8] c"debug-footer\00" -@.str.65 = private unnamed_addr constant [2 x i8] c"0\00" +@.str.0 = private unnamed_addr constant [4 x i8] c"div\00" +@.str.1 = private unnamed_addr constant [7 x i8] c"button\00" +@.str.2 = private unnamed_addr constant [6 x i8] c"class\00" +@.str.3 = private unnamed_addr constant [20 x i8] c"vertical-tab active\00" +@.str.4 = private unnamed_addr constant [6 x i8] c"click\00" +@.str.5 = private unnamed_addr constant [23 x i8] c"_lambda_0_VerticalTabs\00" +@.str.6 = private unnamed_addr constant [15 x i8] c"⚙️ General\00" +@.str.7 = private unnamed_addr constant [13 x i8] c"vertical-tab\00" +@.str.8 = private unnamed_addr constant [23 x i8] c"_lambda_1_VerticalTabs\00" +@.str.9 = private unnamed_addr constant [23 x i8] c"_lambda_2_VerticalTabs\00" +@.str.10 = private unnamed_addr constant [13 x i8] c"🔒 Privacy\00" +@.str.11 = private unnamed_addr constant [23 x i8] c"_lambda_3_VerticalTabs\00" +@.str.12 = private unnamed_addr constant [23 x i8] c"_lambda_4_VerticalTabs\00" +@.str.13 = private unnamed_addr constant [14 x i8] c"🚀 Advanced\00" +@.str.14 = private unnamed_addr constant [23 x i8] c"_lambda_5_VerticalTabs\00" +@.str.15 = private unnamed_addr constant [13 x i8] c"setting-pane\00" +@.str.16 = private unnamed_addr constant [3 x i8] c"h3\00" +@.str.17 = private unnamed_addr constant [24 x i8] c"⚙️ General Settings\00" +@.str.18 = private unnamed_addr constant [2 x i8] c"p\00" +@.str.19 = private unnamed_addr constant [18 x i8] c"Language: English\00" +@.str.20 = private unnamed_addr constant [15 x i8] c"Time Zone: UTC\00" +@.str.21 = private unnamed_addr constant [22 x i8] c"🔒 Privacy Settings\00" +@.str.22 = private unnamed_addr constant [26 x i8] c"Data Collection: Disabled\00" +@.str.23 = private unnamed_addr constant [19 x i8] c"Analytics: Opt-out\00" +@.str.24 = private unnamed_addr constant [23 x i8] c"🚀 Advanced Settings\00" +@.str.25 = private unnamed_addr constant [16 x i8] c"Debug Mode: Off\00" +@.str.26 = private unnamed_addr constant [32 x i8] c"Experimental Features: Disabled\00" +@.str.27 = private unnamed_addr constant [16 x i8] c"Invalid setting\00" +@.str.28 = private unnamed_addr constant [14 x i8] c"vertical-tabs\00" +@.str.29 = private unnamed_addr constant [18 x i8] c"vertical-tab-menu\00" +@.str.30 = private unnamed_addr constant [21 x i8] c"vertical-tab-content\00" +@.str.31 = private unnamed_addr constant [3 x i8] c"li\00" +@.str.32 = private unnamed_addr constant [11 x i8] c"tab active\00" +@.str.33 = private unnamed_addr constant [15 x i8] c"_lambda_0_Tabs\00" +@.str.34 = private unnamed_addr constant [10 x i8] c"🏠 Home\00" +@.str.35 = private unnamed_addr constant [4 x i8] c"tab\00" +@.str.36 = private unnamed_addr constant [15 x i8] c"_lambda_1_Tabs\00" +@.str.37 = private unnamed_addr constant [15 x i8] c"_lambda_2_Tabs\00" +@.str.38 = private unnamed_addr constant [13 x i8] c"👤 Profile\00" +@.str.39 = private unnamed_addr constant [15 x i8] c"_lambda_3_Tabs\00" +@.str.40 = private unnamed_addr constant [15 x i8] c"_lambda_4_Tabs\00" +@.str.41 = private unnamed_addr constant [16 x i8] c"⚙️ Settings\00" +@.str.42 = private unnamed_addr constant [15 x i8] c"_lambda_5_Tabs\00" +@.str.43 = private unnamed_addr constant [14 x i8] c"tab-pane home\00" +@.str.44 = private unnamed_addr constant [3 x i8] c"h2\00" +@.str.45 = private unnamed_addr constant [18 x i8] c"🏠 Welcome Home\00" +@.str.46 = private unnamed_addr constant [29 x i8] c"This is your home dashboard.\00" +@.str.47 = private unnamed_addr constant [37 x i8] c"All your important info at a glance.\00" +@.str.48 = private unnamed_addr constant [3 x i8] c"ul\00" +@.str.49 = private unnamed_addr constant [20 x i8] c"✓ Recent activity\00" +@.str.50 = private unnamed_addr constant [18 x i8] c"✓ Quick actions\00" +@.str.51 = private unnamed_addr constant [18 x i8] c"✓ Summary stats\00" +@.str.52 = private unnamed_addr constant [17 x i8] c"tab-pane profile\00" +@.str.53 = private unnamed_addr constant [18 x i8] c"👤 Your Profile\00" +@.str.54 = private unnamed_addr constant [30 x i8] c"Manage your account settings.\00" +@.str.55 = private unnamed_addr constant [13 x i8] c"profile-info\00" +@.str.56 = private unnamed_addr constant [16 x i8] c"Name: Ritz User\00" +@.str.57 = private unnamed_addr constant [21 x i8] c"Email: user@ritz.dev\00" +@.str.58 = private unnamed_addr constant [19 x i8] c"Member since: 2025\00" +@.str.59 = private unnamed_addr constant [18 x i8] c"tab-pane settings\00" +@.str.60 = private unnamed_addr constant [55 x i8] c"Configure your preferences using the categories below:\00" +@.str.61 = private unnamed_addr constant [15 x i8] c"tab-pane error\00" +@.str.62 = private unnamed_addr constant [28 x i8] c"⚠️ Invalid tab selected\00" +@.str.63 = private unnamed_addr constant [15 x i8] c"tabs-container\00" +@.str.64 = private unnamed_addr constant [3 x i8] c"h1\00" +@.str.65 = private unnamed_addr constant [19 x i8] c"Tab Component Demo\00" +@.str.66 = private unnamed_addr constant [9 x i8] c"subtitle\00" +@.str.67 = private unnamed_addr constant [58 x i8] c"Beautiful composition with TabMenu and TabPane components\00" +@.str.68 = private unnamed_addr constant [9 x i8] c"tab-menu\00" +@.str.69 = private unnamed_addr constant [12 x i8] c"tab-content\00" +@.str.70 = private unnamed_addr constant [13 x i8] c"debug-footer\00" +@.str.71 = private unnamed_addr constant [2 x i8] c"0\00" ; JavaScript bridge function declarations declare i32 @js_create_element(i8*) @@ -117,32 +123,52 @@ entry: ret void } -; Event handler: set_setting_0 -define void @set_setting_0() { +; Event handler: _lambda_0_VerticalTabs +define void @_lambda_0_VerticalTabs() { entry: - store i32 0, i32* @signal_VerticalTabs_setting_tab - call void @reevaluate_conditional_0() - call void @reevaluate_conditional_1() - call void @reevaluate_conditional_2() - call void @reevaluate_conditional_3() + call void @set_setting(i32 0) ret void } -; Event handler: set_setting_1 -define void @set_setting_1() { +; Event handler: _lambda_1_VerticalTabs +define void @_lambda_1_VerticalTabs() { entry: - store i32 1, i32* @signal_VerticalTabs_setting_tab - call void @reevaluate_conditional_0() - call void @reevaluate_conditional_1() - call void @reevaluate_conditional_2() - call void @reevaluate_conditional_3() + call void @set_setting(i32 0) ret void } -; Event handler: set_setting_2 -define void @set_setting_2() { +; Event handler: _lambda_2_VerticalTabs +define void @_lambda_2_VerticalTabs() { entry: - store i32 2, i32* @signal_VerticalTabs_setting_tab + call void @set_setting(i32 1) + ret void +} + +; Event handler: _lambda_3_VerticalTabs +define void @_lambda_3_VerticalTabs() { +entry: + call void @set_setting(i32 1) + ret void +} + +; Event handler: _lambda_4_VerticalTabs +define void @_lambda_4_VerticalTabs() { +entry: + call void @set_setting(i32 2) + ret void +} + +; Event handler: _lambda_5_VerticalTabs +define void @_lambda_5_VerticalTabs() { +entry: + call void @set_setting(i32 2) + ret void +} + +; Event handler: set_setting +define void @set_setting(i32 %value) { +entry: + store i32 %value, i32* @signal_VerticalTabs_setting_tab call void @reevaluate_conditional_0() call void @reevaluate_conditional_1() call void @reevaluate_conditional_2() @@ -207,44 +233,48 @@ done: define i32 @_render_cond_0_then() { entry: - %var20 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.0, i32 0, i32 0)) - call void @js_set_attribute(i32 %var20, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.2, i32 0, i32 0)) - call void @js_bind_event(i32 %var20, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i32 0, i32 0)) - %var21 = call i32 @js_create_text(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.5, i32 0, i32 0)) + %var20 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var21 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + call void @js_set_attribute(i32 %var21, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.3, i32 0, i32 0)) + call void @js_bind_event(i32 %var21, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.5, i32 0, i32 0)) + %var22 = call i32 @js_create_text(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.6, i32 0, i32 0)) + call void @js_append_child(i32 %var21, i32 %var22) call void @js_append_child(i32 %var20, i32 %var21) ret i32 %var20 } define i32 @_render_cond_0_else() { entry: - %var22 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.0, i32 0, i32 0)) - call void @js_set_attribute(i32 %var22, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i32 0, i32 0)) - call void @js_bind_event(i32 %var22, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i32 0, i32 0)) - %var23 = call i32 @js_create_text(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.5, i32 0, i32 0)) - call void @js_append_child(i32 %var22, i32 %var23) - ret i32 %var22 + %var23 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var24 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + call void @js_set_attribute(i32 %var24, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.7, i32 0, i32 0)) + call void @js_bind_event(i32 %var24, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.8, i32 0, i32 0)) + %var25 = call i32 @js_create_text(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.6, i32 0, i32 0)) + call void @js_append_child(i32 %var24, i32 %var25) + call void @js_append_child(i32 %var23, i32 %var24) + ret i32 %var23 } ; Initialize conditional 1 define void @_init_conditional_1() { entry: ; Render both branches upfront - %var24 = call i32 @_render_cond_1_then() - %var25 = call i32 @_render_cond_1_else() - store i32 %var24, i32* @cond_1_then_root - store i32 %var25, i32* @cond_1_else_root - %var26 = load i32, i32* @signal_VerticalTabs_setting_tab - %var27 = icmp eq i32 %var26, 1 - %var28 = zext i1 %var27 to i32 - %var29 = icmp ne i32 %var28, 0 - %var30 = load i32, i32* @cond_1_marker - br i1 %var29, label %insert_then, label %insert_else + %var26 = call i32 @_render_cond_1_then() + %var27 = call i32 @_render_cond_1_else() + store i32 %var26, i32* @cond_1_then_root + store i32 %var27, i32* @cond_1_else_root + %var28 = load i32, i32* @signal_VerticalTabs_setting_tab + %var29 = icmp eq i32 %var28, 1 + %var30 = zext i1 %var29 to i32 + %var31 = icmp ne i32 %var30, 0 + %var32 = load i32, i32* @cond_1_marker + br i1 %var31, label %insert_then, label %insert_else insert_then: - call void @js_replace_at_marker(i32 %var30, i32 0, i32 %var24) + call void @js_replace_at_marker(i32 %var32, i32 0, i32 %var26) store i32 1, i32* @cond_1_current ret void insert_else: - call void @js_replace_at_marker(i32 %var30, i32 0, i32 %var25) + call void @js_replace_at_marker(i32 %var32, i32 0, i32 %var27) store i32 0, i32* @cond_1_current ret void } @@ -252,28 +282,28 @@ insert_else: ; Re-evaluate conditional 1 define void @reevaluate_conditional_1() { entry: - %var31 = load i32, i32* @signal_VerticalTabs_setting_tab - %var32 = icmp eq i32 %var31, 1 - %var33 = zext i1 %var32 to i32 - %var34 = icmp ne i32 %var33, 0 + %var33 = load i32, i32* @signal_VerticalTabs_setting_tab + %var34 = icmp eq i32 %var33, 1 %var35 = zext i1 %var34 to i32 - %var36 = load i32, i32* @cond_1_current - %var37 = icmp ne i32 %var36, %var35 - br i1 %var37, label %swap, label %done + %var36 = icmp ne i32 %var35, 0 + %var37 = zext i1 %var36 to i32 + %var38 = load i32, i32* @cond_1_current + %var39 = icmp ne i32 %var38, %var37 + br i1 %var39, label %swap, label %done swap: - br i1 %var34, label %swap_to_then, label %swap_to_else + br i1 %var36, label %swap_to_then, label %swap_to_else swap_to_then: - %var38 = load i32, i32* @cond_1_else_root - %var39 = load i32, i32* @cond_1_then_root - %var40 = load i32, i32* @cond_1_marker - call void @js_replace_at_marker(i32 %var40, i32 %var38, i32 %var39) + %var40 = load i32, i32* @cond_1_else_root + %var41 = load i32, i32* @cond_1_then_root + %var42 = load i32, i32* @cond_1_marker + call void @js_replace_at_marker(i32 %var42, i32 %var40, i32 %var41) store i32 1, i32* @cond_1_current br label %done swap_to_else: - %var41 = load i32, i32* @cond_1_then_root - %var42 = load i32, i32* @cond_1_else_root - %var43 = load i32, i32* @cond_1_marker - call void @js_replace_at_marker(i32 %var43, i32 %var41, i32 %var42) + %var43 = load i32, i32* @cond_1_then_root + %var44 = load i32, i32* @cond_1_else_root + %var45 = load i32, i32* @cond_1_marker + call void @js_replace_at_marker(i32 %var45, i32 %var43, i32 %var44) store i32 0, i32* @cond_1_current br label %done done: @@ -282,44 +312,48 @@ done: define i32 @_render_cond_1_then() { entry: - %var44 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.0, i32 0, i32 0)) - call void @js_set_attribute(i32 %var44, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.2, i32 0, i32 0)) - call void @js_bind_event(i32 %var44, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.7, i32 0, i32 0)) - %var45 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.8, i32 0, i32 0)) - call void @js_append_child(i32 %var44, i32 %var45) - ret i32 %var44 + %var46 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var47 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + call void @js_set_attribute(i32 %var47, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.3, i32 0, i32 0)) + call void @js_bind_event(i32 %var47, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.9, i32 0, i32 0)) + %var48 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.10, i32 0, i32 0)) + call void @js_append_child(i32 %var47, i32 %var48) + call void @js_append_child(i32 %var46, i32 %var47) + ret i32 %var46 } define i32 @_render_cond_1_else() { entry: - %var46 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.0, i32 0, i32 0)) - call void @js_set_attribute(i32 %var46, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i32 0, i32 0)) - call void @js_bind_event(i32 %var46, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.7, i32 0, i32 0)) - %var47 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.8, i32 0, i32 0)) - call void @js_append_child(i32 %var46, i32 %var47) - ret i32 %var46 + %var49 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var50 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + call void @js_set_attribute(i32 %var50, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.7, i32 0, i32 0)) + call void @js_bind_event(i32 %var50, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.11, i32 0, i32 0)) + %var51 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.10, i32 0, i32 0)) + call void @js_append_child(i32 %var50, i32 %var51) + call void @js_append_child(i32 %var49, i32 %var50) + ret i32 %var49 } ; Initialize conditional 2 define void @_init_conditional_2() { entry: ; Render both branches upfront - %var48 = call i32 @_render_cond_2_then() - %var49 = call i32 @_render_cond_2_else() - store i32 %var48, i32* @cond_2_then_root - store i32 %var49, i32* @cond_2_else_root - %var50 = load i32, i32* @signal_VerticalTabs_setting_tab - %var51 = icmp eq i32 %var50, 2 - %var52 = zext i1 %var51 to i32 - %var53 = icmp ne i32 %var52, 0 - %var54 = load i32, i32* @cond_2_marker - br i1 %var53, label %insert_then, label %insert_else + %var52 = call i32 @_render_cond_2_then() + %var53 = call i32 @_render_cond_2_else() + store i32 %var52, i32* @cond_2_then_root + store i32 %var53, i32* @cond_2_else_root + %var54 = load i32, i32* @signal_VerticalTabs_setting_tab + %var55 = icmp eq i32 %var54, 2 + %var56 = zext i1 %var55 to i32 + %var57 = icmp ne i32 %var56, 0 + %var58 = load i32, i32* @cond_2_marker + br i1 %var57, label %insert_then, label %insert_else insert_then: - call void @js_replace_at_marker(i32 %var54, i32 0, i32 %var48) + call void @js_replace_at_marker(i32 %var58, i32 0, i32 %var52) store i32 1, i32* @cond_2_current ret void insert_else: - call void @js_replace_at_marker(i32 %var54, i32 0, i32 %var49) + call void @js_replace_at_marker(i32 %var58, i32 0, i32 %var53) store i32 0, i32* @cond_2_current ret void } @@ -327,28 +361,28 @@ insert_else: ; Re-evaluate conditional 2 define void @reevaluate_conditional_2() { entry: - %var55 = load i32, i32* @signal_VerticalTabs_setting_tab - %var56 = icmp eq i32 %var55, 2 - %var57 = zext i1 %var56 to i32 - %var58 = icmp ne i32 %var57, 0 - %var59 = zext i1 %var58 to i32 - %var60 = load i32, i32* @cond_2_current - %var61 = icmp ne i32 %var60, %var59 - br i1 %var61, label %swap, label %done + %var59 = load i32, i32* @signal_VerticalTabs_setting_tab + %var60 = icmp eq i32 %var59, 2 + %var61 = zext i1 %var60 to i32 + %var62 = icmp ne i32 %var61, 0 + %var63 = zext i1 %var62 to i32 + %var64 = load i32, i32* @cond_2_current + %var65 = icmp ne i32 %var64, %var63 + br i1 %var65, label %swap, label %done swap: - br i1 %var58, label %swap_to_then, label %swap_to_else + br i1 %var62, label %swap_to_then, label %swap_to_else swap_to_then: - %var62 = load i32, i32* @cond_2_else_root - %var63 = load i32, i32* @cond_2_then_root - %var64 = load i32, i32* @cond_2_marker - call void @js_replace_at_marker(i32 %var64, i32 %var62, i32 %var63) + %var66 = load i32, i32* @cond_2_else_root + %var67 = load i32, i32* @cond_2_then_root + %var68 = load i32, i32* @cond_2_marker + call void @js_replace_at_marker(i32 %var68, i32 %var66, i32 %var67) store i32 1, i32* @cond_2_current br label %done swap_to_else: - %var65 = load i32, i32* @cond_2_then_root - %var66 = load i32, i32* @cond_2_else_root - %var67 = load i32, i32* @cond_2_marker - call void @js_replace_at_marker(i32 %var67, i32 %var65, i32 %var66) + %var69 = load i32, i32* @cond_2_then_root + %var70 = load i32, i32* @cond_2_else_root + %var71 = load i32, i32* @cond_2_marker + call void @js_replace_at_marker(i32 %var71, i32 %var69, i32 %var70) store i32 0, i32* @cond_2_current br label %done done: @@ -357,57 +391,61 @@ done: define i32 @_render_cond_2_then() { entry: - %var68 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.0, i32 0, i32 0)) - call void @js_set_attribute(i32 %var68, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.2, i32 0, i32 0)) - call void @js_bind_event(i32 %var68, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.9, i32 0, i32 0)) - %var69 = call i32 @js_create_text(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.10, i32 0, i32 0)) - call void @js_append_child(i32 %var68, i32 %var69) - ret i32 %var68 + %var72 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var73 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + call void @js_set_attribute(i32 %var73, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.3, i32 0, i32 0)) + call void @js_bind_event(i32 %var73, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.12, i32 0, i32 0)) + %var74 = call i32 @js_create_text(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.13, i32 0, i32 0)) + call void @js_append_child(i32 %var73, i32 %var74) + call void @js_append_child(i32 %var72, i32 %var73) + ret i32 %var72 } define i32 @_render_cond_2_else() { entry: - %var70 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.0, i32 0, i32 0)) - call void @js_set_attribute(i32 %var70, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i32 0, i32 0)) - call void @js_bind_event(i32 %var70, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.9, i32 0, i32 0)) - %var71 = call i32 @js_create_text(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.10, i32 0, i32 0)) - call void @js_append_child(i32 %var70, i32 %var71) - ret i32 %var70 + %var75 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var76 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + call void @js_set_attribute(i32 %var76, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.7, i32 0, i32 0)) + call void @js_bind_event(i32 %var76, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.14, i32 0, i32 0)) + %var77 = call i32 @js_create_text(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.13, i32 0, i32 0)) + call void @js_append_child(i32 %var76, i32 %var77) + call void @js_append_child(i32 %var75, i32 %var76) + ret i32 %var75 } ; Initialize conditional 3 (match) define void @_init_conditional_3() { entry: ; Render all cases upfront - %var72 = call i32 @_render_cond_3_case_0() - store i32 %var72, i32* @cond_3_case_0_root - %var73 = call i32 @_render_cond_3_case_1() - store i32 %var73, i32* @cond_3_case_1_root - %var74 = call i32 @_render_cond_3_case_2() - store i32 %var74, i32* @cond_3_case_2_root - %var75 = call i32 @_render_cond_3_case_3() - store i32 %var75, i32* @cond_3_case_3_root - %var76 = load i32, i32* @signal_VerticalTabs_setting_tab - %var77 = load i32, i32* @cond_3_marker - switch i32 %var76, label %insert_case_3 [ + %var78 = call i32 @_render_cond_3_case_0() + store i32 %var78, i32* @cond_3_case_0_root + %var79 = call i32 @_render_cond_3_case_1() + store i32 %var79, i32* @cond_3_case_1_root + %var80 = call i32 @_render_cond_3_case_2() + store i32 %var80, i32* @cond_3_case_2_root + %var81 = call i32 @_render_cond_3_case_3() + store i32 %var81, i32* @cond_3_case_3_root + %var82 = load i32, i32* @signal_VerticalTabs_setting_tab + %var83 = load i32, i32* @cond_3_marker + switch i32 %var82, label %insert_case_3 [ i32 0, label %insert_case_0 i32 1, label %insert_case_1 i32 2, label %insert_case_2 ] insert_case_0: - call void @js_replace_at_marker(i32 %var77, i32 0, i32 %var72) + call void @js_replace_at_marker(i32 %var83, i32 0, i32 %var78) store i32 0, i32* @cond_3_current ret void insert_case_1: - call void @js_replace_at_marker(i32 %var77, i32 0, i32 %var73) + call void @js_replace_at_marker(i32 %var83, i32 0, i32 %var79) store i32 1, i32* @cond_3_current ret void insert_case_2: - call void @js_replace_at_marker(i32 %var77, i32 0, i32 %var74) + call void @js_replace_at_marker(i32 %var83, i32 0, i32 %var80) store i32 2, i32* @cond_3_current ret void insert_case_3: - call void @js_replace_at_marker(i32 %var77, i32 0, i32 %var75) + call void @js_replace_at_marker(i32 %var83, i32 0, i32 %var81) store i32 3, i32* @cond_3_current ret void } @@ -415,51 +453,127 @@ insert_case_3: ; Re-evaluate conditional 3 (match) define void @reevaluate_conditional_3() { entry: - %var78 = load i32, i32* @signal_VerticalTabs_setting_tab - %var79 = load i32, i32* @cond_3_current - switch i32 %var78, label %case_3 [ + %var84 = load i32, i32* @signal_VerticalTabs_setting_tab + %var85 = load i32, i32* @cond_3_current + switch i32 %var84, label %case_3 [ i32 0, label %case_0 i32 1, label %case_1 i32 2, label %case_2 ] case_0: - %var80 = icmp ne i32 %var79, 0 - br i1 %var80, label %swap_0, label %done + %var86 = icmp ne i32 %var85, 0 + br i1 %var86, label %swap_0, label %done swap_0: - %var83 = load i32, i32* @cond_3_marker - %var82 = load i32, i32* @cond_3_case_0_root - %var81 = load i32, i32* @cond_3_case_0_root - call void @js_replace_at_marker(i32 %var83, i32 %var81, i32 %var82) + %var87 = load i32, i32* @cond_3_marker + %var88 = load i32, i32* @cond_3_case_0_root + switch i32 %var85, label %load_old_0_3 [ + i32 0, label %load_old_0_0 + i32 1, label %load_old_0_1 + i32 2, label %load_old_0_2 + i32 3, label %load_old_0_3 + ] +load_old_0_0: + %var90 = load i32, i32* @cond_3_case_0_root + br label %merge_0 +load_old_0_1: + %var91 = load i32, i32* @cond_3_case_1_root + br label %merge_0 +load_old_0_2: + %var92 = load i32, i32* @cond_3_case_2_root + br label %merge_0 +load_old_0_3: + %var93 = load i32, i32* @cond_3_case_3_root + br label %merge_0 +merge_0: + %var89 = phi i32 [ %var90, %load_old_0_0 ], [ %var91, %load_old_0_1 ], [ %var92, %load_old_0_2 ], [ %var93, %load_old_0_3 ] + call void @js_replace_at_marker(i32 %var87, i32 %var89, i32 %var88) store i32 0, i32* @cond_3_current br label %done case_1: - %var85 = icmp ne i32 %var79, 1 - br i1 %var85, label %swap_1, label %done + %var94 = icmp ne i32 %var85, 1 + br i1 %var94, label %swap_1, label %done swap_1: - %var88 = load i32, i32* @cond_3_marker - %var87 = load i32, i32* @cond_3_case_1_root - %var86 = load i32, i32* @cond_3_case_0_root - call void @js_replace_at_marker(i32 %var88, i32 %var86, i32 %var87) + %var95 = load i32, i32* @cond_3_marker + %var96 = load i32, i32* @cond_3_case_1_root + switch i32 %var85, label %load_old_1_3 [ + i32 0, label %load_old_1_0 + i32 1, label %load_old_1_1 + i32 2, label %load_old_1_2 + i32 3, label %load_old_1_3 + ] +load_old_1_0: + %var98 = load i32, i32* @cond_3_case_0_root + br label %merge_1 +load_old_1_1: + %var99 = load i32, i32* @cond_3_case_1_root + br label %merge_1 +load_old_1_2: + %var100 = load i32, i32* @cond_3_case_2_root + br label %merge_1 +load_old_1_3: + %var101 = load i32, i32* @cond_3_case_3_root + br label %merge_1 +merge_1: + %var97 = phi i32 [ %var98, %load_old_1_0 ], [ %var99, %load_old_1_1 ], [ %var100, %load_old_1_2 ], [ %var101, %load_old_1_3 ] + call void @js_replace_at_marker(i32 %var95, i32 %var97, i32 %var96) store i32 1, i32* @cond_3_current br label %done case_2: - %var90 = icmp ne i32 %var79, 2 - br i1 %var90, label %swap_2, label %done + %var102 = icmp ne i32 %var85, 2 + br i1 %var102, label %swap_2, label %done swap_2: - %var93 = load i32, i32* @cond_3_marker - %var92 = load i32, i32* @cond_3_case_2_root - %var91 = load i32, i32* @cond_3_case_0_root - call void @js_replace_at_marker(i32 %var93, i32 %var91, i32 %var92) + %var103 = load i32, i32* @cond_3_marker + %var104 = load i32, i32* @cond_3_case_2_root + switch i32 %var85, label %load_old_2_3 [ + i32 0, label %load_old_2_0 + i32 1, label %load_old_2_1 + i32 2, label %load_old_2_2 + i32 3, label %load_old_2_3 + ] +load_old_2_0: + %var106 = load i32, i32* @cond_3_case_0_root + br label %merge_2 +load_old_2_1: + %var107 = load i32, i32* @cond_3_case_1_root + br label %merge_2 +load_old_2_2: + %var108 = load i32, i32* @cond_3_case_2_root + br label %merge_2 +load_old_2_3: + %var109 = load i32, i32* @cond_3_case_3_root + br label %merge_2 +merge_2: + %var105 = phi i32 [ %var106, %load_old_2_0 ], [ %var107, %load_old_2_1 ], [ %var108, %load_old_2_2 ], [ %var109, %load_old_2_3 ] + call void @js_replace_at_marker(i32 %var103, i32 %var105, i32 %var104) store i32 2, i32* @cond_3_current br label %done case_3: - %var95 = icmp ne i32 %var79, 3 - br i1 %var95, label %swap_3, label %done + %var110 = icmp ne i32 %var85, 3 + br i1 %var110, label %swap_3, label %done swap_3: - %var98 = load i32, i32* @cond_3_marker - %var97 = load i32, i32* @cond_3_case_3_root - %var96 = load i32, i32* @cond_3_case_0_root - call void @js_replace_at_marker(i32 %var98, i32 %var96, i32 %var97) + %var111 = load i32, i32* @cond_3_marker + %var112 = load i32, i32* @cond_3_case_3_root + switch i32 %var85, label %load_old_3_3 [ + i32 0, label %load_old_3_0 + i32 1, label %load_old_3_1 + i32 2, label %load_old_3_2 + i32 3, label %load_old_3_3 + ] +load_old_3_0: + %var114 = load i32, i32* @cond_3_case_0_root + br label %merge_3 +load_old_3_1: + %var115 = load i32, i32* @cond_3_case_1_root + br label %merge_3 +load_old_3_2: + %var116 = load i32, i32* @cond_3_case_2_root + br label %merge_3 +load_old_3_3: + %var117 = load i32, i32* @cond_3_case_3_root + br label %merge_3 +merge_3: + %var113 = phi i32 [ %var114, %load_old_3_0 ], [ %var115, %load_old_3_1 ], [ %var116, %load_old_3_2 ], [ %var117, %load_old_3_3 ] + call void @js_replace_at_marker(i32 %var111, i32 %var113, i32 %var112) store i32 3, i32* @cond_3_current br label %done done: @@ -468,112 +582,120 @@ done: define i32 @_render_cond_3_case_0() { entry: - %var100 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var100, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.12, i32 0, i32 0)) - %var101 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.13, i32 0, i32 0)) - %var102 = call i32 @js_create_text(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.14, i32 0, i32 0)) - call void @js_append_child(i32 %var101, i32 %var102) - call void @js_append_child(i32 %var100, i32 %var101) - call void @js_append_child(i32 %var100, i32 %var101) - %var103 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var104 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.16, i32 0, i32 0)) - call void @js_append_child(i32 %var103, i32 %var104) - call void @js_append_child(i32 %var100, i32 %var103) - call void @js_append_child(i32 %var100, i32 %var103) - %var105 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var106 = call i32 @js_create_text(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.17, i32 0, i32 0)) - call void @js_append_child(i32 %var105, i32 %var106) - call void @js_append_child(i32 %var100, i32 %var105) - call void @js_append_child(i32 %var100, i32 %var105) - ret i32 %var100 + %var118 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var119 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var119, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.15, i32 0, i32 0)) + %var120 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.16, i32 0, i32 0)) + %var121 = call i32 @js_create_text(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.17, i32 0, i32 0)) + call void @js_append_child(i32 %var120, i32 %var121) + call void @js_append_child(i32 %var119, i32 %var120) + call void @js_append_child(i32 %var119, i32 %var120) + %var122 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var123 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.19, i32 0, i32 0)) + call void @js_append_child(i32 %var122, i32 %var123) + call void @js_append_child(i32 %var119, i32 %var122) + call void @js_append_child(i32 %var119, i32 %var122) + %var124 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var125 = call i32 @js_create_text(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.20, i32 0, i32 0)) + call void @js_append_child(i32 %var124, i32 %var125) + call void @js_append_child(i32 %var119, i32 %var124) + call void @js_append_child(i32 %var119, i32 %var124) + call void @js_append_child(i32 %var118, i32 %var119) + ret i32 %var118 } define i32 @_render_cond_3_case_1() { entry: - %var107 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var107, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.12, i32 0, i32 0)) - %var108 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.13, i32 0, i32 0)) - %var109 = call i32 @js_create_text(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.18, i32 0, i32 0)) - call void @js_append_child(i32 %var108, i32 %var109) - call void @js_append_child(i32 %var107, i32 %var108) - call void @js_append_child(i32 %var107, i32 %var108) - %var110 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var111 = call i32 @js_create_text(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.19, i32 0, i32 0)) - call void @js_append_child(i32 %var110, i32 %var111) - call void @js_append_child(i32 %var107, i32 %var110) - call void @js_append_child(i32 %var107, i32 %var110) - %var112 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var113 = call i32 @js_create_text(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.20, i32 0, i32 0)) - call void @js_append_child(i32 %var112, i32 %var113) - call void @js_append_child(i32 %var107, i32 %var112) - call void @js_append_child(i32 %var107, i32 %var112) - ret i32 %var107 + %var126 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var127 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var127, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.15, i32 0, i32 0)) + %var128 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.16, i32 0, i32 0)) + %var129 = call i32 @js_create_text(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.21, i32 0, i32 0)) + call void @js_append_child(i32 %var128, i32 %var129) + call void @js_append_child(i32 %var127, i32 %var128) + call void @js_append_child(i32 %var127, i32 %var128) + %var130 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var131 = call i32 @js_create_text(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.22, i32 0, i32 0)) + call void @js_append_child(i32 %var130, i32 %var131) + call void @js_append_child(i32 %var127, i32 %var130) + call void @js_append_child(i32 %var127, i32 %var130) + %var132 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var133 = call i32 @js_create_text(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.23, i32 0, i32 0)) + call void @js_append_child(i32 %var132, i32 %var133) + call void @js_append_child(i32 %var127, i32 %var132) + call void @js_append_child(i32 %var127, i32 %var132) + call void @js_append_child(i32 %var126, i32 %var127) + ret i32 %var126 } define i32 @_render_cond_3_case_2() { entry: - %var114 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var114, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.12, i32 0, i32 0)) - %var115 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.13, i32 0, i32 0)) - %var116 = call i32 @js_create_text(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.21, i32 0, i32 0)) - call void @js_append_child(i32 %var115, i32 %var116) - call void @js_append_child(i32 %var114, i32 %var115) - call void @js_append_child(i32 %var114, i32 %var115) - %var117 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var118 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.22, i32 0, i32 0)) - call void @js_append_child(i32 %var117, i32 %var118) - call void @js_append_child(i32 %var114, i32 %var117) - call void @js_append_child(i32 %var114, i32 %var117) - %var119 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var120 = call i32 @js_create_text(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.23, i32 0, i32 0)) - call void @js_append_child(i32 %var119, i32 %var120) - call void @js_append_child(i32 %var114, i32 %var119) - call void @js_append_child(i32 %var114, i32 %var119) - ret i32 %var114 + %var134 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var135 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var135, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.15, i32 0, i32 0)) + %var136 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.16, i32 0, i32 0)) + %var137 = call i32 @js_create_text(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.24, i32 0, i32 0)) + call void @js_append_child(i32 %var136, i32 %var137) + call void @js_append_child(i32 %var135, i32 %var136) + call void @js_append_child(i32 %var135, i32 %var136) + %var138 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var139 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.25, i32 0, i32 0)) + call void @js_append_child(i32 %var138, i32 %var139) + call void @js_append_child(i32 %var135, i32 %var138) + call void @js_append_child(i32 %var135, i32 %var138) + %var140 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var141 = call i32 @js_create_text(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.26, i32 0, i32 0)) + call void @js_append_child(i32 %var140, i32 %var141) + call void @js_append_child(i32 %var135, i32 %var140) + call void @js_append_child(i32 %var135, i32 %var140) + call void @js_append_child(i32 %var134, i32 %var135) + ret i32 %var134 } define i32 @_render_cond_3_case_3() { entry: - %var121 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var121, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.12, i32 0, i32 0)) - %var122 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var123 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.24, i32 0, i32 0)) - call void @js_append_child(i32 %var122, i32 %var123) - call void @js_append_child(i32 %var121, i32 %var122) - call void @js_append_child(i32 %var121, i32 %var122) - ret i32 %var121 + %var142 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var143 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var143, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.15, i32 0, i32 0)) + %var144 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var145 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.27, i32 0, i32 0)) + call void @js_append_child(i32 %var144, i32 %var145) + call void @js_append_child(i32 %var143, i32 %var144) + call void @js_append_child(i32 %var143, i32 %var144) + call void @js_append_child(i32 %var142, i32 %var143) + ret i32 %var142 } ; Component render function define void @render_VerticalTabs() { entry: - %var124 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var124, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.25, i32 0, i32 0)) - %var125 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var125, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.26, i32 0, i32 0)) - %var126 = call i32 @js_create_marker() - call void @js_append_child(i32 %var125, i32 %var126) - store i32 %var126, i32* @cond_0_marker + %var146 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var146, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.28, i32 0, i32 0)) + %var147 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var147, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.29, i32 0, i32 0)) + %var148 = call i32 @js_create_marker() + call void @js_append_child(i32 %var147, i32 %var148) + store i32 %var148, i32* @cond_0_marker call void @_init_conditional_0() - %var127 = call i32 @js_create_marker() - call void @js_append_child(i32 %var125, i32 %var127) - store i32 %var127, i32* @cond_1_marker + %var149 = call i32 @js_create_marker() + call void @js_append_child(i32 %var147, i32 %var149) + store i32 %var149, i32* @cond_1_marker call void @_init_conditional_1() - %var128 = call i32 @js_create_marker() - call void @js_append_child(i32 %var125, i32 %var128) - store i32 %var128, i32* @cond_2_marker + %var150 = call i32 @js_create_marker() + call void @js_append_child(i32 %var147, i32 %var150) + store i32 %var150, i32* @cond_2_marker call void @_init_conditional_2() - call void @js_append_child(i32 %var124, i32 %var125) - call void @js_append_child(i32 %var124, i32 %var125) - %var129 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var129, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.27, i32 0, i32 0)) - %var130 = call i32 @js_create_marker() - call void @js_append_child(i32 %var129, i32 %var130) - store i32 %var130, i32* @cond_3_marker + call void @js_append_child(i32 %var146, i32 %var147) + call void @js_append_child(i32 %var146, i32 %var147) + %var151 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var151, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.30, i32 0, i32 0)) + %var152 = call i32 @js_create_marker() + call void @js_append_child(i32 %var151, i32 %var152) + store i32 %var152, i32* @cond_3_marker call void @_init_conditional_3() - call void @js_append_child(i32 %var124, i32 %var129) - call void @js_append_child(i32 %var124, i32 %var129) - call void @js_set_root(i32 %var124) + call void @js_append_child(i32 %var146, i32 %var151) + call void @js_append_child(i32 %var146, i32 %var151) + call void @js_set_root(i32 %var146) ret void } @@ -614,32 +736,52 @@ entry: ret void } -; Event handler: set_tab_0 -define void @set_tab_0() { +; Event handler: _lambda_0_Tabs +define void @_lambda_0_Tabs() { entry: - store i32 0, i32* @signal_Tabs_tab_index - call void @reevaluate_conditional_4() - call void @reevaluate_conditional_5() - call void @reevaluate_conditional_6() - call void @reevaluate_conditional_7() + call void @set_tab(i32 0) ret void } -; Event handler: set_tab_1 -define void @set_tab_1() { +; Event handler: _lambda_1_Tabs +define void @_lambda_1_Tabs() { entry: - store i32 1, i32* @signal_Tabs_tab_index - call void @reevaluate_conditional_4() - call void @reevaluate_conditional_5() - call void @reevaluate_conditional_6() - call void @reevaluate_conditional_7() + call void @set_tab(i32 0) ret void } -; Event handler: set_tab_2 -define void @set_tab_2() { +; Event handler: _lambda_2_Tabs +define void @_lambda_2_Tabs() { entry: - store i32 2, i32* @signal_Tabs_tab_index + call void @set_tab(i32 1) + ret void +} + +; Event handler: _lambda_3_Tabs +define void @_lambda_3_Tabs() { +entry: + call void @set_tab(i32 1) + ret void +} + +; Event handler: _lambda_4_Tabs +define void @_lambda_4_Tabs() { +entry: + call void @set_tab(i32 2) + ret void +} + +; Event handler: _lambda_5_Tabs +define void @_lambda_5_Tabs() { +entry: + call void @set_tab(i32 2) + ret void +} + +; Event handler: set_tab +define void @set_tab(i32 %value) { +entry: + store i32 %value, i32* @signal_Tabs_tab_index call void @reevaluate_conditional_4() call void @reevaluate_conditional_5() call void @reevaluate_conditional_6() @@ -651,22 +793,22 @@ entry: define void @_init_conditional_4() { entry: ; Render both branches upfront - %var131 = call i32 @_render_cond_4_then() - %var132 = call i32 @_render_cond_4_else() - store i32 %var131, i32* @cond_4_then_root - store i32 %var132, i32* @cond_4_else_root - %var133 = load i32, i32* @signal_Tabs_tab_index - %var134 = icmp eq i32 %var133, 0 - %var135 = zext i1 %var134 to i32 - %var136 = icmp ne i32 %var135, 0 - %var137 = load i32, i32* @cond_4_marker - br i1 %var136, label %insert_then, label %insert_else + %var153 = call i32 @_render_cond_4_then() + %var154 = call i32 @_render_cond_4_else() + store i32 %var153, i32* @cond_4_then_root + store i32 %var154, i32* @cond_4_else_root + %var155 = load i32, i32* @signal_Tabs_tab_index + %var156 = icmp eq i32 %var155, 0 + %var157 = zext i1 %var156 to i32 + %var158 = icmp ne i32 %var157, 0 + %var159 = load i32, i32* @cond_4_marker + br i1 %var158, label %insert_then, label %insert_else insert_then: - call void @js_replace_at_marker(i32 %var137, i32 0, i32 %var131) + call void @js_replace_at_marker(i32 %var159, i32 0, i32 %var153) store i32 1, i32* @cond_4_current ret void insert_else: - call void @js_replace_at_marker(i32 %var137, i32 0, i32 %var132) + call void @js_replace_at_marker(i32 %var159, i32 0, i32 %var154) store i32 0, i32* @cond_4_current ret void } @@ -674,28 +816,28 @@ insert_else: ; Re-evaluate conditional 4 define void @reevaluate_conditional_4() { entry: - %var138 = load i32, i32* @signal_Tabs_tab_index - %var139 = icmp eq i32 %var138, 0 - %var140 = zext i1 %var139 to i32 - %var141 = icmp ne i32 %var140, 0 - %var142 = zext i1 %var141 to i32 - %var143 = load i32, i32* @cond_4_current - %var144 = icmp ne i32 %var143, %var142 - br i1 %var144, label %swap, label %done + %var160 = load i32, i32* @signal_Tabs_tab_index + %var161 = icmp eq i32 %var160, 0 + %var162 = zext i1 %var161 to i32 + %var163 = icmp ne i32 %var162, 0 + %var164 = zext i1 %var163 to i32 + %var165 = load i32, i32* @cond_4_current + %var166 = icmp ne i32 %var165, %var164 + br i1 %var166, label %swap, label %done swap: - br i1 %var141, label %swap_to_then, label %swap_to_else + br i1 %var163, label %swap_to_then, label %swap_to_else swap_to_then: - %var145 = load i32, i32* @cond_4_else_root - %var146 = load i32, i32* @cond_4_then_root - %var147 = load i32, i32* @cond_4_marker - call void @js_replace_at_marker(i32 %var147, i32 %var145, i32 %var146) + %var167 = load i32, i32* @cond_4_else_root + %var168 = load i32, i32* @cond_4_then_root + %var169 = load i32, i32* @cond_4_marker + call void @js_replace_at_marker(i32 %var169, i32 %var167, i32 %var168) store i32 1, i32* @cond_4_current br label %done swap_to_else: - %var148 = load i32, i32* @cond_4_then_root - %var149 = load i32, i32* @cond_4_else_root - %var150 = load i32, i32* @cond_4_marker - call void @js_replace_at_marker(i32 %var150, i32 %var148, i32 %var149) + %var170 = load i32, i32* @cond_4_then_root + %var171 = load i32, i32* @cond_4_else_root + %var172 = load i32, i32* @cond_4_marker + call void @js_replace_at_marker(i32 %var172, i32 %var170, i32 %var171) store i32 0, i32* @cond_4_current br label %done done: @@ -704,50 +846,54 @@ done: define i32 @_render_cond_4_then() { entry: - %var151 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.28, i32 0, i32 0)) - call void @js_set_attribute(i32 %var151, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.29, i32 0, i32 0)) - %var152 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.0, i32 0, i32 0)) - call void @js_bind_event(i32 %var152, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.30, i32 0, i32 0)) - %var153 = call i32 @js_create_text(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.31, i32 0, i32 0)) - call void @js_append_child(i32 %var152, i32 %var153) - call void @js_append_child(i32 %var151, i32 %var152) - call void @js_append_child(i32 %var151, i32 %var152) - ret i32 %var151 + %var173 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var174 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.31, i32 0, i32 0)) + call void @js_set_attribute(i32 %var174, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.32, i32 0, i32 0)) + %var175 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + call void @js_bind_event(i32 %var175, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.33, i32 0, i32 0)) + %var176 = call i32 @js_create_text(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.34, i32 0, i32 0)) + call void @js_append_child(i32 %var175, i32 %var176) + call void @js_append_child(i32 %var174, i32 %var175) + call void @js_append_child(i32 %var174, i32 %var175) + call void @js_append_child(i32 %var173, i32 %var174) + ret i32 %var173 } define i32 @_render_cond_4_else() { entry: - %var154 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.28, i32 0, i32 0)) - call void @js_set_attribute(i32 %var154, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.32, i32 0, i32 0)) - %var155 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.0, i32 0, i32 0)) - call void @js_bind_event(i32 %var155, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.30, i32 0, i32 0)) - %var156 = call i32 @js_create_text(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.31, i32 0, i32 0)) - call void @js_append_child(i32 %var155, i32 %var156) - call void @js_append_child(i32 %var154, i32 %var155) - call void @js_append_child(i32 %var154, i32 %var155) - ret i32 %var154 + %var177 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var178 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.31, i32 0, i32 0)) + call void @js_set_attribute(i32 %var178, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.35, i32 0, i32 0)) + %var179 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + call void @js_bind_event(i32 %var179, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.36, i32 0, i32 0)) + %var180 = call i32 @js_create_text(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.34, i32 0, i32 0)) + call void @js_append_child(i32 %var179, i32 %var180) + call void @js_append_child(i32 %var178, i32 %var179) + call void @js_append_child(i32 %var178, i32 %var179) + call void @js_append_child(i32 %var177, i32 %var178) + ret i32 %var177 } ; Initialize conditional 5 define void @_init_conditional_5() { entry: ; Render both branches upfront - %var157 = call i32 @_render_cond_5_then() - %var158 = call i32 @_render_cond_5_else() - store i32 %var157, i32* @cond_5_then_root - store i32 %var158, i32* @cond_5_else_root - %var159 = load i32, i32* @signal_Tabs_tab_index - %var160 = icmp eq i32 %var159, 1 - %var161 = zext i1 %var160 to i32 - %var162 = icmp ne i32 %var161, 0 - %var163 = load i32, i32* @cond_5_marker - br i1 %var162, label %insert_then, label %insert_else + %var181 = call i32 @_render_cond_5_then() + %var182 = call i32 @_render_cond_5_else() + store i32 %var181, i32* @cond_5_then_root + store i32 %var182, i32* @cond_5_else_root + %var183 = load i32, i32* @signal_Tabs_tab_index + %var184 = icmp eq i32 %var183, 1 + %var185 = zext i1 %var184 to i32 + %var186 = icmp ne i32 %var185, 0 + %var187 = load i32, i32* @cond_5_marker + br i1 %var186, label %insert_then, label %insert_else insert_then: - call void @js_replace_at_marker(i32 %var163, i32 0, i32 %var157) + call void @js_replace_at_marker(i32 %var187, i32 0, i32 %var181) store i32 1, i32* @cond_5_current ret void insert_else: - call void @js_replace_at_marker(i32 %var163, i32 0, i32 %var158) + call void @js_replace_at_marker(i32 %var187, i32 0, i32 %var182) store i32 0, i32* @cond_5_current ret void } @@ -755,28 +901,28 @@ insert_else: ; Re-evaluate conditional 5 define void @reevaluate_conditional_5() { entry: - %var164 = load i32, i32* @signal_Tabs_tab_index - %var165 = icmp eq i32 %var164, 1 - %var166 = zext i1 %var165 to i32 - %var167 = icmp ne i32 %var166, 0 - %var168 = zext i1 %var167 to i32 - %var169 = load i32, i32* @cond_5_current - %var170 = icmp ne i32 %var169, %var168 - br i1 %var170, label %swap, label %done + %var188 = load i32, i32* @signal_Tabs_tab_index + %var189 = icmp eq i32 %var188, 1 + %var190 = zext i1 %var189 to i32 + %var191 = icmp ne i32 %var190, 0 + %var192 = zext i1 %var191 to i32 + %var193 = load i32, i32* @cond_5_current + %var194 = icmp ne i32 %var193, %var192 + br i1 %var194, label %swap, label %done swap: - br i1 %var167, label %swap_to_then, label %swap_to_else + br i1 %var191, label %swap_to_then, label %swap_to_else swap_to_then: - %var171 = load i32, i32* @cond_5_else_root - %var172 = load i32, i32* @cond_5_then_root - %var173 = load i32, i32* @cond_5_marker - call void @js_replace_at_marker(i32 %var173, i32 %var171, i32 %var172) + %var195 = load i32, i32* @cond_5_else_root + %var196 = load i32, i32* @cond_5_then_root + %var197 = load i32, i32* @cond_5_marker + call void @js_replace_at_marker(i32 %var197, i32 %var195, i32 %var196) store i32 1, i32* @cond_5_current br label %done swap_to_else: - %var174 = load i32, i32* @cond_5_then_root - %var175 = load i32, i32* @cond_5_else_root - %var176 = load i32, i32* @cond_5_marker - call void @js_replace_at_marker(i32 %var176, i32 %var174, i32 %var175) + %var198 = load i32, i32* @cond_5_then_root + %var199 = load i32, i32* @cond_5_else_root + %var200 = load i32, i32* @cond_5_marker + call void @js_replace_at_marker(i32 %var200, i32 %var198, i32 %var199) store i32 0, i32* @cond_5_current br label %done done: @@ -785,50 +931,54 @@ done: define i32 @_render_cond_5_then() { entry: - %var177 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.28, i32 0, i32 0)) - call void @js_set_attribute(i32 %var177, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.29, i32 0, i32 0)) - %var178 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.0, i32 0, i32 0)) - call void @js_bind_event(i32 %var178, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.33, i32 0, i32 0)) - %var179 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.34, i32 0, i32 0)) - call void @js_append_child(i32 %var178, i32 %var179) - call void @js_append_child(i32 %var177, i32 %var178) - call void @js_append_child(i32 %var177, i32 %var178) - ret i32 %var177 + %var201 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var202 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.31, i32 0, i32 0)) + call void @js_set_attribute(i32 %var202, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.32, i32 0, i32 0)) + %var203 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + call void @js_bind_event(i32 %var203, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.37, i32 0, i32 0)) + %var204 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.38, i32 0, i32 0)) + call void @js_append_child(i32 %var203, i32 %var204) + call void @js_append_child(i32 %var202, i32 %var203) + call void @js_append_child(i32 %var202, i32 %var203) + call void @js_append_child(i32 %var201, i32 %var202) + ret i32 %var201 } define i32 @_render_cond_5_else() { entry: - %var180 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.28, i32 0, i32 0)) - call void @js_set_attribute(i32 %var180, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.32, i32 0, i32 0)) - %var181 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.0, i32 0, i32 0)) - call void @js_bind_event(i32 %var181, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.33, i32 0, i32 0)) - %var182 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.34, i32 0, i32 0)) - call void @js_append_child(i32 %var181, i32 %var182) - call void @js_append_child(i32 %var180, i32 %var181) - call void @js_append_child(i32 %var180, i32 %var181) - ret i32 %var180 + %var205 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var206 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.31, i32 0, i32 0)) + call void @js_set_attribute(i32 %var206, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.35, i32 0, i32 0)) + %var207 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + call void @js_bind_event(i32 %var207, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.39, i32 0, i32 0)) + %var208 = call i32 @js_create_text(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.38, i32 0, i32 0)) + call void @js_append_child(i32 %var207, i32 %var208) + call void @js_append_child(i32 %var206, i32 %var207) + call void @js_append_child(i32 %var206, i32 %var207) + call void @js_append_child(i32 %var205, i32 %var206) + ret i32 %var205 } ; Initialize conditional 6 define void @_init_conditional_6() { entry: ; Render both branches upfront - %var183 = call i32 @_render_cond_6_then() - %var184 = call i32 @_render_cond_6_else() - store i32 %var183, i32* @cond_6_then_root - store i32 %var184, i32* @cond_6_else_root - %var185 = load i32, i32* @signal_Tabs_tab_index - %var186 = icmp eq i32 %var185, 2 - %var187 = zext i1 %var186 to i32 - %var188 = icmp ne i32 %var187, 0 - %var189 = load i32, i32* @cond_6_marker - br i1 %var188, label %insert_then, label %insert_else + %var209 = call i32 @_render_cond_6_then() + %var210 = call i32 @_render_cond_6_else() + store i32 %var209, i32* @cond_6_then_root + store i32 %var210, i32* @cond_6_else_root + %var211 = load i32, i32* @signal_Tabs_tab_index + %var212 = icmp eq i32 %var211, 2 + %var213 = zext i1 %var212 to i32 + %var214 = icmp ne i32 %var213, 0 + %var215 = load i32, i32* @cond_6_marker + br i1 %var214, label %insert_then, label %insert_else insert_then: - call void @js_replace_at_marker(i32 %var189, i32 0, i32 %var183) + call void @js_replace_at_marker(i32 %var215, i32 0, i32 %var209) store i32 1, i32* @cond_6_current ret void insert_else: - call void @js_replace_at_marker(i32 %var189, i32 0, i32 %var184) + call void @js_replace_at_marker(i32 %var215, i32 0, i32 %var210) store i32 0, i32* @cond_6_current ret void } @@ -836,28 +986,28 @@ insert_else: ; Re-evaluate conditional 6 define void @reevaluate_conditional_6() { entry: - %var190 = load i32, i32* @signal_Tabs_tab_index - %var191 = icmp eq i32 %var190, 2 - %var192 = zext i1 %var191 to i32 - %var193 = icmp ne i32 %var192, 0 - %var194 = zext i1 %var193 to i32 - %var195 = load i32, i32* @cond_6_current - %var196 = icmp ne i32 %var195, %var194 - br i1 %var196, label %swap, label %done + %var216 = load i32, i32* @signal_Tabs_tab_index + %var217 = icmp eq i32 %var216, 2 + %var218 = zext i1 %var217 to i32 + %var219 = icmp ne i32 %var218, 0 + %var220 = zext i1 %var219 to i32 + %var221 = load i32, i32* @cond_6_current + %var222 = icmp ne i32 %var221, %var220 + br i1 %var222, label %swap, label %done swap: - br i1 %var193, label %swap_to_then, label %swap_to_else + br i1 %var219, label %swap_to_then, label %swap_to_else swap_to_then: - %var197 = load i32, i32* @cond_6_else_root - %var198 = load i32, i32* @cond_6_then_root - %var199 = load i32, i32* @cond_6_marker - call void @js_replace_at_marker(i32 %var199, i32 %var197, i32 %var198) + %var223 = load i32, i32* @cond_6_else_root + %var224 = load i32, i32* @cond_6_then_root + %var225 = load i32, i32* @cond_6_marker + call void @js_replace_at_marker(i32 %var225, i32 %var223, i32 %var224) store i32 1, i32* @cond_6_current br label %done swap_to_else: - %var200 = load i32, i32* @cond_6_then_root - %var201 = load i32, i32* @cond_6_else_root - %var202 = load i32, i32* @cond_6_marker - call void @js_replace_at_marker(i32 %var202, i32 %var200, i32 %var201) + %var226 = load i32, i32* @cond_6_then_root + %var227 = load i32, i32* @cond_6_else_root + %var228 = load i32, i32* @cond_6_marker + call void @js_replace_at_marker(i32 %var228, i32 %var226, i32 %var227) store i32 0, i32* @cond_6_current br label %done done: @@ -866,63 +1016,67 @@ done: define i32 @_render_cond_6_then() { entry: - %var203 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.28, i32 0, i32 0)) - call void @js_set_attribute(i32 %var203, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.29, i32 0, i32 0)) - %var204 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.0, i32 0, i32 0)) - call void @js_bind_event(i32 %var204, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.35, i32 0, i32 0)) - %var205 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.36, i32 0, i32 0)) - call void @js_append_child(i32 %var204, i32 %var205) - call void @js_append_child(i32 %var203, i32 %var204) - call void @js_append_child(i32 %var203, i32 %var204) - ret i32 %var203 + %var229 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var230 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.31, i32 0, i32 0)) + call void @js_set_attribute(i32 %var230, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.32, i32 0, i32 0)) + %var231 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + call void @js_bind_event(i32 %var231, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.40, i32 0, i32 0)) + %var232 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.41, i32 0, i32 0)) + call void @js_append_child(i32 %var231, i32 %var232) + call void @js_append_child(i32 %var230, i32 %var231) + call void @js_append_child(i32 %var230, i32 %var231) + call void @js_append_child(i32 %var229, i32 %var230) + ret i32 %var229 } define i32 @_render_cond_6_else() { entry: - %var206 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.28, i32 0, i32 0)) - call void @js_set_attribute(i32 %var206, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.32, i32 0, i32 0)) - %var207 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.0, i32 0, i32 0)) - call void @js_bind_event(i32 %var207, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.35, i32 0, i32 0)) - %var208 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.36, i32 0, i32 0)) - call void @js_append_child(i32 %var207, i32 %var208) - call void @js_append_child(i32 %var206, i32 %var207) - call void @js_append_child(i32 %var206, i32 %var207) - ret i32 %var206 + %var233 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var234 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.31, i32 0, i32 0)) + call void @js_set_attribute(i32 %var234, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.35, i32 0, i32 0)) + %var235 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.1, i32 0, i32 0)) + call void @js_bind_event(i32 %var235, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.42, i32 0, i32 0)) + %var236 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.41, i32 0, i32 0)) + call void @js_append_child(i32 %var235, i32 %var236) + call void @js_append_child(i32 %var234, i32 %var235) + call void @js_append_child(i32 %var234, i32 %var235) + call void @js_append_child(i32 %var233, i32 %var234) + ret i32 %var233 } ; Initialize conditional 7 (match) define void @_init_conditional_7() { entry: ; Render all cases upfront - %var209 = call i32 @_render_cond_7_case_0() - store i32 %var209, i32* @cond_7_case_0_root - %var210 = call i32 @_render_cond_7_case_1() - store i32 %var210, i32* @cond_7_case_1_root - %var211 = call i32 @_render_cond_7_case_2() - store i32 %var211, i32* @cond_7_case_2_root - %var212 = call i32 @_render_cond_7_case_3() - store i32 %var212, i32* @cond_7_case_3_root - %var213 = load i32, i32* @signal_Tabs_tab_index - %var214 = load i32, i32* @cond_7_marker - switch i32 %var213, label %insert_case_3 [ + %var237 = call i32 @_render_cond_7_case_0() + store i32 %var237, i32* @cond_7_case_0_root + %var238 = call i32 @_render_cond_7_case_1() + store i32 %var238, i32* @cond_7_case_1_root + %var239 = call i32 @_render_cond_7_case_2() + store i32 %var239, i32* @cond_7_case_2_root + %var240 = call i32 @_render_cond_7_case_3() + store i32 %var240, i32* @cond_7_case_3_root + %var241 = load i32, i32* @signal_Tabs_tab_index + %var242 = load i32, i32* @cond_7_marker + switch i32 %var241, label %insert_case_3 [ i32 0, label %insert_case_0 i32 1, label %insert_case_1 i32 2, label %insert_case_2 ] insert_case_0: - call void @js_replace_at_marker(i32 %var214, i32 0, i32 %var209) + call void @js_replace_at_marker(i32 %var242, i32 0, i32 %var237) store i32 0, i32* @cond_7_current ret void insert_case_1: - call void @js_replace_at_marker(i32 %var214, i32 0, i32 %var210) + call void @js_replace_at_marker(i32 %var242, i32 0, i32 %var238) store i32 1, i32* @cond_7_current ret void insert_case_2: - call void @js_replace_at_marker(i32 %var214, i32 0, i32 %var211) + call void @js_replace_at_marker(i32 %var242, i32 0, i32 %var239) store i32 2, i32* @cond_7_current ret void insert_case_3: - call void @js_replace_at_marker(i32 %var214, i32 0, i32 %var212) + call void @js_replace_at_marker(i32 %var242, i32 0, i32 %var240) store i32 3, i32* @cond_7_current ret void } @@ -930,51 +1084,127 @@ insert_case_3: ; Re-evaluate conditional 7 (match) define void @reevaluate_conditional_7() { entry: - %var215 = load i32, i32* @signal_Tabs_tab_index - %var216 = load i32, i32* @cond_7_current - switch i32 %var215, label %case_3 [ + %var243 = load i32, i32* @signal_Tabs_tab_index + %var244 = load i32, i32* @cond_7_current + switch i32 %var243, label %case_3 [ i32 0, label %case_0 i32 1, label %case_1 i32 2, label %case_2 ] case_0: - %var217 = icmp ne i32 %var216, 0 - br i1 %var217, label %swap_0, label %done + %var245 = icmp ne i32 %var244, 0 + br i1 %var245, label %swap_0, label %done swap_0: - %var220 = load i32, i32* @cond_7_marker - %var219 = load i32, i32* @cond_7_case_0_root - %var218 = load i32, i32* @cond_7_case_0_root - call void @js_replace_at_marker(i32 %var220, i32 %var218, i32 %var219) + %var246 = load i32, i32* @cond_7_marker + %var247 = load i32, i32* @cond_7_case_0_root + switch i32 %var244, label %load_old_0_3 [ + i32 0, label %load_old_0_0 + i32 1, label %load_old_0_1 + i32 2, label %load_old_0_2 + i32 3, label %load_old_0_3 + ] +load_old_0_0: + %var249 = load i32, i32* @cond_7_case_0_root + br label %merge_0 +load_old_0_1: + %var250 = load i32, i32* @cond_7_case_1_root + br label %merge_0 +load_old_0_2: + %var251 = load i32, i32* @cond_7_case_2_root + br label %merge_0 +load_old_0_3: + %var252 = load i32, i32* @cond_7_case_3_root + br label %merge_0 +merge_0: + %var248 = phi i32 [ %var249, %load_old_0_0 ], [ %var250, %load_old_0_1 ], [ %var251, %load_old_0_2 ], [ %var252, %load_old_0_3 ] + call void @js_replace_at_marker(i32 %var246, i32 %var248, i32 %var247) store i32 0, i32* @cond_7_current br label %done case_1: - %var222 = icmp ne i32 %var216, 1 - br i1 %var222, label %swap_1, label %done + %var253 = icmp ne i32 %var244, 1 + br i1 %var253, label %swap_1, label %done swap_1: - %var225 = load i32, i32* @cond_7_marker - %var224 = load i32, i32* @cond_7_case_1_root - %var223 = load i32, i32* @cond_7_case_0_root - call void @js_replace_at_marker(i32 %var225, i32 %var223, i32 %var224) + %var254 = load i32, i32* @cond_7_marker + %var255 = load i32, i32* @cond_7_case_1_root + switch i32 %var244, label %load_old_1_3 [ + i32 0, label %load_old_1_0 + i32 1, label %load_old_1_1 + i32 2, label %load_old_1_2 + i32 3, label %load_old_1_3 + ] +load_old_1_0: + %var257 = load i32, i32* @cond_7_case_0_root + br label %merge_1 +load_old_1_1: + %var258 = load i32, i32* @cond_7_case_1_root + br label %merge_1 +load_old_1_2: + %var259 = load i32, i32* @cond_7_case_2_root + br label %merge_1 +load_old_1_3: + %var260 = load i32, i32* @cond_7_case_3_root + br label %merge_1 +merge_1: + %var256 = phi i32 [ %var257, %load_old_1_0 ], [ %var258, %load_old_1_1 ], [ %var259, %load_old_1_2 ], [ %var260, %load_old_1_3 ] + call void @js_replace_at_marker(i32 %var254, i32 %var256, i32 %var255) store i32 1, i32* @cond_7_current br label %done case_2: - %var227 = icmp ne i32 %var216, 2 - br i1 %var227, label %swap_2, label %done + %var261 = icmp ne i32 %var244, 2 + br i1 %var261, label %swap_2, label %done swap_2: - %var230 = load i32, i32* @cond_7_marker - %var229 = load i32, i32* @cond_7_case_2_root - %var228 = load i32, i32* @cond_7_case_0_root - call void @js_replace_at_marker(i32 %var230, i32 %var228, i32 %var229) + %var262 = load i32, i32* @cond_7_marker + %var263 = load i32, i32* @cond_7_case_2_root + switch i32 %var244, label %load_old_2_3 [ + i32 0, label %load_old_2_0 + i32 1, label %load_old_2_1 + i32 2, label %load_old_2_2 + i32 3, label %load_old_2_3 + ] +load_old_2_0: + %var265 = load i32, i32* @cond_7_case_0_root + br label %merge_2 +load_old_2_1: + %var266 = load i32, i32* @cond_7_case_1_root + br label %merge_2 +load_old_2_2: + %var267 = load i32, i32* @cond_7_case_2_root + br label %merge_2 +load_old_2_3: + %var268 = load i32, i32* @cond_7_case_3_root + br label %merge_2 +merge_2: + %var264 = phi i32 [ %var265, %load_old_2_0 ], [ %var266, %load_old_2_1 ], [ %var267, %load_old_2_2 ], [ %var268, %load_old_2_3 ] + call void @js_replace_at_marker(i32 %var262, i32 %var264, i32 %var263) store i32 2, i32* @cond_7_current br label %done case_3: - %var232 = icmp ne i32 %var216, 3 - br i1 %var232, label %swap_3, label %done + %var269 = icmp ne i32 %var244, 3 + br i1 %var269, label %swap_3, label %done swap_3: - %var235 = load i32, i32* @cond_7_marker - %var234 = load i32, i32* @cond_7_case_3_root - %var233 = load i32, i32* @cond_7_case_0_root - call void @js_replace_at_marker(i32 %var235, i32 %var233, i32 %var234) + %var270 = load i32, i32* @cond_7_marker + %var271 = load i32, i32* @cond_7_case_3_root + switch i32 %var244, label %load_old_3_3 [ + i32 0, label %load_old_3_0 + i32 1, label %load_old_3_1 + i32 2, label %load_old_3_2 + i32 3, label %load_old_3_3 + ] +load_old_3_0: + %var273 = load i32, i32* @cond_7_case_0_root + br label %merge_3 +load_old_3_1: + %var274 = load i32, i32* @cond_7_case_1_root + br label %merge_3 +load_old_3_2: + %var275 = load i32, i32* @cond_7_case_2_root + br label %merge_3 +load_old_3_3: + %var276 = load i32, i32* @cond_7_case_3_root + br label %merge_3 +merge_3: + %var272 = phi i32 [ %var273, %load_old_3_0 ], [ %var274, %load_old_3_1 ], [ %var275, %load_old_3_2 ], [ %var276, %load_old_3_3 ] + call void @js_replace_at_marker(i32 %var270, i32 %var272, i32 %var271) store i32 3, i32* @cond_7_current br label %done done: @@ -983,160 +1213,168 @@ done: define i32 @_render_cond_7_case_0() { entry: - %var237 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var237, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.37, i32 0, i32 0)) - %var238 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.38, i32 0, i32 0)) - %var239 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.39, i32 0, i32 0)) - call void @js_append_child(i32 %var238, i32 %var239) - call void @js_append_child(i32 %var237, i32 %var238) - call void @js_append_child(i32 %var237, i32 %var238) - %var240 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var241 = call i32 @js_create_text(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.40, i32 0, i32 0)) - call void @js_append_child(i32 %var240, i32 %var241) - call void @js_append_child(i32 %var237, i32 %var240) - call void @js_append_child(i32 %var237, i32 %var240) - %var242 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var243 = call i32 @js_create_text(i8* getelementptr inbounds ([37 x i8], [37 x i8]* @.str.41, i32 0, i32 0)) - call void @js_append_child(i32 %var242, i32 %var243) - call void @js_append_child(i32 %var237, i32 %var242) - call void @js_append_child(i32 %var237, i32 %var242) - %var244 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.42, i32 0, i32 0)) - %var245 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.28, i32 0, i32 0)) - %var246 = call i32 @js_create_text(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.43, i32 0, i32 0)) - call void @js_append_child(i32 %var245, i32 %var246) - call void @js_append_child(i32 %var244, i32 %var245) - call void @js_append_child(i32 %var244, i32 %var245) - %var247 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.28, i32 0, i32 0)) - %var248 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.44, i32 0, i32 0)) - call void @js_append_child(i32 %var247, i32 %var248) - call void @js_append_child(i32 %var244, i32 %var247) - call void @js_append_child(i32 %var244, i32 %var247) - %var249 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.28, i32 0, i32 0)) - %var250 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.45, i32 0, i32 0)) - call void @js_append_child(i32 %var249, i32 %var250) - call void @js_append_child(i32 %var244, i32 %var249) - call void @js_append_child(i32 %var244, i32 %var249) - call void @js_append_child(i32 %var237, i32 %var244) - call void @js_append_child(i32 %var237, i32 %var244) - ret i32 %var237 + %var277 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var278 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var278, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.43, i32 0, i32 0)) + %var279 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.44, i32 0, i32 0)) + %var280 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.45, i32 0, i32 0)) + call void @js_append_child(i32 %var279, i32 %var280) + call void @js_append_child(i32 %var278, i32 %var279) + call void @js_append_child(i32 %var278, i32 %var279) + %var281 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var282 = call i32 @js_create_text(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.46, i32 0, i32 0)) + call void @js_append_child(i32 %var281, i32 %var282) + call void @js_append_child(i32 %var278, i32 %var281) + call void @js_append_child(i32 %var278, i32 %var281) + %var283 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var284 = call i32 @js_create_text(i8* getelementptr inbounds ([37 x i8], [37 x i8]* @.str.47, i32 0, i32 0)) + call void @js_append_child(i32 %var283, i32 %var284) + call void @js_append_child(i32 %var278, i32 %var283) + call void @js_append_child(i32 %var278, i32 %var283) + %var285 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.48, i32 0, i32 0)) + %var286 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.31, i32 0, i32 0)) + %var287 = call i32 @js_create_text(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.49, i32 0, i32 0)) + call void @js_append_child(i32 %var286, i32 %var287) + call void @js_append_child(i32 %var285, i32 %var286) + call void @js_append_child(i32 %var285, i32 %var286) + %var288 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.31, i32 0, i32 0)) + %var289 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.50, i32 0, i32 0)) + call void @js_append_child(i32 %var288, i32 %var289) + call void @js_append_child(i32 %var285, i32 %var288) + call void @js_append_child(i32 %var285, i32 %var288) + %var290 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.31, i32 0, i32 0)) + %var291 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.51, i32 0, i32 0)) + call void @js_append_child(i32 %var290, i32 %var291) + call void @js_append_child(i32 %var285, i32 %var290) + call void @js_append_child(i32 %var285, i32 %var290) + call void @js_append_child(i32 %var278, i32 %var285) + call void @js_append_child(i32 %var278, i32 %var285) + call void @js_append_child(i32 %var277, i32 %var278) + ret i32 %var277 } define i32 @_render_cond_7_case_1() { entry: - %var251 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var251, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.46, i32 0, i32 0)) - %var252 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.38, i32 0, i32 0)) - %var253 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.47, i32 0, i32 0)) - call void @js_append_child(i32 %var252, i32 %var253) - call void @js_append_child(i32 %var251, i32 %var252) - call void @js_append_child(i32 %var251, i32 %var252) - %var254 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var255 = call i32 @js_create_text(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.48, i32 0, i32 0)) - call void @js_append_child(i32 %var254, i32 %var255) - call void @js_append_child(i32 %var251, i32 %var254) - call void @js_append_child(i32 %var251, i32 %var254) - %var256 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var256, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.49, i32 0, i32 0)) - %var257 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var258 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.50, i32 0, i32 0)) - call void @js_append_child(i32 %var257, i32 %var258) - call void @js_append_child(i32 %var256, i32 %var257) - call void @js_append_child(i32 %var256, i32 %var257) - %var259 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var260 = call i32 @js_create_text(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.51, i32 0, i32 0)) - call void @js_append_child(i32 %var259, i32 %var260) - call void @js_append_child(i32 %var256, i32 %var259) - call void @js_append_child(i32 %var256, i32 %var259) - %var261 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var262 = call i32 @js_create_text(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.52, i32 0, i32 0)) - call void @js_append_child(i32 %var261, i32 %var262) - call void @js_append_child(i32 %var256, i32 %var261) - call void @js_append_child(i32 %var256, i32 %var261) - call void @js_append_child(i32 %var251, i32 %var256) - call void @js_append_child(i32 %var251, i32 %var256) - ret i32 %var251 + %var292 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var293 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var293, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.52, i32 0, i32 0)) + %var294 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.44, i32 0, i32 0)) + %var295 = call i32 @js_create_text(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.53, i32 0, i32 0)) + call void @js_append_child(i32 %var294, i32 %var295) + call void @js_append_child(i32 %var293, i32 %var294) + call void @js_append_child(i32 %var293, i32 %var294) + %var296 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var297 = call i32 @js_create_text(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.54, i32 0, i32 0)) + call void @js_append_child(i32 %var296, i32 %var297) + call void @js_append_child(i32 %var293, i32 %var296) + call void @js_append_child(i32 %var293, i32 %var296) + %var298 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var298, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.55, i32 0, i32 0)) + %var299 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var300 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.56, i32 0, i32 0)) + call void @js_append_child(i32 %var299, i32 %var300) + call void @js_append_child(i32 %var298, i32 %var299) + call void @js_append_child(i32 %var298, i32 %var299) + %var301 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var302 = call i32 @js_create_text(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.57, i32 0, i32 0)) + call void @js_append_child(i32 %var301, i32 %var302) + call void @js_append_child(i32 %var298, i32 %var301) + call void @js_append_child(i32 %var298, i32 %var301) + %var303 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var304 = call i32 @js_create_text(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.58, i32 0, i32 0)) + call void @js_append_child(i32 %var303, i32 %var304) + call void @js_append_child(i32 %var298, i32 %var303) + call void @js_append_child(i32 %var298, i32 %var303) + call void @js_append_child(i32 %var293, i32 %var298) + call void @js_append_child(i32 %var293, i32 %var298) + call void @js_append_child(i32 %var292, i32 %var293) + ret i32 %var292 } define i32 @_render_cond_7_case_2() { entry: - %var263 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var263, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.53, i32 0, i32 0)) - %var264 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.38, i32 0, i32 0)) - %var265 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.36, i32 0, i32 0)) - call void @js_append_child(i32 %var264, i32 %var265) - call void @js_append_child(i32 %var263, i32 %var264) - call void @js_append_child(i32 %var263, i32 %var264) - %var266 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var267 = call i32 @js_create_text(i8* getelementptr inbounds ([55 x i8], [55 x i8]* @.str.54, i32 0, i32 0)) - call void @js_append_child(i32 %var266, i32 %var267) - call void @js_append_child(i32 %var263, i32 %var266) - call void @js_append_child(i32 %var263, i32 %var266) + %var305 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var306 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var306, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.59, i32 0, i32 0)) + %var307 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.44, i32 0, i32 0)) + %var308 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.41, i32 0, i32 0)) + call void @js_append_child(i32 %var307, i32 %var308) + call void @js_append_child(i32 %var306, i32 %var307) + call void @js_append_child(i32 %var306, i32 %var307) + %var309 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var310 = call i32 @js_create_text(i8* getelementptr inbounds ([55 x i8], [55 x i8]* @.str.60, i32 0, i32 0)) + call void @js_append_child(i32 %var309, i32 %var310) + call void @js_append_child(i32 %var306, i32 %var309) + call void @js_append_child(i32 %var306, i32 %var309) call void @render_VerticalTabs() - ret i32 %var263 + call void @js_append_child(i32 %var305, i32 %var306) + ret i32 %var305 } define i32 @_render_cond_7_case_3() { entry: - %var268 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var268, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.55, i32 0, i32 0)) - %var269 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - %var270 = call i32 @js_create_text(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.56, i32 0, i32 0)) - call void @js_append_child(i32 %var269, i32 %var270) - call void @js_append_child(i32 %var268, i32 %var269) - call void @js_append_child(i32 %var268, i32 %var269) - ret i32 %var268 + %var311 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + %var312 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var312, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.61, i32 0, i32 0)) + %var313 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + %var314 = call i32 @js_create_text(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.62, i32 0, i32 0)) + call void @js_append_child(i32 %var313, i32 %var314) + call void @js_append_child(i32 %var312, i32 %var313) + call void @js_append_child(i32 %var312, i32 %var313) + call void @js_append_child(i32 %var311, i32 %var312) + ret i32 %var311 } ; Component render function define void @render_Tabs(i32 %orientation) { entry: - %var271 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var271, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.57, i32 0, i32 0)) - %var272 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.58, i32 0, i32 0)) - %var273 = call i32 @js_create_text(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.59, i32 0, i32 0)) - call void @js_append_child(i32 %var272, i32 %var273) - call void @js_append_child(i32 %var271, i32 %var272) - call void @js_append_child(i32 %var271, i32 %var272) - %var274 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) - call void @js_set_attribute(i32 %var274, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.60, i32 0, i32 0)) - %var275 = call i32 @js_create_text(i8* getelementptr inbounds ([58 x i8], [58 x i8]* @.str.61, i32 0, i32 0)) - call void @js_append_child(i32 %var274, i32 %var275) - call void @js_append_child(i32 %var271, i32 %var274) - call void @js_append_child(i32 %var271, i32 %var274) - %var276 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.42, i32 0, i32 0)) - call void @js_set_attribute(i32 %var276, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.62, i32 0, i32 0)) - %var277 = call i32 @js_create_marker() - call void @js_append_child(i32 %var276, i32 %var277) - store i32 %var277, i32* @cond_4_marker + %var315 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var315, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.63, i32 0, i32 0)) + %var316 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.64, i32 0, i32 0)) + %var317 = call i32 @js_create_text(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.65, i32 0, i32 0)) + call void @js_append_child(i32 %var316, i32 %var317) + call void @js_append_child(i32 %var315, i32 %var316) + call void @js_append_child(i32 %var315, i32 %var316) + %var318 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) + call void @js_set_attribute(i32 %var318, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.66, i32 0, i32 0)) + %var319 = call i32 @js_create_text(i8* getelementptr inbounds ([58 x i8], [58 x i8]* @.str.67, i32 0, i32 0)) + call void @js_append_child(i32 %var318, i32 %var319) + call void @js_append_child(i32 %var315, i32 %var318) + call void @js_append_child(i32 %var315, i32 %var318) + %var320 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.48, i32 0, i32 0)) + call void @js_set_attribute(i32 %var320, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.68, i32 0, i32 0)) + %var321 = call i32 @js_create_marker() + call void @js_append_child(i32 %var320, i32 %var321) + store i32 %var321, i32* @cond_4_marker call void @_init_conditional_4() - %var278 = call i32 @js_create_marker() - call void @js_append_child(i32 %var276, i32 %var278) - store i32 %var278, i32* @cond_5_marker + %var322 = call i32 @js_create_marker() + call void @js_append_child(i32 %var320, i32 %var322) + store i32 %var322, i32* @cond_5_marker call void @_init_conditional_5() - %var279 = call i32 @js_create_marker() - call void @js_append_child(i32 %var276, i32 %var279) - store i32 %var279, i32* @cond_6_marker + %var323 = call i32 @js_create_marker() + call void @js_append_child(i32 %var320, i32 %var323) + store i32 %var323, i32* @cond_6_marker call void @_init_conditional_6() - call void @js_append_child(i32 %var271, i32 %var276) - call void @js_append_child(i32 %var271, i32 %var276) - %var280 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var280, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.63, i32 0, i32 0)) - %var281 = call i32 @js_create_marker() - call void @js_append_child(i32 %var280, i32 %var281) - store i32 %var281, i32* @cond_7_marker + call void @js_append_child(i32 %var315, i32 %var320) + call void @js_append_child(i32 %var315, i32 %var320) + %var324 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var324, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.69, i32 0, i32 0)) + %var325 = call i32 @js_create_marker() + call void @js_append_child(i32 %var324, i32 %var325) + store i32 %var325, i32* @cond_7_marker call void @_init_conditional_7() - call void @js_append_child(i32 %var271, i32 %var280) - call void @js_append_child(i32 %var271, i32 %var280) - %var282 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.11, i32 0, i32 0)) - call void @js_set_attribute(i32 %var282, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.64, i32 0, i32 0)) - %var283 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.15, i32 0, i32 0)) + call void @js_append_child(i32 %var315, i32 %var324) + call void @js_append_child(i32 %var315, i32 %var324) + %var326 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0)) + call void @js_set_attribute(i32 %var326, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.70, i32 0, i32 0)) + %var327 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) ; TODO: Format f-string with signal tab_index - %var284 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.65, i32 0, i32 0)) - call void @js_append_child(i32 %var283, i32 %var284) - call void @js_append_child(i32 %var282, i32 %var283) - call void @js_append_child(i32 %var282, i32 %var283) - call void @js_append_child(i32 %var271, i32 %var282) - call void @js_append_child(i32 %var271, i32 %var282) - call void @js_set_root(i32 %var271) + %var328 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.71, i32 0, i32 0)) + call void @js_append_child(i32 %var327, i32 %var328) + call void @js_append_child(i32 %var326, i32 %var327) + call void @js_append_child(i32 %var326, i32 %var327) + call void @js_append_child(i32 %var315, i32 %var326) + call void @js_append_child(i32 %var315, i32 %var326) + call void @js_set_root(i32 %var315) ret void } diff --git a/examples/tabs/Tabs.wasm b/examples/tabs/Tabs.wasm index 897da2a..ff68690 100755 Binary files a/examples/tabs/Tabs.wasm and b/examples/tabs/Tabs.wasm differ diff --git a/examples/tabs/TabsTernary.py b/examples/tabs/TabsTernary.py new file mode 100644 index 0000000..7a82022 --- /dev/null +++ b/examples/tabs/TabsTernary.py @@ -0,0 +1,126 @@ +""" +Clean Tabs implementation using ternary expressions to eliminate repetition. + +Before: 6 lines per tab button (if/else blocks) +After: 1 line per tab button (ternary expressions) +""" + +from ritz.syntax import * + + +@component +def VerticalTabs(): + """Vertical tabs for settings categories.""" + setting_tab = signal(0) + + def set_setting(value): + setting_tab = value + + with Div(class_="vertical-tabs"): + # Vertical tab menu - now just 3 lines instead of 18! + with Div(class_="vertical-tab-menu"): + with Button(class_='vertical-tab active' if setting_tab == 0 else 'vertical-tab', onclick=lambda: set_setting(0)): + yield "⚙️ General" + + with Button(class_='vertical-tab active' if setting_tab == 1 else 'vertical-tab', onclick=lambda: set_setting(1)): + yield "🔒 Privacy" + + with Button(class_='vertical-tab active' if setting_tab == 2 else 'vertical-tab', onclick=lambda: set_setting(2)): + yield "🚀 Advanced" + + # Tab content (same as before) + with Div(class_="vertical-tab-content"): + match setting_tab: + case 0: + with Div(class_="setting-pane"): + with H3(): + yield "⚙️ General Settings" + with P(): + yield "Language: English" + with P(): + yield "Time Zone: UTC" + + case 1: + with Div(class_="setting-pane"): + with H3(): + yield "🔒 Privacy Settings" + with P(): + yield "Data Collection: Disabled" + with P(): + yield "Analytics: Opt-out" + + case 2: + with Div(class_="setting-pane"): + with H3(): + yield "🚀 Advanced Settings" + with P(): + yield "Debug Mode: Off" + with P(): + yield "Experimental Features: Disabled" + + case _: + with Div(class_="setting-pane"): + with P(): + yield "Invalid setting" + + +@component +def Tabs(): + """Main tabs container with ternary expressions for clean tab buttons.""" + tab_index = signal(0) + + def set_tab(value): + tab_index = value + + with Div(class_="tabs-container"): + with H1(): + yield "Tab Component Demo" + + with P(class_="subtitle"): + yield "Beautiful composition with ternary expressions" + + # Tab menu - clean one-line buttons! + with Ul(class_="tab-menu"): + with Li(class_='tab active' if tab_index == 0 else 'tab'): + with Button(onclick=lambda: set_tab(0)): + yield "🏠 Home" + + with Li(class_='tab active' if tab_index == 1 else 'tab'): + with Button(onclick=lambda: set_tab(1)): + yield "👤 Profile" + + with Li(class_='tab active' if tab_index == 2 else 'tab'): + with Button(onclick=lambda: set_tab(2)): + yield "⚙️ Settings" + + # Tab panes + with Div(class_="tab-content"): + match tab_index: + case 0: + with Div(class_="tab-pane home"): + with H2(): + yield "🏠 Welcome Home" + with P(): + yield "This is your home dashboard." + + case 1: + with Div(class_="tab-pane profile"): + with H2(): + yield "👤 Your Profile" + with P(): + yield "Manage your account settings." + + case 2: + with Div(class_="tab-pane settings"): + with H2(): + yield "⚙️ Settings" + with P(): + yield "Configure your preferences using the categories below:" + + # Nested vertical tabs! + yield VerticalTabs() + + case _: + with Div(class_="tab-pane error"): + with P(): + yield "⚠️ Invalid tab selected" diff --git a/ritz/llvm_codegen_signals.py b/ritz/llvm_codegen_signals.py index 5c2e443..5d346f9 100644 --- a/ritz/llvm_codegen_signals.py +++ b/ritz/llvm_codegen_signals.py @@ -45,6 +45,9 @@ class SignalLLVMIRGenerator: # Track parent element for appending children in if/match branches self.parent_element_stack: list[str] = [] + + # Track current function parameters for parameter reference handling + self.current_function_params: set[str] = set() # Track if we're inside a conditional branch self.in_conditional_branch = False @@ -266,8 +269,21 @@ class SignalLLVMIRGenerator: """Emit event handler functions (exported for JS to call).""" for handler in self.event_handlers: func_name = handler["name"] - self.lines.append(f"; Event handler: {func_name}") - self.lines.append(f"define void @{func_name}() {{") + + # Build parameter list (all params are i32 for now) + args = handler.get("args", []) + + # Track current function parameters for _emit_expr + self.current_function_params = set(args) + + if args: + param_list = ", ".join([f"i32 %{arg}" for arg in args]) + self.lines.append(f"; Event handler: {func_name}") + self.lines.append(f"define void @{func_name}({param_list}) {{") + else: + self.lines.append(f"; Event handler: {func_name}") + self.lines.append(f"define void @{func_name}() {{") + self.lines.append("entry:") # Emit handler body @@ -278,18 +294,32 @@ class SignalLLVMIRGenerator: self.lines.append("}") self.lines.append("") + # Clear function params + self.current_function_params = set() + def _emit_handler_statement(self, stmt: dict[str, Any]) -> None: """Emit a statement inside an event handler.""" if stmt["type"] == "expr": # Expression statement (e.g., from lambda body calling a function) expr = stmt["value"] if expr["type"] == "call": - # Function call - emit it + # Function call - emit it with arguments func_name = expr["func"] # Check if it's an event handler function if any(h["name"] == func_name for h in self.event_handlers): - # Call the handler function (functions are emitted without component suffix) - self.lines.append(f" call void @{func_name}()") + # Emit arguments if any + args = expr.get("args", []) + arg_values = [] + for arg in args: + arg_var = self._emit_expr(arg) + arg_values.append(f"i32 {arg_var}") + + # Call the handler function with arguments + if arg_values: + arg_list = ", ".join(arg_values) + self.lines.append(f" call void @{func_name}({arg_list})") + else: + self.lines.append(f" call void @{func_name}()") else: # Unknown function - skip or error pass @@ -360,7 +390,7 @@ class SignalLLVMIRGenerator: # Evaluate condition and insert the active branch at marker test_var = self._emit_expr(cond_info["test"]) cond_var = self._new_var() - self.lines.append(f" %{cond_var} = icmp ne i32 %{test_var}, 0") + self.lines.append(f" %{cond_var} = icmp ne i32 {test_var}, 0") # Load marker marker_var = self._new_var() @@ -390,7 +420,7 @@ class SignalLLVMIRGenerator: # Re-evaluate condition test_var2 = self._emit_expr(cond_info["test"]) cond_var2 = self._new_var() - self.lines.append(f" %{cond_var2} = icmp ne i32 %{test_var2}, 0") + self.lines.append(f" %{cond_var2} = icmp ne i32 {test_var2}, 0") # Convert to i32 cond_i32 = self._new_var() @@ -478,9 +508,9 @@ class SignalLLVMIRGenerator: # Build switch instruction insert_labels = [f"insert_case_{i}" for i in range(num_cases)] if default_idx is not None: - self.lines.append(f" switch i32 %{subject_var}, label %{insert_labels[default_idx]} [") + self.lines.append(f" switch i32 {subject_var}, label %{insert_labels[default_idx]} [") else: - self.lines.append(f" switch i32 %{subject_var}, label %insert_case_0 [") + self.lines.append(f" switch i32 {subject_var}, label %insert_case_0 [") for i, case in enumerate(cases): pattern = case["pattern"] @@ -514,9 +544,9 @@ class SignalLLVMIRGenerator: # Build switch to determine which case should be active case_labels = [f"case_{i}" for i in range(num_cases)] if default_idx is not None: - self.lines.append(f" switch i32 %{subject_var2}, label %{case_labels[default_idx]} [") + self.lines.append(f" switch i32 {subject_var2}, label %{case_labels[default_idx]} [") else: - self.lines.append(f" switch i32 %{subject_var2}, label %{case_labels[0]} [") + self.lines.append(f" switch i32 {subject_var2}, label %{case_labels[0]} [") for i, case in enumerate(cases): pattern = case["pattern"] @@ -697,7 +727,7 @@ class SignalLLVMIRGenerator: # Convert to i1 (boolean) cond_var = self._new_var() - self.lines.append(f" %{cond_var} = icmp ne i32 %{test_var}, 0") + self.lines.append(f" %{cond_var} = icmp ne i32 {test_var}, 0") # Branch based on whether there's an else has_else = stmt.get("orelse") and len(stmt["orelse"]) > 0 @@ -733,12 +763,9 @@ class SignalLLVMIRGenerator: arg_values = [] for arg in args: - # For constants, emit directly; for expressions, emit as variable - if arg["type"] == "constant": - arg_values.append(f"i32 {arg['value']}") - else: - arg_var = self._emit_expr(arg) - arg_values.append(f"i32 %{arg_var}") + # Emit argument expression + arg_var = self._emit_expr(arg) + arg_values.append(f"i32 {arg_var}") # Build argument list and call if arg_values: @@ -803,9 +830,9 @@ class SignalLLVMIRGenerator: # Emit switch if default_case_idx is not None: - self.lines.append(f" switch i32 %{subject_var}, label %{case_labels[default_case_idx]} [") + self.lines.append(f" switch i32 {subject_var}, label %{case_labels[default_case_idx]} [") else: - self.lines.append(f" switch i32 %{subject_var}, label %{default_label} [") + self.lines.append(f" switch i32 {subject_var}, label %{default_label} [") for case_spec in switch_cases: self.lines.append(f" {case_spec}") @@ -828,20 +855,52 @@ class SignalLLVMIRGenerator: return None + def _emit_string_ifexp(self, expr: dict[str, Any]) -> str: + """Emit a ternary expression that returns a string pointer (i8*).""" + # Evaluate the condition + test_val = self._emit_expr(expr["test"]) + + # Convert to i1 if it's i32 + cond_var = self._new_var() + self.lines.append(f" %{cond_var} = icmp ne i32 {test_val}, 0") + + # Get string constants for both branches + true_str = str(expr["body"]["value"]) + false_str = str(expr["orelse"]["value"]) + + true_str_global = self._get_or_create_string(true_str) + false_str_global = self._get_or_create_string(false_str) + + # Use select with inline getelementptr + result_var = self._new_var() + self.lines.append( + f" %{result_var} = select i1 %{cond_var}, " + f"i8* getelementptr inbounds ({self._string_type(true_str)}, {self._string_type(true_str)}* {true_str_global}, i32 0, i32 0), " + f"i8* getelementptr inbounds ({self._string_type(false_str)}, {self._string_type(false_str)}* {false_str_global}, i32 0, i32 0)" + ) + + return result_var + def _emit_expr(self, expr: dict[str, Any]) -> str: - """Emit an expression and return the result variable name.""" + """Emit an expression and return the complete LLVM IR value (with % prefix for vars).""" if expr["type"] == "name": - # Load signal value - signal_name = expr["id"] - if signal_name in self.signals: + var_name = expr["id"] + + # Check if it's a function parameter + if var_name in self.current_function_params: + # Return parameter with % prefix + return f"%{var_name}" + + # Check if it's a signal + if var_name in self.signals: load_var = self._new_var() - self.lines.append(f" %{load_var} = load i32, i32* {self._signal_global(signal_name)}") - return load_var - else: - # Unknown variable - return "0" + self.lines.append(f" %{load_var} = load i32, i32* {self._signal_global(var_name)}") + return f"%{load_var}" + + # Unknown variable - return constant 0 + return "0" elif expr["type"] == "constant": - # Return constant inline + # Return constant inline (no % prefix) return str(expr["value"]) elif expr["type"] == "compare": # Handle comparison (e.g., count > 5) @@ -860,12 +919,29 @@ class SignalLLVMIRGenerator: icmp_op = op_map.get(expr["op"], "eq") result_var = self._new_var() - self.lines.append(f" %{result_var} = icmp {icmp_op} i32 %{left_var}, {right_var}") + self.lines.append(f" %{result_var} = icmp {icmp_op} i32 {left_var}, {right_var}") # Convert i1 to i32 for compatibility result_i32 = self._new_var() self.lines.append(f" %{result_i32} = zext i1 %{result_var} to i32") - return result_i32 + return f"%{result_i32}" + elif expr["type"] == "ifexp": + # Handle ternary expressions (e.g., 'active' if flag else 'inactive') + # Evaluate the condition + test_val = self._emit_expr(expr["test"]) + + # Convert to i1 if it's i32 + cond_var = self._new_var() + self.lines.append(f" %{cond_var} = icmp ne i32 {test_val}, 0") + + # Evaluate both branches + true_val = self._emit_expr(expr["body"]) + false_val = self._emit_expr(expr["orelse"]) + + # Use select instruction to choose between them + result_var = self._new_var() + self.lines.append(f" %{result_var} = select i1 %{cond_var}, i32 {true_val}, i32 {false_val}") + return f"%{result_var}" else: # Unknown expression type return "0" @@ -902,6 +978,15 @@ class SignalLLVMIRGenerator: f"i8* getelementptr inbounds ({self._string_type(attr_name)}, {self._string_type(attr_name)}* {name_str}, i32 0, i32 0), " f"i8* getelementptr inbounds ({self._string_type(value)}, {self._string_type(value)}* {value_str}, i32 0, i32 0))" ) + elif prop_value["type"] == "ifexp": + # Handle ternary expression for attribute value + value_ptr = self._emit_string_ifexp(prop_value) + name_str = self._get_or_create_string(attr_name) + self.lines.append( + f" call void @js_set_attribute(i32 %{elem_var}, " + f"i8* getelementptr inbounds ({self._string_type(attr_name)}, {self._string_type(attr_name)}* {name_str}, i32 0, i32 0), " + f"i8* %{value_ptr})" + ) # Bind onclick if present if onclick_handler: diff --git a/ritz/parser.py b/ritz/parser.py index b282a05..df6590c 100644 --- a/ritz/parser.py +++ b/ritz/parser.py @@ -348,6 +348,14 @@ def _transform_expr(expr: ast.expr | None) -> dict[str, Any]: "op": type(expr.ops[0]).__name__, # Gt, Lt, Eq, etc. "comparators": [_transform_expr(comp) for comp in expr.comparators], } + elif isinstance(expr, ast.IfExp): + # Handle ternary expressions (e.g., 'active' if flag else 'inactive') + return { + "type": "ifexp", + "test": _transform_expr(expr.test), + "body": _transform_expr(expr.body), + "orelse": _transform_expr(expr.orelse), + } else: return {"type": "unknown", "ast_type": type(expr).__name__} diff --git a/tests/test_ternary_expressions.py b/tests/test_ternary_expressions.py new file mode 100644 index 0000000..d7f9028 --- /dev/null +++ b/tests/test_ternary_expressions.py @@ -0,0 +1,78 @@ +"""Tests for ternary expression support in props.""" + +import pytest +from ritz.parser import parse_component +from ritz.llvm_codegen_signals import generate_llvm_ir + + +def test_parse_ternary_in_prop(): + """Test parsing ternary expression in element prop.""" + source = """ +from ritz.syntax import * + +@component +def Toggle(): + active = signal(1) + + with Button(class_='btn active' if active else 'btn'): + yield "Click" +""" + ir = parse_component(source) + + # Find the with statement + with_stmt = [s for s in ir["body"] if s["type"] == "with"][0] + + # Check that class_ prop contains a ternary (ifexp) + class_prop = with_stmt["element"]["props"]["class_"] + assert class_prop["type"] == "ifexp" + assert class_prop["test"]["id"] == "active" + assert class_prop["body"]["value"] == "btn active" + assert class_prop["orelse"]["value"] == "btn" + + +def test_codegen_ternary_in_prop(): + """Test LLVM codegen for ternary expression in prop.""" + source = """ +from ritz.syntax import * + +@component +def Toggle(): + active = signal(1) + + with Button(class_='btn active' if active else 'btn'): + yield "Click" +""" + ir = parse_component(source) + llvm_ir = generate_llvm_ir(ir) + + # Should generate code to evaluate the condition + assert "icmp" in llvm_ir # Comparison for active signal + + # Should select between the two string values + # This will likely use select instruction or branching + assert "btn active" in llvm_ir + assert "btn" in llvm_ir + + +def test_ternary_with_comparison(): + """Test ternary with comparison expression.""" + source = """ +from ritz.syntax import * + +@component +def Counter(): + count = signal(0) + + with Div(class_='high' if count > 5 else 'low'): + yield "Value" +""" + ir = parse_component(source) + + # Find the with statement + with_stmt = [s for s in ir["body"] if s["type"] == "with"][0] + + # Check ternary structure + class_prop = with_stmt["element"]["props"]["class_"] + assert class_prop["type"] == "ifexp" + assert class_prop["test"]["type"] == "compare" + assert class_prop["test"]["op"] == "Gt" diff --git a/tests/test_wrapper_components.py b/tests/test_wrapper_components.py new file mode 100644 index 0000000..220a355 --- /dev/null +++ b/tests/test_wrapper_components.py @@ -0,0 +1,82 @@ +"""Tests for wrapper component pattern to reduce repetition.""" + +import pytest +from ritz.parser import parse_component +from ritz.llvm_codegen_signals import generate_llvm_ir + + +def test_tab_button_wrapper_component(): + """Test wrapper component pattern for reducing tab button repetition.""" + source = """ +from ritz.syntax import * + +@component +def TabButton(label, index, active, onclick): + \"\"\"Wrapper component for tab buttons with active state.\"\"\" + if active: + with Button(class_="tab active", onclick=onclick): + yield label + else: + with Button(class_="tab", onclick=onclick): + yield label + +@component +def SimpleTabs(): + tab_index = signal(0) + + def set_tab(value): + tab_index = value + + with Div(class_="tab-menu"): + yield TabButton("Home", 0, tab_index == 0, lambda: set_tab(0)) + yield TabButton("Profile", 1, tab_index == 1, lambda: set_tab(1)) + yield TabButton("Settings", 2, tab_index == 2, lambda: set_tab(2)) +""" + ir = parse_component(source) + + # Should parse both components + assert isinstance(ir, list) + assert len(ir) == 2 + assert ir[0]["name"] == "TabButton" + assert ir[1]["name"] == "SimpleTabs" + + # TabButton should have parameters + assert len(ir[0]["params"]) == 4 + assert ir[0]["params"][0]["name"] == "label" + assert ir[0]["params"][1]["name"] == "index" + assert ir[0]["params"][2]["name"] == "active" + assert ir[0]["params"][3]["name"] == "onclick" + + +def test_tab_button_wrapper_codegen(): + """Test LLVM codegen for wrapper component pattern.""" + source = """ +from ritz.syntax import * + +@component +def TabButton(label, active, onclick): + if active: + with Button(class_="tab active", onclick=onclick): + yield label + else: + with Button(class_="tab", onclick=onclick): + yield label + +@component +def SimpleTabs(): + tab_index = signal(0) + + def set_tab(value): + tab_index = value + + with Div(): + yield TabButton("Home", tab_index == 0, lambda: set_tab(0)) +""" + ir = parse_component(source) + llvm_ir = generate_llvm_ir(ir) + + # Should generate render function for TabButton with parameters + assert "define void @render_TabButton(" in llvm_ir + + # Should call TabButton from SimpleTabs with arguments + assert "call void @render_TabButton(" in llvm_ir