Created
February 24, 2018 22:45
-
-
Save csabahruska/0122b73529f4c377173454e1743eeea4 to your computer and use it in GitHub Desktop.
LLVM jump table crash with x64 JIT
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; ModuleID = 'basic' | |
source_filename = "<string>" | |
declare i64 @_prim_int_print(i64) | |
define <{ i64*, i64 }> @grinMain(i64* %_heap_ptr_.0) { | |
grinMain.entry: | |
%nodeAddress.4 = bitcast i64* %_heap_ptr_.0 to <{ i64, [1 x i64] }>* | |
store <{ i64, [1 x i64] }> <{ i64 0, [1 x i64] [i64 1] }>, <{ i64, [1 x i64] }>* %nodeAddress.4, align 1 | |
%_heap_ptr_.5 = bitcast i64* %_heap_ptr_.0 to <{ i64, [2 x i64*], [1 x i64] }>* | |
%_heap_ptr_.6 = getelementptr inbounds <{ i64, [2 x i64*], [1 x i64] }>, <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.5, i32 1 | |
%_heap_ptr_.7 = bitcast <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.6 to i64* | |
%nodeAddress.11 = bitcast i64* %_heap_ptr_.7 to <{ i64, [1 x i64] }>* | |
store <{ i64, [1 x i64] }> <{ i64 0, [1 x i64] [i64 10000] }>, <{ i64, [1 x i64] }>* %nodeAddress.11, align 1 | |
%_heap_ptr_.12 = bitcast i64* %_heap_ptr_.7 to <{ i64, [2 x i64*], [1 x i64] }>* | |
%_heap_ptr_.13 = getelementptr inbounds <{ i64, [2 x i64*], [1 x i64] }>, <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.12, i32 1 | |
%_heap_ptr_.14 = bitcast <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.13 to i64* | |
%node.16 = insertvalue <{ i64, [2 x i64*] }> <{ i64 1, [2 x i64*] undef }>, i64* %_heap_ptr_.0, 1, 0 | |
%node.17 = insertvalue <{ i64, [2 x i64*] }> %node.16, i64* %_heap_ptr_.7, 1, 1 | |
%tag.18 = extractvalue <{ i64, [2 x i64*] }> %node.17, 0 | |
%nodeAddress.19 = bitcast i64* %_heap_ptr_.14 to <{ i64, [2 x i64*] }>* | |
store <{ i64, [2 x i64*] }> %node.17, <{ i64, [2 x i64*] }>* %nodeAddress.19, align 1 | |
%_heap_ptr_.20 = bitcast i64* %_heap_ptr_.14 to <{ i64, [2 x i64*], [1 x i64] }>* | |
%_heap_ptr_.21 = getelementptr inbounds <{ i64, [2 x i64*], [1 x i64] }>, <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.20, i32 1 | |
%_heap_ptr_.22 = bitcast <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.21 to i64* | |
%node.24 = insertvalue <{ i64, [1 x i64*] }> <{ i64 2, [1 x i64*] undef }>, i64* %_heap_ptr_.14, 1, 0 | |
%tag.25 = extractvalue <{ i64, [1 x i64*] }> %node.24, 0 | |
%nodeAddress.26 = bitcast i64* %_heap_ptr_.22 to <{ i64, [1 x i64*] }>* | |
store <{ i64, [1 x i64*] }> %node.24, <{ i64, [1 x i64*] }>* %nodeAddress.26, align 1 | |
%_heap_ptr_.27 = bitcast i64* %_heap_ptr_.22 to <{ i64, [2 x i64*], [1 x i64] }>* | |
%_heap_ptr_.28 = getelementptr inbounds <{ i64, [2 x i64*], [1 x i64] }>, <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.27, i32 1 | |
%_heap_ptr_.29 = bitcast <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.28 to i64* | |
%eval_result.30 = tail call <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> @eval(i64* %_heap_ptr_.29, i64* %_heap_ptr_.22) | |
%_heap_ptr_.31 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.30, 0 | |
%node.32 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.30, 1 | |
%"r'" = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %node.32, 2, 0 | |
%grinMain_result.33 = call i64 @_prim_int_print(i64 %"r'") | |
%grinMain_wrapped_result.34 = insertvalue <{ i64*, i64 }> undef, i64* %_heap_ptr_.31, 0 | |
%grinMain_wrapped_result.35 = insertvalue <{ i64*, i64 }> %grinMain_wrapped_result.34, i64 %grinMain_result.33, 1 | |
ret <{ i64*, i64 }> %grinMain_wrapped_result.35 | |
error_block: ; No predecessors! | |
%error_result.36 = tail call i64 @_prim_int_print(i64 666) | |
unreachable | |
} | |
define <{ i64*, <{ i64, [2 x i64*] }> }> @upto(i64* %_heap_ptr_.37, i64* %m, i64* %n) { | |
upto.entry: | |
%eval_result.38 = tail call <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> @eval(i64* %_heap_ptr_.37, i64* %m) | |
%_heap_ptr_.39 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.38, 0 | |
%node.40 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.38, 1 | |
%"m'" = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %node.40, 2, 0 | |
%eval_result.41 = tail call <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> @eval(i64* %_heap_ptr_.39, i64* %n) | |
%_heap_ptr_.42 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.41, 0 | |
%node.43 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.41, 1 | |
%"n'" = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %node.43, 2, 0 | |
%"b'.44" = icmp sgt i64 %"m'", %"n'" | |
switch i1 %"b'.44", label %error_block [ | |
i1 true, label %switch.bool_True.45 | |
i1 false, label %switch.bool_False.47 | |
] | |
switch.bool_True.45: ; preds = %upto.entry | |
br label %switch.exit.67 | |
switch.bool_False.47: ; preds = %upto.entry | |
%"m1'.48" = add i64 %"m'", 1 | |
%node.50 = insertvalue <{ i64, [1 x i64] }> <{ i64 0, [1 x i64] undef }>, i64 %"m1'.48", 1, 0 | |
%tag.51 = extractvalue <{ i64, [1 x i64] }> %node.50, 0 | |
%nodeAddress.52 = bitcast i64* %_heap_ptr_.42 to <{ i64, [1 x i64] }>* | |
store <{ i64, [1 x i64] }> %node.50, <{ i64, [1 x i64] }>* %nodeAddress.52, align 1 | |
%_heap_ptr_.53 = bitcast i64* %_heap_ptr_.42 to <{ i64, [2 x i64*], [1 x i64] }>* | |
%_heap_ptr_.54 = getelementptr inbounds <{ i64, [2 x i64*], [1 x i64] }>, <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.53, i32 1 | |
%_heap_ptr_.55 = bitcast <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.54 to i64* | |
%node.57 = insertvalue <{ i64, [2 x i64*] }> <{ i64 1, [2 x i64*] undef }>, i64* %_heap_ptr_.42, 1, 0 | |
%node.58 = insertvalue <{ i64, [2 x i64*] }> %node.57, i64* %n, 1, 1 | |
%tag.59 = extractvalue <{ i64, [2 x i64*] }> %node.58, 0 | |
%nodeAddress.60 = bitcast i64* %_heap_ptr_.55 to <{ i64, [2 x i64*] }>* | |
store <{ i64, [2 x i64*] }> %node.58, <{ i64, [2 x i64*] }>* %nodeAddress.60, align 1 | |
%_heap_ptr_.61 = bitcast i64* %_heap_ptr_.55 to <{ i64, [2 x i64*], [1 x i64] }>* | |
%_heap_ptr_.62 = getelementptr inbounds <{ i64, [2 x i64*], [1 x i64] }>, <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.61, i32 1 | |
%_heap_ptr_.63 = bitcast <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.62 to i64* | |
%node.65 = insertvalue <{ i64, [2 x i64*] }> <{ i64 4, [2 x i64*] undef }>, i64* %m, 1, 0 | |
%node.66 = insertvalue <{ i64, [2 x i64*] }> %node.65, i64* %_heap_ptr_.55, 1, 1 | |
%item.70 = extractvalue <{ i64, [2 x i64*] }> %node.66, 0 | |
%node.71 = insertvalue <{ i64, [2 x i64*] }> undef, i64 %item.70, 0 | |
%item.72 = extractvalue <{ i64, [2 x i64*] }> %node.66, 1, 1 | |
%node.73 = insertvalue <{ i64, [2 x i64*] }> %node.71, i64* %item.72, 1, 1 | |
%item.74 = extractvalue <{ i64, [2 x i64*] }> %node.66, 1, 0 | |
%node.75 = insertvalue <{ i64, [2 x i64*] }> %node.73, i64* %item.74, 1, 0 | |
br label %switch.exit.67 | |
switch.exit.67: ; preds = %switch.bool_False.47, %switch.bool_True.45 | |
%_heap_ptr_.76 = phi i64* [ %_heap_ptr_.42, %switch.bool_True.45 ], [ %_heap_ptr_.63, %switch.bool_False.47 ] | |
%upto_result.77 = phi <{ i64, [2 x i64*] }> [ <{ i64 3, [2 x i64*] undef }>, %switch.bool_True.45 ], [ %node.75, %switch.bool_False.47 ] | |
%upto_wrapped_result.78 = insertvalue <{ i64*, <{ i64, [2 x i64*] }> }> undef, i64* %_heap_ptr_.76, 0 | |
%upto_wrapped_result.79 = insertvalue <{ i64*, <{ i64, [2 x i64*] }> }> %upto_wrapped_result.78, <{ i64, [2 x i64*] }> %upto_result.77, 1 | |
ret <{ i64*, <{ i64, [2 x i64*] }> }> %upto_wrapped_result.79 | |
error_block: ; preds = %upto.entry | |
%error_result.80 = tail call i64 @_prim_int_print(i64 666) | |
unreachable | |
} | |
define <{ i64*, <{ i64, [1 x i64] }> }> @sum(i64* %_heap_ptr_.81, i64* %l) { | |
sum.entry: | |
%eval_result.82 = tail call <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> @eval(i64* %_heap_ptr_.81, i64* %l) | |
%_heap_ptr_.83 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.82, 0 | |
%l2.84 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.82, 1 | |
%tag.85 = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %l2.84, 0 | |
switch i64 %tag.85, label %error_block [ | |
i64 3, label %switch.CNil.86 | |
i64 4, label %switch.CCons.89 | |
] | |
switch.CNil.86: ; preds = %sum.entry | |
br label %switch.exit.99 | |
switch.CCons.89: ; preds = %sum.entry | |
%x = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %l2.84, 1, 0 | |
%xs = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %l2.84, 1, 1 | |
%eval_result.90 = tail call <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> @eval(i64* %_heap_ptr_.83, i64* %x) | |
%_heap_ptr_.91 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.90, 0 | |
%node.92 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.90, 1 | |
%"x'" = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %node.92, 2, 0 | |
%sum_result.93 = tail call <{ i64*, <{ i64, [1 x i64] }> }> @sum(i64* %_heap_ptr_.91, i64* %xs) | |
%_heap_ptr_.94 = extractvalue <{ i64*, <{ i64, [1 x i64] }> }> %sum_result.93, 0 | |
%node.95 = extractvalue <{ i64*, <{ i64, [1 x i64] }> }> %sum_result.93, 1 | |
%"s'" = extractvalue <{ i64, [1 x i64] }> %node.95, 1, 0 | |
%"ax'.96" = add i64 %"x'", %"s'" | |
%node.98 = insertvalue <{ i64, [1 x i64] }> <{ i64 0, [1 x i64] undef }>, i64 %"ax'.96", 1, 0 | |
br label %switch.exit.99 | |
switch.exit.99: ; preds = %switch.CCons.89, %switch.CNil.86 | |
%_heap_ptr_.100 = phi i64* [ %_heap_ptr_.83, %switch.CNil.86 ], [ %_heap_ptr_.94, %switch.CCons.89 ] | |
%sum_result.101 = phi <{ i64, [1 x i64] }> [ zeroinitializer, %switch.CNil.86 ], [ %node.98, %switch.CCons.89 ] | |
%sum_wrapped_result.102 = insertvalue <{ i64*, <{ i64, [1 x i64] }> }> undef, i64* %_heap_ptr_.100, 0 | |
%sum_wrapped_result.103 = insertvalue <{ i64*, <{ i64, [1 x i64] }> }> %sum_wrapped_result.102, <{ i64, [1 x i64] }> %sum_result.101, 1 | |
ret <{ i64*, <{ i64, [1 x i64] }> }> %sum_wrapped_result.103 | |
error_block: ; preds = %sum.entry | |
%error_result.104 = tail call i64 @_prim_int_print(i64 666) | |
unreachable | |
} | |
define <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> @eval(i64* %_heap_ptr_.105, i64* %q) { | |
eval.entry: | |
%tag.106 = load i64, i64* %q, align 1 | |
switch i64 %tag.106, label %error_block [ | |
i64 4, label %tag.switch.CCons.107 | |
i64 0, label %tag.switch.CInt.116 | |
i64 3, label %tag.switch.CNil.123 | |
i64 2, label %tag.switch.Fsum.128 | |
i64 1, label %tag.switch.Fupto.135 | |
] | |
tag.switch.CCons.107: ; preds = %eval.entry | |
%nodeAddress.108 = bitcast i64* %q to <{ i64, [2 x i64*] }>* | |
%node.109 = load <{ i64, [2 x i64*] }>, <{ i64, [2 x i64*] }>* %nodeAddress.108, align 1 | |
%item.110 = extractvalue <{ i64, [2 x i64*] }> %node.109, 0 | |
%node.111 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.110, 0 | |
%item.112 = extractvalue <{ i64, [2 x i64*] }> %node.109, 1, 1 | |
%node.113 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.111, i64* %item.112, 1, 1 | |
%item.114 = extractvalue <{ i64, [2 x i64*] }> %node.109, 1, 0 | |
%node.115 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.113, i64* %item.114, 1, 0 | |
br label %tag.switch.exit.144 | |
tag.switch.CInt.116: ; preds = %eval.entry | |
%nodeAddress.117 = bitcast i64* %q to <{ i64, [1 x i64] }>* | |
%node.118 = load <{ i64, [1 x i64] }>, <{ i64, [1 x i64] }>* %nodeAddress.117, align 1 | |
%item.119 = extractvalue <{ i64, [1 x i64] }> %node.118, 0 | |
%node.120 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.119, 0 | |
%item.121 = extractvalue <{ i64, [1 x i64] }> %node.118, 1, 0 | |
%node.122 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.120, i64 %item.121, 2, 0 | |
br label %tag.switch.exit.144 | |
tag.switch.CNil.123: ; preds = %eval.entry | |
%nodeAddress.124 = bitcast i64* %q to <{ i64 }>* | |
%node.125 = load <{ i64 }>, <{ i64 }>* %nodeAddress.124, align 1 | |
%item.126 = extractvalue <{ i64 }> %node.125, 0 | |
%node.127 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.126, 0 | |
br label %tag.switch.exit.144 | |
tag.switch.Fsum.128: ; preds = %eval.entry | |
%nodeAddress.129 = bitcast i64* %q to <{ i64, [1 x i64*] }>* | |
%node.130 = load <{ i64, [1 x i64*] }>, <{ i64, [1 x i64*] }>* %nodeAddress.129, align 1 | |
%item.131 = extractvalue <{ i64, [1 x i64*] }> %node.130, 0 | |
%node.132 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.131, 0 | |
%item.133 = extractvalue <{ i64, [1 x i64*] }> %node.130, 1, 0 | |
%node.134 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.132, i64* %item.133, 1, 0 | |
br label %tag.switch.exit.144 | |
tag.switch.Fupto.135: ; preds = %eval.entry | |
%nodeAddress.136 = bitcast i64* %q to <{ i64, [2 x i64*] }>* | |
%node.137 = load <{ i64, [2 x i64*] }>, <{ i64, [2 x i64*] }>* %nodeAddress.136, align 1 | |
%item.138 = extractvalue <{ i64, [2 x i64*] }> %node.137, 0 | |
%node.139 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.138, 0 | |
%item.140 = extractvalue <{ i64, [2 x i64*] }> %node.137, 1, 1 | |
%node.141 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.139, i64* %item.140, 1, 1 | |
%item.142 = extractvalue <{ i64, [2 x i64*] }> %node.137, 1, 0 | |
%node.143 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.141, i64* %item.142, 1, 0 | |
br label %tag.switch.exit.144 | |
tag.switch.exit.144: ; preds = %tag.switch.Fupto.135, %tag.switch.Fsum.128, %tag.switch.CNil.123, %tag.switch.CInt.116, %tag.switch.CCons.107 | |
%_heap_ptr_.145 = phi i64* [ %_heap_ptr_.105, %tag.switch.CCons.107 ], [ %_heap_ptr_.105, %tag.switch.CInt.116 ], [ %_heap_ptr_.105, %tag.switch.CNil.123 ], [ %_heap_ptr_.105, %tag.switch.Fsum.128 ], [ %_heap_ptr_.105, %tag.switch.Fupto.135 ] | |
%v.146 = phi <{ i64, [2 x i64*], [1 x i64] }> [ %node.115, %tag.switch.CCons.107 ], [ %node.122, %tag.switch.CInt.116 ], [ %node.127, %tag.switch.CNil.123 ], [ %node.134, %tag.switch.Fsum.128 ], [ %node.143, %tag.switch.Fupto.135 ] | |
%tag.147 = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 0 | |
switch i64 %tag.147, label %error_block [ | |
i64 0, label %switch.CInt.148 | |
i64 3, label %switch.CNil.149 | |
i64 4, label %switch.CCons.150 | |
i64 1, label %switch.Fupto.151 | |
i64 2, label %switch.Fsum.170 | |
] | |
switch.CInt.148: ; preds = %tag.switch.exit.144 | |
%"x'1" = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 2, 0 | |
br label %switch.exit.176 | |
switch.CNil.149: ; preds = %tag.switch.exit.144 | |
br label %switch.exit.176 | |
switch.CCons.150: ; preds = %tag.switch.exit.144 | |
%y = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 1, 0 | |
%ys = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 1, 1 | |
br label %switch.exit.176 | |
switch.Fupto.151: ; preds = %tag.switch.exit.144 | |
%a = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 1, 0 | |
%b = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 1, 1 | |
%upto_result.152 = tail call <{ i64*, <{ i64, [2 x i64*] }> }> @upto(i64* %_heap_ptr_.145, i64* %a, i64* %b) | |
%_heap_ptr_.153 = extractvalue <{ i64*, <{ i64, [2 x i64*] }> }> %upto_result.152, 0 | |
%w.154 = extractvalue <{ i64*, <{ i64, [2 x i64*] }> }> %upto_result.152, 1 | |
%tag.155 = extractvalue <{ i64, [2 x i64*] }> %w.154, 0 | |
switch i64 %tag.155, label %error_block [ | |
i64 4, label %tag.switch.CCons.156 | |
i64 3, label %tag.switch.CNil.164 | |
] | |
tag.switch.CCons.156: ; preds = %switch.Fupto.151 | |
%item.157 = extractvalue <{ i64, [2 x i64*] }> %w.154, 0 | |
%node.158 = insertvalue <{ i64, [2 x i64*] }> undef, i64 %item.157, 0 | |
%item.159 = extractvalue <{ i64, [2 x i64*] }> %w.154, 1, 1 | |
%node.160 = insertvalue <{ i64, [2 x i64*] }> %node.158, i64* %item.159, 1, 1 | |
%item.161 = extractvalue <{ i64, [2 x i64*] }> %w.154, 1, 0 | |
%node.162 = insertvalue <{ i64, [2 x i64*] }> %node.160, i64* %item.161, 1, 0 | |
%nodeAddress.163 = bitcast i64* %q to <{ i64, [2 x i64*] }>* | |
store <{ i64, [2 x i64*] }> %node.162, <{ i64, [2 x i64*] }>* %nodeAddress.163, align 1 | |
br label %tag.switch.exit.168 | |
tag.switch.CNil.164: ; preds = %switch.Fupto.151 | |
%item.165 = extractvalue <{ i64, [2 x i64*] }> %w.154, 0 | |
%node.166 = insertvalue <{ i64 }> undef, i64 %item.165, 0 | |
%nodeAddress.167 = bitcast i64* %q to <{ i64 }>* | |
store <{ i64 }> %node.166, <{ i64 }>* %nodeAddress.167, align 1 | |
br label %tag.switch.exit.168 | |
tag.switch.exit.168: ; preds = %tag.switch.CNil.164, %tag.switch.CCons.156 | |
%_heap_ptr_.169 = phi i64* [ %_heap_ptr_.153, %tag.switch.CCons.156 ], [ %_heap_ptr_.153, %tag.switch.CNil.164 ] | |
%item.177 = extractvalue <{ i64, [2 x i64*] }> %w.154, 0 | |
%node.178 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.177, 0 | |
%item.179 = extractvalue <{ i64, [2 x i64*] }> %w.154, 1, 1 | |
%node.180 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.178, i64* %item.179, 1, 1 | |
%item.181 = extractvalue <{ i64, [2 x i64*] }> %w.154, 1, 0 | |
%node.182 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.180, i64* %item.181, 1, 0 | |
br label %switch.exit.176 | |
switch.Fsum.170: ; preds = %tag.switch.exit.144 | |
%c = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 1, 0 | |
%sum_result.171 = tail call <{ i64*, <{ i64, [1 x i64] }> }> @sum(i64* %_heap_ptr_.145, i64* %c) | |
%_heap_ptr_.172 = extractvalue <{ i64*, <{ i64, [1 x i64] }> }> %sum_result.171, 0 | |
%z.173 = extractvalue <{ i64*, <{ i64, [1 x i64] }> }> %sum_result.171, 1 | |
%tag.174 = extractvalue <{ i64, [1 x i64] }> %z.173, 0 | |
%nodeAddress.175 = bitcast i64* %q to <{ i64, [1 x i64] }>* | |
store <{ i64, [1 x i64] }> %z.173, <{ i64, [1 x i64] }>* %nodeAddress.175, align 1 | |
%item.183 = extractvalue <{ i64, [1 x i64] }> %z.173, 0 | |
%node.184 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.183, 0 | |
%item.185 = extractvalue <{ i64, [1 x i64] }> %z.173, 1, 0 | |
%node.186 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.184, i64 %item.185, 2, 0 | |
br label %switch.exit.176 | |
switch.exit.176: ; preds = %switch.Fsum.170, %tag.switch.exit.168, %switch.CCons.150, %switch.CNil.149, %switch.CInt.148 | |
%_heap_ptr_.187 = phi i64* [ %_heap_ptr_.145, %switch.CInt.148 ], [ %_heap_ptr_.145, %switch.CNil.149 ], [ %_heap_ptr_.145, %switch.CCons.150 ], [ %_heap_ptr_.169, %tag.switch.exit.168 ], [ %_heap_ptr_.172, %switch.Fsum.170 ] | |
%eval_result.188 = phi <{ i64, [2 x i64*], [1 x i64] }> [ %v.146, %switch.CInt.148 ], [ %v.146, %switch.CNil.149 ], [ %v.146, %switch.CCons.150 ], [ %node.182, %tag.switch.exit.168 ], [ %node.186, %switch.Fsum.170 ] | |
%eval_wrapped_result.189 = insertvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> undef, i64* %_heap_ptr_.187, 0 | |
%eval_wrapped_result.190 = insertvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_wrapped_result.189, <{ i64, [2 x i64*], [1 x i64] }> %eval_result.188, 1 | |
ret <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_wrapped_result.190 | |
error_block: ; preds = %switch.Fupto.151, %tag.switch.exit.144, %eval.entry | |
%error_result.191 = tail call i64 @_prim_int_print(i64 666) | |
unreachable | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.text | |
.file "<string>" | |
.globl grinMain # -- Begin function grinMain | |
.p2align 4, 0x90 | |
.type grinMain,@function | |
grinMain: # @grinMain | |
.cfi_startproc | |
# BB#0: # %grinMain.entry | |
pushq %rbx | |
.Lcfi0: | |
.cfi_def_cfa_offset 16 | |
subq $48, %rsp | |
.Lcfi1: | |
.cfi_def_cfa_offset 64 | |
.Lcfi2: | |
.cfi_offset %rbx, -16 | |
movq %rdi, %rax | |
movq $1, 8(%rax) | |
movq $0, (%rax) | |
leaq 32(%rax), %rcx | |
movq $10000, 40(%rax) # imm = 0x2710 | |
movq $0, 32(%rax) | |
leaq 64(%rax), %rdx | |
movq %rcx, 80(%rax) | |
movq %rax, 72(%rax) | |
movq $1, 64(%rax) | |
movq %rdx, 104(%rax) | |
movq $2, 96(%rax) | |
leaq 96(%rax), %rdx | |
subq $-128, %rax | |
leaq 8(%rsp), %rdi | |
movq %rax, %rsi | |
callq eval | |
movq 8(%rsp), %rbx | |
movq 40(%rsp), %rdi | |
callq _prim_int_print | |
movq %rax, %rcx | |
movq %rbx, %rax | |
movq %rcx, %rdx | |
addq $48, %rsp | |
popq %rbx | |
retq | |
.Lfunc_end0: | |
.size grinMain, .Lfunc_end0-grinMain | |
.cfi_endproc | |
# -- End function | |
.globl upto # -- Begin function upto | |
.p2align 4, 0x90 | |
.type upto,@function | |
upto: # @upto | |
.cfi_startproc | |
# BB#0: # %upto.entry | |
pushq %r15 | |
.Lcfi3: | |
.cfi_def_cfa_offset 16 | |
pushq %r14 | |
.Lcfi4: | |
.cfi_def_cfa_offset 24 | |
pushq %r12 | |
.Lcfi5: | |
.cfi_def_cfa_offset 32 | |
pushq %rbx | |
.Lcfi6: | |
.cfi_def_cfa_offset 40 | |
subq $88, %rsp | |
.Lcfi7: | |
.cfi_def_cfa_offset 128 | |
.Lcfi8: | |
.cfi_offset %rbx, -40 | |
.Lcfi9: | |
.cfi_offset %r12, -32 | |
.Lcfi10: | |
.cfi_offset %r14, -24 | |
.Lcfi11: | |
.cfi_offset %r15, -16 | |
movq %rcx, %r15 | |
movq %rdx, %r14 | |
movq %rdi, %r12 | |
leaq 48(%rsp), %rdi | |
callq eval | |
movq 48(%rsp), %rsi | |
movq 80(%rsp), %rbx | |
leaq 8(%rsp), %rdi | |
movq %r15, %rdx | |
callq eval | |
movq 8(%rsp), %rax | |
cmpq 40(%rsp), %rbx | |
setg %cl | |
jg .LBB1_1 | |
# BB#2: # %upto.entry | |
testb %cl, %cl | |
jne .LBB1_5 | |
# BB#3: # %switch.bool_False.47 | |
incq %rbx | |
movq %rbx, 8(%rax) | |
movq $0, (%rax) | |
movq %r15, 48(%rax) | |
movq %rax, 40(%rax) | |
movq $1, 32(%rax) | |
leaq 32(%rax), %rcx | |
addq $64, %rax | |
movl $4, %edx | |
jmp .LBB1_4 | |
.LBB1_1: | |
movl $3, %edx | |
# implicit-def: %R14 | |
# implicit-def: %RCX | |
.LBB1_4: # %switch.exit.67 | |
movq %rdx, 8(%r12) | |
movq %rax, (%r12) | |
movq %r14, 16(%r12) | |
movq %rcx, 24(%r12) | |
movq %r12, %rax | |
addq $88, %rsp | |
popq %rbx | |
popq %r12 | |
popq %r14 | |
popq %r15 | |
retq | |
.LBB1_5: # %error_block | |
movl $666, %edi # imm = 0x29A | |
callq _prim_int_print | |
.Lfunc_end1: | |
.size upto, .Lfunc_end1-upto | |
.cfi_endproc | |
# -- End function | |
.globl sum # -- Begin function sum | |
.p2align 4, 0x90 | |
.type sum,@function | |
sum: # @sum | |
.cfi_startproc | |
# BB#0: # %sum.entry | |
pushq %r14 | |
.Lcfi12: | |
.cfi_def_cfa_offset 16 | |
pushq %rbx | |
.Lcfi13: | |
.cfi_def_cfa_offset 24 | |
subq $88, %rsp | |
.Lcfi14: | |
.cfi_def_cfa_offset 112 | |
.Lcfi15: | |
.cfi_offset %rbx, -24 | |
.Lcfi16: | |
.cfi_offset %r14, -16 | |
movq %rsi, %rax | |
movq %rdi, %rcx | |
leaq 8(%rsp), %rdi | |
movq %rcx, %rsi | |
movq %rax, %rdx | |
callq eval | |
movq 8(%rsp), %rax | |
movq 16(%rsp), %rcx | |
xorl %edx, %edx | |
cmpq $3, %rcx | |
je .LBB2_1 | |
# BB#2: # %sum.entry | |
cmpq $4, %rcx | |
jne .LBB2_5 | |
# BB#3: # %switch.CCons.89 | |
movq 32(%rsp), %r14 | |
movq 24(%rsp), %rdx | |
leaq 48(%rsp), %rdi | |
movq %rax, %rsi | |
callq eval | |
movq 48(%rsp), %rdi | |
movq 80(%rsp), %rbx | |
movq %r14, %rsi | |
callq sum | |
addq %rbx, %rcx | |
xorl %edx, %edx | |
jmp .LBB2_4 | |
.LBB2_1: | |
xorl %ecx, %ecx | |
.LBB2_4: # %switch.exit.99 | |
addq $88, %rsp | |
popq %rbx | |
popq %r14 | |
retq | |
.LBB2_5: # %error_block | |
movl $666, %edi # imm = 0x29A | |
callq _prim_int_print | |
.Lfunc_end2: | |
.size sum, .Lfunc_end2-sum | |
.cfi_endproc | |
# -- End function | |
.globl eval # -- Begin function eval | |
.p2align 4, 0x90 | |
.type eval,@function | |
eval: # @eval | |
.cfi_startproc | |
# BB#0: # %eval.entry | |
pushq %r14 | |
.Lcfi17: | |
.cfi_def_cfa_offset 16 | |
pushq %rbx | |
.Lcfi18: | |
.cfi_def_cfa_offset 24 | |
subq $40, %rsp | |
.Lcfi19: | |
.cfi_def_cfa_offset 64 | |
.Lcfi20: | |
.cfi_offset %rbx, -24 | |
.Lcfi21: | |
.cfi_offset %r14, -16 | |
movq %rdx, %rbx | |
movq %rdi, %r14 | |
movq (%rbx), %rax | |
cmpq $4, %rax | |
ja .LBB3_16 | |
# BB#1: # %eval.entry | |
jmpq *.LJTI3_0(,%rax,8) | |
.LBB3_2: # %tag.switch.Fupto.135 | |
movq 16(%rbx), %rcx | |
movq (%rbx), %rdx | |
movq 8(%rbx), %rax | |
jmp .LBB3_7 | |
.LBB3_3: # %tag.switch.CNil.123 | |
movq (%rbx), %rdx | |
# implicit-def: %RAX | |
jmp .LBB3_6 | |
.LBB3_4: # %tag.switch.CInt.116 | |
movq (%rbx), %rdx | |
movq 8(%rbx), %rdi | |
# implicit-def: %RAX | |
# implicit-def: %RCX | |
cmpq $4, %rdx | |
ja .LBB3_16 | |
.LBB3_8: # %tag.switch.exit.144 | |
jmpq *.LJTI3_1(,%rdx,8) | |
.LBB3_9: # %switch.Fupto.151 | |
leaq 8(%rsp), %rdi | |
movq %rax, %rdx | |
callq upto | |
movq 32(%rsp), %rcx | |
movq 24(%rsp), %rax | |
movq 8(%rsp), %rsi | |
movq 16(%rsp), %rdx | |
cmpq $3, %rdx | |
je .LBB3_13 | |
# BB#10: # %switch.Fupto.151 | |
cmpq $4, %rdx | |
jne .LBB3_16 | |
# BB#11: # %tag.switch.CCons.156 | |
movq %rdx, (%rbx) | |
movq %rax, 8(%rbx) | |
movq %rcx, 16(%rbx) | |
jmp .LBB3_14 | |
.LBB3_12: # %switch.Fsum.170 | |
movq %rsi, %rdi | |
movq %rax, %rsi | |
callq sum | |
movq %rax, %rsi | |
movq %rcx, %rdi | |
movq %rdi, 8(%rbx) | |
movq %rdx, (%rbx) | |
# implicit-def: %RAX | |
# implicit-def: %RCX | |
jmp .LBB3_15 | |
.LBB3_5: # %tag.switch.Fsum.128 | |
movq (%rbx), %rdx | |
movq 8(%rbx), %rax | |
.LBB3_6: # %tag.switch.exit.144 | |
# implicit-def: %RCX | |
.LBB3_7: # %tag.switch.exit.144 | |
# implicit-def: %RDI | |
cmpq $4, %rdx | |
jbe .LBB3_8 | |
.LBB3_16: # %error_block | |
movl $666, %edi # imm = 0x29A | |
callq _prim_int_print | |
.LBB3_13: # %tag.switch.CNil.164 | |
movq %rdx, (%rbx) | |
.LBB3_14: # %switch.exit.176 | |
# implicit-def: %RDI | |
.LBB3_15: # %switch.exit.176 | |
movq %rdx, 8(%r14) | |
movq %rsi, (%r14) | |
movq %rax, 16(%r14) | |
movq %rcx, 24(%r14) | |
movq %rdi, 32(%r14) | |
movq %r14, %rax | |
addq $40, %rsp | |
popq %rbx | |
popq %r14 | |
retq | |
.Lfunc_end3: | |
.size eval, .Lfunc_end3-eval | |
.cfi_endproc | |
.section .rodata,"a",@progbits | |
.p2align 3 | |
.LJTI3_0: | |
.quad .LBB3_4 | |
.quad .LBB3_2 | |
.quad .LBB3_5 | |
.quad .LBB3_3 | |
.quad .LBB3_2 | |
.LJTI3_1: | |
.quad .LBB3_15 | |
.quad .LBB3_9 | |
.quad .LBB3_12 | |
.quad .LBB3_15 | |
.quad .LBB3_15 | |
# -- End function | |
.section ".note.GNU-stack","",@progbits |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; ModuleID = 'basic' | |
source_filename = "<string>" | |
declare i64 @_prim_int_print(i64) | |
define <{ i64*, i64 }> @grinMain(i64* %_heap_ptr_.0) #0 { | |
grinMain.entry: | |
%nodeAddress.4 = bitcast i64* %_heap_ptr_.0 to <{ i64, [1 x i64] }>* | |
store <{ i64, [1 x i64] }> <{ i64 0, [1 x i64] [i64 1] }>, <{ i64, [1 x i64] }>* %nodeAddress.4, align 1 | |
%_heap_ptr_.5 = bitcast i64* %_heap_ptr_.0 to <{ i64, [2 x i64*], [1 x i64] }>* | |
%_heap_ptr_.6 = getelementptr inbounds <{ i64, [2 x i64*], [1 x i64] }>, <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.5, i32 1 | |
%_heap_ptr_.7 = bitcast <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.6 to i64* | |
%nodeAddress.11 = bitcast i64* %_heap_ptr_.7 to <{ i64, [1 x i64] }>* | |
store <{ i64, [1 x i64] }> <{ i64 0, [1 x i64] [i64 10000] }>, <{ i64, [1 x i64] }>* %nodeAddress.11, align 1 | |
%_heap_ptr_.12 = bitcast i64* %_heap_ptr_.7 to <{ i64, [2 x i64*], [1 x i64] }>* | |
%_heap_ptr_.13 = getelementptr inbounds <{ i64, [2 x i64*], [1 x i64] }>, <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.12, i32 1 | |
%_heap_ptr_.14 = bitcast <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.13 to i64* | |
%node.16 = insertvalue <{ i64, [2 x i64*] }> <{ i64 1, [2 x i64*] undef }>, i64* %_heap_ptr_.0, 1, 0 | |
%node.17 = insertvalue <{ i64, [2 x i64*] }> %node.16, i64* %_heap_ptr_.7, 1, 1 | |
%tag.18 = extractvalue <{ i64, [2 x i64*] }> %node.17, 0 | |
%nodeAddress.19 = bitcast i64* %_heap_ptr_.14 to <{ i64, [2 x i64*] }>* | |
store <{ i64, [2 x i64*] }> %node.17, <{ i64, [2 x i64*] }>* %nodeAddress.19, align 1 | |
%_heap_ptr_.20 = bitcast i64* %_heap_ptr_.14 to <{ i64, [2 x i64*], [1 x i64] }>* | |
%_heap_ptr_.21 = getelementptr inbounds <{ i64, [2 x i64*], [1 x i64] }>, <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.20, i32 1 | |
%_heap_ptr_.22 = bitcast <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.21 to i64* | |
%node.24 = insertvalue <{ i64, [1 x i64*] }> <{ i64 2, [1 x i64*] undef }>, i64* %_heap_ptr_.14, 1, 0 | |
%tag.25 = extractvalue <{ i64, [1 x i64*] }> %node.24, 0 | |
%nodeAddress.26 = bitcast i64* %_heap_ptr_.22 to <{ i64, [1 x i64*] }>* | |
store <{ i64, [1 x i64*] }> %node.24, <{ i64, [1 x i64*] }>* %nodeAddress.26, align 1 | |
%_heap_ptr_.27 = bitcast i64* %_heap_ptr_.22 to <{ i64, [2 x i64*], [1 x i64] }>* | |
%_heap_ptr_.28 = getelementptr inbounds <{ i64, [2 x i64*], [1 x i64] }>, <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.27, i32 1 | |
%_heap_ptr_.29 = bitcast <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.28 to i64* | |
%eval_result.30 = tail call <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> @eval(i64* %_heap_ptr_.29, i64* %_heap_ptr_.22) | |
%_heap_ptr_.31 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.30, 0 | |
%node.32 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.30, 1 | |
%"r'" = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %node.32, 2, 0 | |
%grinMain_result.33 = call i64 @_prim_int_print(i64 %"r'") | |
%grinMain_wrapped_result.34 = insertvalue <{ i64*, i64 }> undef, i64* %_heap_ptr_.31, 0 | |
%grinMain_wrapped_result.35 = insertvalue <{ i64*, i64 }> %grinMain_wrapped_result.34, i64 %grinMain_result.33, 1 | |
ret <{ i64*, i64 }> %grinMain_wrapped_result.35 | |
error_block: ; No predecessors! | |
%error_result.36 = tail call i64 @_prim_int_print(i64 666) | |
unreachable | |
} | |
define <{ i64*, <{ i64, [2 x i64*] }> }> @upto(i64* %_heap_ptr_.37, i64* %m, i64* %n) #0 { | |
upto.entry: | |
%eval_result.38 = tail call <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> @eval(i64* %_heap_ptr_.37, i64* %m) | |
%_heap_ptr_.39 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.38, 0 | |
%node.40 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.38, 1 | |
%"m'" = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %node.40, 2, 0 | |
%eval_result.41 = tail call <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> @eval(i64* %_heap_ptr_.39, i64* %n) | |
%_heap_ptr_.42 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.41, 0 | |
%node.43 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.41, 1 | |
%"n'" = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %node.43, 2, 0 | |
%"b'.44" = icmp sgt i64 %"m'", %"n'" | |
switch i1 %"b'.44", label %error_block [ | |
i1 true, label %switch.bool_True.45 | |
i1 false, label %switch.bool_False.47 | |
] | |
switch.bool_True.45: ; preds = %upto.entry | |
br label %switch.exit.67 | |
switch.bool_False.47: ; preds = %upto.entry | |
%"m1'.48" = add i64 %"m'", 1 | |
%node.50 = insertvalue <{ i64, [1 x i64] }> <{ i64 0, [1 x i64] undef }>, i64 %"m1'.48", 1, 0 | |
%tag.51 = extractvalue <{ i64, [1 x i64] }> %node.50, 0 | |
%nodeAddress.52 = bitcast i64* %_heap_ptr_.42 to <{ i64, [1 x i64] }>* | |
store <{ i64, [1 x i64] }> %node.50, <{ i64, [1 x i64] }>* %nodeAddress.52, align 1 | |
%_heap_ptr_.53 = bitcast i64* %_heap_ptr_.42 to <{ i64, [2 x i64*], [1 x i64] }>* | |
%_heap_ptr_.54 = getelementptr inbounds <{ i64, [2 x i64*], [1 x i64] }>, <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.53, i32 1 | |
%_heap_ptr_.55 = bitcast <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.54 to i64* | |
%node.57 = insertvalue <{ i64, [2 x i64*] }> <{ i64 1, [2 x i64*] undef }>, i64* %_heap_ptr_.42, 1, 0 | |
%node.58 = insertvalue <{ i64, [2 x i64*] }> %node.57, i64* %n, 1, 1 | |
%tag.59 = extractvalue <{ i64, [2 x i64*] }> %node.58, 0 | |
%nodeAddress.60 = bitcast i64* %_heap_ptr_.55 to <{ i64, [2 x i64*] }>* | |
store <{ i64, [2 x i64*] }> %node.58, <{ i64, [2 x i64*] }>* %nodeAddress.60, align 1 | |
%_heap_ptr_.61 = bitcast i64* %_heap_ptr_.55 to <{ i64, [2 x i64*], [1 x i64] }>* | |
%_heap_ptr_.62 = getelementptr inbounds <{ i64, [2 x i64*], [1 x i64] }>, <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.61, i32 1 | |
%_heap_ptr_.63 = bitcast <{ i64, [2 x i64*], [1 x i64] }>* %_heap_ptr_.62 to i64* | |
%node.65 = insertvalue <{ i64, [2 x i64*] }> <{ i64 4, [2 x i64*] undef }>, i64* %m, 1, 0 | |
%node.66 = insertvalue <{ i64, [2 x i64*] }> %node.65, i64* %_heap_ptr_.55, 1, 1 | |
%item.70 = extractvalue <{ i64, [2 x i64*] }> %node.66, 0 | |
%node.71 = insertvalue <{ i64, [2 x i64*] }> undef, i64 %item.70, 0 | |
%item.72 = extractvalue <{ i64, [2 x i64*] }> %node.66, 1, 1 | |
%node.73 = insertvalue <{ i64, [2 x i64*] }> %node.71, i64* %item.72, 1, 1 | |
%item.74 = extractvalue <{ i64, [2 x i64*] }> %node.66, 1, 0 | |
%node.75 = insertvalue <{ i64, [2 x i64*] }> %node.73, i64* %item.74, 1, 0 | |
br label %switch.exit.67 | |
switch.exit.67: ; preds = %switch.bool_False.47, %switch.bool_True.45 | |
%_heap_ptr_.76 = phi i64* [ %_heap_ptr_.42, %switch.bool_True.45 ], [ %_heap_ptr_.63, %switch.bool_False.47 ] | |
%upto_result.77 = phi <{ i64, [2 x i64*] }> [ <{ i64 3, [2 x i64*] undef }>, %switch.bool_True.45 ], [ %node.75, %switch.bool_False.47 ] | |
%upto_wrapped_result.78 = insertvalue <{ i64*, <{ i64, [2 x i64*] }> }> undef, i64* %_heap_ptr_.76, 0 | |
%upto_wrapped_result.79 = insertvalue <{ i64*, <{ i64, [2 x i64*] }> }> %upto_wrapped_result.78, <{ i64, [2 x i64*] }> %upto_result.77, 1 | |
ret <{ i64*, <{ i64, [2 x i64*] }> }> %upto_wrapped_result.79 | |
error_block: ; preds = %upto.entry | |
%error_result.80 = tail call i64 @_prim_int_print(i64 666) | |
unreachable | |
} | |
define <{ i64*, <{ i64, [1 x i64] }> }> @sum(i64* %_heap_ptr_.81, i64* %l) #0 { | |
sum.entry: | |
%eval_result.82 = tail call <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> @eval(i64* %_heap_ptr_.81, i64* %l) | |
%_heap_ptr_.83 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.82, 0 | |
%l2.84 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.82, 1 | |
%tag.85 = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %l2.84, 0 | |
switch i64 %tag.85, label %error_block [ | |
i64 3, label %switch.CNil.86 | |
i64 4, label %switch.CCons.89 | |
] | |
switch.CNil.86: ; preds = %sum.entry | |
br label %switch.exit.99 | |
switch.CCons.89: ; preds = %sum.entry | |
%x = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %l2.84, 1, 0 | |
%xs = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %l2.84, 1, 1 | |
%eval_result.90 = tail call <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> @eval(i64* %_heap_ptr_.83, i64* %x) | |
%_heap_ptr_.91 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.90, 0 | |
%node.92 = extractvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_result.90, 1 | |
%"x'" = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %node.92, 2, 0 | |
%sum_result.93 = tail call <{ i64*, <{ i64, [1 x i64] }> }> @sum(i64* %_heap_ptr_.91, i64* %xs) | |
%_heap_ptr_.94 = extractvalue <{ i64*, <{ i64, [1 x i64] }> }> %sum_result.93, 0 | |
%node.95 = extractvalue <{ i64*, <{ i64, [1 x i64] }> }> %sum_result.93, 1 | |
%"s'" = extractvalue <{ i64, [1 x i64] }> %node.95, 1, 0 | |
%"ax'.96" = add i64 %"x'", %"s'" | |
%node.98 = insertvalue <{ i64, [1 x i64] }> <{ i64 0, [1 x i64] undef }>, i64 %"ax'.96", 1, 0 | |
br label %switch.exit.99 | |
switch.exit.99: ; preds = %switch.CCons.89, %switch.CNil.86 | |
%_heap_ptr_.100 = phi i64* [ %_heap_ptr_.83, %switch.CNil.86 ], [ %_heap_ptr_.94, %switch.CCons.89 ] | |
%sum_result.101 = phi <{ i64, [1 x i64] }> [ zeroinitializer, %switch.CNil.86 ], [ %node.98, %switch.CCons.89 ] | |
%sum_wrapped_result.102 = insertvalue <{ i64*, <{ i64, [1 x i64] }> }> undef, i64* %_heap_ptr_.100, 0 | |
%sum_wrapped_result.103 = insertvalue <{ i64*, <{ i64, [1 x i64] }> }> %sum_wrapped_result.102, <{ i64, [1 x i64] }> %sum_result.101, 1 | |
ret <{ i64*, <{ i64, [1 x i64] }> }> %sum_wrapped_result.103 | |
error_block: ; preds = %sum.entry | |
%error_result.104 = tail call i64 @_prim_int_print(i64 666) | |
unreachable | |
} | |
define <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> @eval(i64* %_heap_ptr_.105, i64* %q) #0 { | |
eval.entry: | |
%tag.106 = load i64, i64* %q, align 1 | |
switch i64 %tag.106, label %error_block [ | |
i64 4, label %tag.switch.CCons.107 | |
i64 0, label %tag.switch.CInt.116 | |
i64 3, label %tag.switch.CNil.123 | |
i64 2, label %tag.switch.Fsum.128 | |
i64 1, label %tag.switch.Fupto.135 | |
] | |
tag.switch.CCons.107: ; preds = %eval.entry | |
%nodeAddress.108 = bitcast i64* %q to <{ i64, [2 x i64*] }>* | |
%node.109 = load <{ i64, [2 x i64*] }>, <{ i64, [2 x i64*] }>* %nodeAddress.108, align 1 | |
%item.110 = extractvalue <{ i64, [2 x i64*] }> %node.109, 0 | |
%node.111 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.110, 0 | |
%item.112 = extractvalue <{ i64, [2 x i64*] }> %node.109, 1, 1 | |
%node.113 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.111, i64* %item.112, 1, 1 | |
%item.114 = extractvalue <{ i64, [2 x i64*] }> %node.109, 1, 0 | |
%node.115 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.113, i64* %item.114, 1, 0 | |
br label %tag.switch.exit.144 | |
tag.switch.CInt.116: ; preds = %eval.entry | |
%nodeAddress.117 = bitcast i64* %q to <{ i64, [1 x i64] }>* | |
%node.118 = load <{ i64, [1 x i64] }>, <{ i64, [1 x i64] }>* %nodeAddress.117, align 1 | |
%item.119 = extractvalue <{ i64, [1 x i64] }> %node.118, 0 | |
%node.120 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.119, 0 | |
%item.121 = extractvalue <{ i64, [1 x i64] }> %node.118, 1, 0 | |
%node.122 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.120, i64 %item.121, 2, 0 | |
br label %tag.switch.exit.144 | |
tag.switch.CNil.123: ; preds = %eval.entry | |
%nodeAddress.124 = bitcast i64* %q to <{ i64 }>* | |
%node.125 = load <{ i64 }>, <{ i64 }>* %nodeAddress.124, align 1 | |
%item.126 = extractvalue <{ i64 }> %node.125, 0 | |
%node.127 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.126, 0 | |
br label %tag.switch.exit.144 | |
tag.switch.Fsum.128: ; preds = %eval.entry | |
%nodeAddress.129 = bitcast i64* %q to <{ i64, [1 x i64*] }>* | |
%node.130 = load <{ i64, [1 x i64*] }>, <{ i64, [1 x i64*] }>* %nodeAddress.129, align 1 | |
%item.131 = extractvalue <{ i64, [1 x i64*] }> %node.130, 0 | |
%node.132 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.131, 0 | |
%item.133 = extractvalue <{ i64, [1 x i64*] }> %node.130, 1, 0 | |
%node.134 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.132, i64* %item.133, 1, 0 | |
br label %tag.switch.exit.144 | |
tag.switch.Fupto.135: ; preds = %eval.entry | |
%nodeAddress.136 = bitcast i64* %q to <{ i64, [2 x i64*] }>* | |
%node.137 = load <{ i64, [2 x i64*] }>, <{ i64, [2 x i64*] }>* %nodeAddress.136, align 1 | |
%item.138 = extractvalue <{ i64, [2 x i64*] }> %node.137, 0 | |
%node.139 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.138, 0 | |
%item.140 = extractvalue <{ i64, [2 x i64*] }> %node.137, 1, 1 | |
%node.141 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.139, i64* %item.140, 1, 1 | |
%item.142 = extractvalue <{ i64, [2 x i64*] }> %node.137, 1, 0 | |
%node.143 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.141, i64* %item.142, 1, 0 | |
br label %tag.switch.exit.144 | |
tag.switch.exit.144: ; preds = %tag.switch.Fupto.135, %tag.switch.Fsum.128, %tag.switch.CNil.123, %tag.switch.CInt.116, %tag.switch.CCons.107 | |
%_heap_ptr_.145 = phi i64* [ %_heap_ptr_.105, %tag.switch.CCons.107 ], [ %_heap_ptr_.105, %tag.switch.CInt.116 ], [ %_heap_ptr_.105, %tag.switch.CNil.123 ], [ %_heap_ptr_.105, %tag.switch.Fsum.128 ], [ %_heap_ptr_.105, %tag.switch.Fupto.135 ] | |
%v.146 = phi <{ i64, [2 x i64*], [1 x i64] }> [ %node.115, %tag.switch.CCons.107 ], [ %node.122, %tag.switch.CInt.116 ], [ %node.127, %tag.switch.CNil.123 ], [ %node.134, %tag.switch.Fsum.128 ], [ %node.143, %tag.switch.Fupto.135 ] | |
%tag.147 = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 0 | |
switch i64 %tag.147, label %error_block [ | |
i64 0, label %switch.CInt.148 | |
i64 3, label %switch.CNil.149 | |
i64 4, label %switch.CCons.150 | |
i64 1, label %switch.Fupto.151 | |
i64 2, label %switch.Fsum.170 | |
] | |
switch.CInt.148: ; preds = %tag.switch.exit.144 | |
%"x'1" = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 2, 0 | |
br label %switch.exit.176 | |
switch.CNil.149: ; preds = %tag.switch.exit.144 | |
br label %switch.exit.176 | |
switch.CCons.150: ; preds = %tag.switch.exit.144 | |
%y = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 1, 0 | |
%ys = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 1, 1 | |
br label %switch.exit.176 | |
switch.Fupto.151: ; preds = %tag.switch.exit.144 | |
%a = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 1, 0 | |
%b = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 1, 1 | |
%upto_result.152 = tail call <{ i64*, <{ i64, [2 x i64*] }> }> @upto(i64* %_heap_ptr_.145, i64* %a, i64* %b) | |
%_heap_ptr_.153 = extractvalue <{ i64*, <{ i64, [2 x i64*] }> }> %upto_result.152, 0 | |
%w.154 = extractvalue <{ i64*, <{ i64, [2 x i64*] }> }> %upto_result.152, 1 | |
%tag.155 = extractvalue <{ i64, [2 x i64*] }> %w.154, 0 | |
switch i64 %tag.155, label %error_block [ | |
i64 4, label %tag.switch.CCons.156 | |
i64 3, label %tag.switch.CNil.164 | |
] | |
tag.switch.CCons.156: ; preds = %switch.Fupto.151 | |
%item.157 = extractvalue <{ i64, [2 x i64*] }> %w.154, 0 | |
%node.158 = insertvalue <{ i64, [2 x i64*] }> undef, i64 %item.157, 0 | |
%item.159 = extractvalue <{ i64, [2 x i64*] }> %w.154, 1, 1 | |
%node.160 = insertvalue <{ i64, [2 x i64*] }> %node.158, i64* %item.159, 1, 1 | |
%item.161 = extractvalue <{ i64, [2 x i64*] }> %w.154, 1, 0 | |
%node.162 = insertvalue <{ i64, [2 x i64*] }> %node.160, i64* %item.161, 1, 0 | |
%nodeAddress.163 = bitcast i64* %q to <{ i64, [2 x i64*] }>* | |
store <{ i64, [2 x i64*] }> %node.162, <{ i64, [2 x i64*] }>* %nodeAddress.163, align 1 | |
br label %tag.switch.exit.168 | |
tag.switch.CNil.164: ; preds = %switch.Fupto.151 | |
%item.165 = extractvalue <{ i64, [2 x i64*] }> %w.154, 0 | |
%node.166 = insertvalue <{ i64 }> undef, i64 %item.165, 0 | |
%nodeAddress.167 = bitcast i64* %q to <{ i64 }>* | |
store <{ i64 }> %node.166, <{ i64 }>* %nodeAddress.167, align 1 | |
br label %tag.switch.exit.168 | |
tag.switch.exit.168: ; preds = %tag.switch.CNil.164, %tag.switch.CCons.156 | |
%_heap_ptr_.169 = phi i64* [ %_heap_ptr_.153, %tag.switch.CCons.156 ], [ %_heap_ptr_.153, %tag.switch.CNil.164 ] | |
%item.177 = extractvalue <{ i64, [2 x i64*] }> %w.154, 0 | |
%node.178 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.177, 0 | |
%item.179 = extractvalue <{ i64, [2 x i64*] }> %w.154, 1, 1 | |
%node.180 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.178, i64* %item.179, 1, 1 | |
%item.181 = extractvalue <{ i64, [2 x i64*] }> %w.154, 1, 0 | |
%node.182 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.180, i64* %item.181, 1, 0 | |
br label %switch.exit.176 | |
switch.Fsum.170: ; preds = %tag.switch.exit.144 | |
%c = extractvalue <{ i64, [2 x i64*], [1 x i64] }> %v.146, 1, 0 | |
%sum_result.171 = tail call <{ i64*, <{ i64, [1 x i64] }> }> @sum(i64* %_heap_ptr_.145, i64* %c) | |
%_heap_ptr_.172 = extractvalue <{ i64*, <{ i64, [1 x i64] }> }> %sum_result.171, 0 | |
%z.173 = extractvalue <{ i64*, <{ i64, [1 x i64] }> }> %sum_result.171, 1 | |
%tag.174 = extractvalue <{ i64, [1 x i64] }> %z.173, 0 | |
%nodeAddress.175 = bitcast i64* %q to <{ i64, [1 x i64] }>* | |
store <{ i64, [1 x i64] }> %z.173, <{ i64, [1 x i64] }>* %nodeAddress.175, align 1 | |
%item.183 = extractvalue <{ i64, [1 x i64] }> %z.173, 0 | |
%node.184 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> undef, i64 %item.183, 0 | |
%item.185 = extractvalue <{ i64, [1 x i64] }> %z.173, 1, 0 | |
%node.186 = insertvalue <{ i64, [2 x i64*], [1 x i64] }> %node.184, i64 %item.185, 2, 0 | |
br label %switch.exit.176 | |
switch.exit.176: ; preds = %switch.Fsum.170, %tag.switch.exit.168, %switch.CCons.150, %switch.CNil.149, %switch.CInt.148 | |
%_heap_ptr_.187 = phi i64* [ %_heap_ptr_.145, %switch.CInt.148 ], [ %_heap_ptr_.145, %switch.CNil.149 ], [ %_heap_ptr_.145, %switch.CCons.150 ], [ %_heap_ptr_.169, %tag.switch.exit.168 ], [ %_heap_ptr_.172, %switch.Fsum.170 ] | |
%eval_result.188 = phi <{ i64, [2 x i64*], [1 x i64] }> [ %v.146, %switch.CInt.148 ], [ %v.146, %switch.CNil.149 ], [ %v.146, %switch.CCons.150 ], [ %node.182, %tag.switch.exit.168 ], [ %node.186, %switch.Fsum.170 ] | |
%eval_wrapped_result.189 = insertvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> undef, i64* %_heap_ptr_.187, 0 | |
%eval_wrapped_result.190 = insertvalue <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_wrapped_result.189, <{ i64, [2 x i64*], [1 x i64] }> %eval_result.188, 1 | |
ret <{ i64*, <{ i64, [2 x i64*], [1 x i64] }> }> %eval_wrapped_result.190 | |
error_block: ; preds = %switch.Fupto.151, %tag.switch.exit.144, %eval.entry | |
%error_result.191 = tail call i64 @_prim_int_print(i64 666) | |
unreachable | |
} | |
attributes #0 = { "no-jump-tables"="true" } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.text | |
.file "<string>" | |
.globl grinMain # -- Begin function grinMain | |
.p2align 4, 0x90 | |
.type grinMain,@function | |
grinMain: # @grinMain | |
.cfi_startproc | |
# BB#0: # %grinMain.entry | |
pushq %rbx | |
.Lcfi0: | |
.cfi_def_cfa_offset 16 | |
subq $48, %rsp | |
.Lcfi1: | |
.cfi_def_cfa_offset 64 | |
.Lcfi2: | |
.cfi_offset %rbx, -16 | |
movq %rdi, %rax | |
movq $1, 8(%rax) | |
movq $0, (%rax) | |
leaq 32(%rax), %rcx | |
movq $10000, 40(%rax) # imm = 0x2710 | |
movq $0, 32(%rax) | |
leaq 64(%rax), %rdx | |
movq %rcx, 80(%rax) | |
movq %rax, 72(%rax) | |
movq $1, 64(%rax) | |
movq %rdx, 104(%rax) | |
movq $2, 96(%rax) | |
leaq 96(%rax), %rdx | |
subq $-128, %rax | |
leaq 8(%rsp), %rdi | |
movq %rax, %rsi | |
callq eval | |
movq 8(%rsp), %rbx | |
movq 40(%rsp), %rdi | |
callq _prim_int_print | |
movq %rax, %rcx | |
movq %rbx, %rax | |
movq %rcx, %rdx | |
addq $48, %rsp | |
popq %rbx | |
retq | |
.Lfunc_end0: | |
.size grinMain, .Lfunc_end0-grinMain | |
.cfi_endproc | |
# -- End function | |
.globl upto # -- Begin function upto | |
.p2align 4, 0x90 | |
.type upto,@function | |
upto: # @upto | |
.cfi_startproc | |
# BB#0: # %upto.entry | |
pushq %r15 | |
.Lcfi3: | |
.cfi_def_cfa_offset 16 | |
pushq %r14 | |
.Lcfi4: | |
.cfi_def_cfa_offset 24 | |
pushq %r12 | |
.Lcfi5: | |
.cfi_def_cfa_offset 32 | |
pushq %rbx | |
.Lcfi6: | |
.cfi_def_cfa_offset 40 | |
subq $88, %rsp | |
.Lcfi7: | |
.cfi_def_cfa_offset 128 | |
.Lcfi8: | |
.cfi_offset %rbx, -40 | |
.Lcfi9: | |
.cfi_offset %r12, -32 | |
.Lcfi10: | |
.cfi_offset %r14, -24 | |
.Lcfi11: | |
.cfi_offset %r15, -16 | |
movq %rcx, %r15 | |
movq %rdx, %r14 | |
movq %rdi, %r12 | |
leaq 48(%rsp), %rdi | |
callq eval | |
movq 48(%rsp), %rsi | |
movq 80(%rsp), %rbx | |
leaq 8(%rsp), %rdi | |
movq %r15, %rdx | |
callq eval | |
movq 8(%rsp), %rax | |
cmpq 40(%rsp), %rbx | |
setg %cl | |
jg .LBB1_1 | |
# BB#2: # %upto.entry | |
testb %cl, %cl | |
jne .LBB1_5 | |
# BB#3: # %switch.bool_False.47 | |
incq %rbx | |
movq %rbx, 8(%rax) | |
movq $0, (%rax) | |
movq %r15, 48(%rax) | |
movq %rax, 40(%rax) | |
movq $1, 32(%rax) | |
leaq 32(%rax), %rcx | |
addq $64, %rax | |
movl $4, %edx | |
jmp .LBB1_4 | |
.LBB1_1: | |
movl $3, %edx | |
# implicit-def: %R14 | |
# implicit-def: %RCX | |
.LBB1_4: # %switch.exit.67 | |
movq %rdx, 8(%r12) | |
movq %rax, (%r12) | |
movq %r14, 16(%r12) | |
movq %rcx, 24(%r12) | |
movq %r12, %rax | |
addq $88, %rsp | |
popq %rbx | |
popq %r12 | |
popq %r14 | |
popq %r15 | |
retq | |
.LBB1_5: # %error_block | |
movl $666, %edi # imm = 0x29A | |
callq _prim_int_print | |
.Lfunc_end1: | |
.size upto, .Lfunc_end1-upto | |
.cfi_endproc | |
# -- End function | |
.globl sum # -- Begin function sum | |
.p2align 4, 0x90 | |
.type sum,@function | |
sum: # @sum | |
.cfi_startproc | |
# BB#0: # %sum.entry | |
pushq %r14 | |
.Lcfi12: | |
.cfi_def_cfa_offset 16 | |
pushq %rbx | |
.Lcfi13: | |
.cfi_def_cfa_offset 24 | |
subq $88, %rsp | |
.Lcfi14: | |
.cfi_def_cfa_offset 112 | |
.Lcfi15: | |
.cfi_offset %rbx, -24 | |
.Lcfi16: | |
.cfi_offset %r14, -16 | |
movq %rsi, %rax | |
movq %rdi, %rcx | |
leaq 8(%rsp), %rdi | |
movq %rcx, %rsi | |
movq %rax, %rdx | |
callq eval | |
movq 8(%rsp), %rax | |
movq 16(%rsp), %rcx | |
xorl %edx, %edx | |
cmpq $3, %rcx | |
je .LBB2_1 | |
# BB#2: # %sum.entry | |
cmpq $4, %rcx | |
jne .LBB2_5 | |
# BB#3: # %switch.CCons.89 | |
movq 32(%rsp), %r14 | |
movq 24(%rsp), %rdx | |
leaq 48(%rsp), %rdi | |
movq %rax, %rsi | |
callq eval | |
movq 48(%rsp), %rdi | |
movq 80(%rsp), %rbx | |
movq %r14, %rsi | |
callq sum | |
addq %rbx, %rcx | |
xorl %edx, %edx | |
jmp .LBB2_4 | |
.LBB2_1: | |
xorl %ecx, %ecx | |
.LBB2_4: # %switch.exit.99 | |
addq $88, %rsp | |
popq %rbx | |
popq %r14 | |
retq | |
.LBB2_5: # %error_block | |
movl $666, %edi # imm = 0x29A | |
callq _prim_int_print | |
.Lfunc_end2: | |
.size sum, .Lfunc_end2-sum | |
.cfi_endproc | |
# -- End function | |
.globl eval # -- Begin function eval | |
.p2align 4, 0x90 | |
.type eval,@function | |
eval: # @eval | |
.cfi_startproc | |
# BB#0: # %eval.entry | |
pushq %r14 | |
.Lcfi17: | |
.cfi_def_cfa_offset 16 | |
pushq %rbx | |
.Lcfi18: | |
.cfi_def_cfa_offset 24 | |
subq $40, %rsp | |
.Lcfi19: | |
.cfi_def_cfa_offset 64 | |
.Lcfi20: | |
.cfi_offset %rbx, -24 | |
.Lcfi21: | |
.cfi_offset %r14, -16 | |
movq %rdx, %r14 | |
movq %rdi, %rbx | |
movq (%r14), %rax | |
cmpq $1, %rax | |
jle .LBB3_4 | |
# BB#1: # %eval.entry | |
cmpq $2, %rax | |
je .LBB3_6 | |
# BB#2: # %eval.entry | |
cmpq $3, %rax | |
jne .LBB3_13 | |
# BB#3: # %tag.switch.CNil.123 | |
movq (%r14), %rdx | |
# implicit-def: %RAX | |
jmp .LBB3_7 | |
.LBB3_4: # %eval.entry | |
testq %rax, %rax | |
jne .LBB3_14 | |
# BB#5: # %tag.switch.CInt.116 | |
movq (%r14), %rdx | |
movq 8(%r14), %rdi | |
# implicit-def: %RAX | |
# implicit-def: %RCX | |
cmpq $1, %rdx | |
jg .LBB3_9 | |
.LBB3_16: # %tag.switch.exit.144 | |
testq %rdx, %rdx | |
je .LBB3_23 | |
# BB#17: # %tag.switch.exit.144 | |
cmpq $1, %rdx | |
jne .LBB3_24 | |
# BB#18: # %switch.Fupto.151 | |
leaq 8(%rsp), %rdi | |
movq %rax, %rdx | |
callq upto | |
movq 32(%rsp), %rcx | |
movq 24(%rsp), %rax | |
movq 8(%rsp), %rsi | |
movq 16(%rsp), %rdx | |
cmpq $3, %rdx | |
je .LBB3_21 | |
# BB#19: # %switch.Fupto.151 | |
cmpq $4, %rdx | |
jne .LBB3_24 | |
# BB#20: # %tag.switch.CCons.156 | |
movq %rdx, (%r14) | |
movq %rax, 8(%r14) | |
movq %rcx, 16(%r14) | |
jmp .LBB3_22 | |
.LBB3_6: # %tag.switch.Fsum.128 | |
movq (%r14), %rdx | |
movq 8(%r14), %rax | |
.LBB3_7: # %tag.switch.exit.144 | |
# implicit-def: %RCX | |
jmp .LBB3_8 | |
.LBB3_13: # %eval.entry | |
cmpq $4, %rax | |
je .LBB3_15 | |
jmp .LBB3_24 | |
.LBB3_14: # %eval.entry | |
cmpq $1, %rax | |
jne .LBB3_24 | |
.LBB3_15: # %tag.switch.Fupto.135 | |
movq 16(%r14), %rcx | |
movq (%r14), %rdx | |
movq 8(%r14), %rax | |
.LBB3_8: # %tag.switch.exit.144 | |
# implicit-def: %RDI | |
cmpq $1, %rdx | |
jle .LBB3_16 | |
.LBB3_9: # %tag.switch.exit.144 | |
cmpq $2, %rdx | |
je .LBB3_12 | |
# BB#10: # %tag.switch.exit.144 | |
cmpq $3, %rdx | |
je .LBB3_23 | |
# BB#11: # %tag.switch.exit.144 | |
cmpq $4, %rdx | |
je .LBB3_23 | |
.LBB3_24: # %error_block | |
movl $666, %edi # imm = 0x29A | |
callq _prim_int_print | |
.LBB3_12: # %switch.Fsum.170 | |
movq %rsi, %rdi | |
movq %rax, %rsi | |
callq sum | |
movq %rax, %rsi | |
movq %rcx, %rdi | |
movq %rdi, 8(%r14) | |
movq %rdx, (%r14) | |
# implicit-def: %RAX | |
# implicit-def: %RCX | |
jmp .LBB3_23 | |
.LBB3_21: # %tag.switch.CNil.164 | |
movq %rdx, (%r14) | |
.LBB3_22: # %switch.exit.176 | |
# implicit-def: %RDI | |
.LBB3_23: # %switch.exit.176 | |
movq %rdx, 8(%rbx) | |
movq %rsi, (%rbx) | |
movq %rax, 16(%rbx) | |
movq %rcx, 24(%rbx) | |
movq %rdi, 32(%rbx) | |
movq %rbx, %rax | |
addq $40, %rsp | |
popq %rbx | |
popq %r14 | |
retq | |
.Lfunc_end3: | |
.size eval, .Lfunc_end3-eval | |
.cfi_endproc | |
# -- End function | |
.section ".note.GNU-stack","",@progbits |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment