Patchwork [PR50769] Fix ICE in phi_alternatives_equal.

login
register
mail settings
Submitter Tom de Vries
Date Nov. 2, 2011, 8:16 p.m.
Message ID <4EB1A51F.8060606@mentor.com>
Download mbox | patch
Permalink /patch/123340/
State New
Headers show

Comments

Tom de Vries - Nov. 2, 2011, 8:16 p.m.
On 10/19/2011 05:33 PM, Richard Guenther wrote:
> On Wed, Oct 19, 2011 at 10:23 AM, Tom de Vries <Tom_deVries@mentor.com> wrote:
>> Richard,
>>
>> For the example from the PR, -ftree-tail-merge discovers that blocks 6 and 7 are
>> equal, removes block 7 and redirects the outgoing edge of it's predecessor block
>> 11 to block 6.
>>
>> Block 6 contains a phi, which after redirecting the edge from block 11 looks
>> like this:
>> ...
>> .MEM_54 = PHI <.MEM_27(18), .MEM_26(17), (11)>
>> ...
>>
>> Since update_vops is false, TODO_update_ssa_only_virtuals will be run
>> and -ftree-tail-merge doesn't update the phi.
>>
>> However during cleanup_tree_cfg (which is done before updating the ssa),
>> phi_alternatives_equal is called which asserts that the phi arguments are defined.
>>
>> The patch fixes the ICE by setting the empty phi argument to .MEM.
>>
>> bootstrapped and reg-tested on x86_64.
>>
>> Ok for trunk?
> 
> Ok.
> 

Committed test-case.

Thanks,
- Tom

2011-11-02  Tom de Vries  <tom@codesourcery.com>

	PR tree-optimization/50769
	* gfortran.dg/pr50769.f90: New test.

Patch

Index: gcc/testsuite/gfortran.dg/pr50769.f90
===================================================================
--- /dev/null (new file)
+++ gcc/testsuite/gfortran.dg/pr50769.f90 (revision 0)
@@ -0,0 +1,30 @@ 
+! { dg-do compile }
+! { dg-options "-O2 -ftree-tail-merge -fno-delete-null-pointer-checks -fno-guess-branch-probability" }
+!
+! based on testsuite/gfortran.dg/alloc_comp_optional_1.f90,
+! which was contributed by David Kinniburgh <davidkinniburgh@yahoo.co.uk>
+!
+program test_iso
+  type ivs
+     character(LEN=1), dimension(:), allocatable :: chars
+  end type ivs
+  type(ivs) :: v_str
+  integer :: i
+  call foo(v_str, i)
+  if (v_str%chars(1) .ne. "a") call abort
+  if (i .ne. 0) call abort
+  call foo(flag = i)
+  if (i .ne. 1) call abort
+contains
+  subroutine foo (arg, flag)
+    type(ivs), optional, intent(out) :: arg
+    integer :: flag
+    if (present(arg)) then
+      arg = ivs([(char(i+96), i = 1,10)])
+      flag = 0
+    else
+      flag = 1
+    end if
+  end subroutine
+end
+