Target program decision tree Switch ({ var=AcRoot=t/86; dom=Int 0; }) = Leaf=VConstant:3 Switch ({ var=AcRoot=t/86; dom=Tag 0; }) = Switch ({ var=AcField(0 AcRoot=t/86); dom=Int [-inf; 0] [2; +inf] v Tag _; }) = Switch ({ var=AcField(0 AcRoot=t/86); dom=Int [-inf; 1] [3; +inf] v Tag _; }) = Leaf=VConstant:1, VConstant:0 Switch ({ var=AcField(0 AcRoot=t/86); dom=Int 2; }) = Leaf=VConstant:1, VConstant:2 Fallback=None Switch ({ var=AcField(0 AcRoot=t/86); dom=Int 1; }) = Leaf=VConstant:1, VConstant:1 Fallback=None Switch ({ var=AcRoot=t/86; dom=Tag 1; }) = Switch ({ var=AcField(0 AcRoot=t/86); dom=Int [-inf; -1] [1; +inf] v Tag _; }) = Leaf=VConstant:2, VConstant:1 Switch ({ var=AcField(0 AcRoot=t/86); dom=Int 0; }) = Leaf=VConstant:2, VConstant:0 Fallback=None Fallback=None Source program decision tree Switch AcRoot:{ Variant K2 -> Switch AcRoot.0:{ Bool false -> Leaf='Int 2 Bool false ' Bool true -> Leaf='Int 2 Bool true ' } Fallback: Unreachable Variant K1 -> Switch AcRoot.0:{ Int 2 -> Leaf='Int 1 Int 2 ' Int 1 -> Leaf='Int 1 Int 1 ' } Fallback: Leaf='Int 1 Unit ' Variant K3 -> Leaf='Int 3 ' } Fallback: Unreachable The two programs are equivalent.