diff --git a/spec/compiler/codegen/struct_spec.cr b/spec/compiler/codegen/struct_spec.cr
index 04b7391efc1e9c4a7938d7bdee79f3c5a84b57fe..cf8ec57b21ac3acf8b74c7839dcc464d37d7c7c4 100644
--- a/spec/compiler/codegen/struct_spec.cr
+++ b/spec/compiler/codegen/struct_spec.cr
@@ -276,4 +276,24 @@ describe "Code gen: struct" do
       g.x
       ").to_i.should eq(2)
   end
+
+  it "does phi of struct" do
+    run("
+      struct Foo
+        def initialize(@x)
+        end
+
+        def x
+          @x
+        end
+      end
+
+      x = if 1 == 2
+            Foo.new(2)
+          else
+            Foo.new(1)
+          end
+      x.x
+      ").to_i.should eq(1)
+  end
 end
diff --git a/src/compiler/crystal/codegen.cr b/src/compiler/crystal/codegen.cr
index 6569c58eb1b6370dccea1a46a32f0b73de665c3b..ddde08c62373bc3071ae6a183d63f42f787c2ffd 100644
--- a/src/compiler/crystal/codegen.cr
+++ b/src/compiler/crystal/codegen.cr
@@ -1053,7 +1053,7 @@ module Crystal
       end
 
       def add_value(block, type, value)
-        @codegen.assign_to_union(@union_ptr, @node.type, type, value)
+        @codegen.codegen_assign(@union_ptr, @node.type, type, value)
         @count += 1
       end
 
@@ -1096,7 +1096,7 @@ module Crystal
     def new_branched_block(node)
       exit_block = new_block("exit")
       node_type = node.type?
-      if node_type && node_type.union?
+      if node_type && (node_type.union? || node_type.struct_like?)
         UnionBranchedBlock.new node, exit_block, self
       else
         PhiBranchedBlock.new node, exit_block, self