Hi, Can a gatekeeper please review the attached patch that: 1. Fixes a bug in GVN which was not able to differentiate scalar and vector constant. For example, 2.1 and <2.1, 2.1> would get the same value number and this bug could cause run time as well compile-time problems. This fix updates: osprey/be/opt/opt_vnfre.cxx osprey/be/opt/opt_etable.cxx osprey/be/opt/opt_etable.h osprey/be/opt/opt_vn.cxx osprey/be/opt/opt_vn_expr.h osprey/be/opt/opt_vn_expr.cxx osprey/be/opt/opt_vn_expr_taxonomy.h
2. Fixes an alignment bug. The problem can be explained by the following f90
snippet.
Statemnt 22 (which is a loop with 3 iterations) is vectorized. Neither
input%field2%arr nor
input%field1%arr is aligned properly. However, compiler generates aligned load
instructions for
them causing segmentation fault at runtime.
1 module foobar
2 implicit none
3
4 type t1
5 integer :: pad1
6 integer :: pad2
7 integer :: pad3
8 real*8, dimension(3) :: arr
9 end type t1;
10
11 type t2
12 type(t1) :: field1
13 type(t1) :: field2
14 end type t2;
15
16 contains
17
18 subroutine foo(input)
19 type(t2) :: input
20 real*8, dimension(3) :: arr2;
21
22 arr2 = input%field2%arr - input%field1%arr
23 call bar (arr2);
24 end subroutine foo
25
26 end module foobar
This fix updates:
osprey/be/cg/whirl2ops.cxx
3. Fixes a problem illustrated with the snippet shown below built with -O3.
<mydata> is accessed using aligned SIMD instruction no matter this snippet
is built with -m32 or -m64. With -m32, the SP is not guaranteed to land at
16-byte boundary, therefore we are not able to *statically* allocate a local
var at 16-byte boundary.
------------------------------
void foo (void) {
int i, mydata[4];
for (i= 0; i < 4; i++)
mydata[i] = 1;
extern void bar (int*);
bar (&mydata);
}
-------------------------------
The root cause is that with -m32, stack frame is 8-byte aligned, and
therefore local variables cannot be statically aligned at a boundary more
stringent than 8-byte alingment (unless one use alloca() to allocate
space for local var). Using aligned SSE instructions to load/store
local arrays will incur segmentation fault.
There are two problems fixed by the change:
i) Register allocation doesn't respect a variable's alignment when
it spills/restores to/from its home location.
ii) local variables should not have more stringent alignment than stack frame.
This fix updates:
osprey/be/cg/whirl2ops.cxx
osprey/be/cg/cg_spill.cxx
osprey/be/com/data_layout.cxx
Thanks.
Pallavi
gvn_align_bugfixes.p
Description: gvn_align_bugfixes.p
------------------------------------------------------------------------------ Benefiting from Server Virtualization: Beyond Initial Workload Consolidation -- Increasing the use of server virtualization is a top priority.Virtualization can reduce costs, simplify management, and improve application availability and disaster protection. Learn more about boosting the value of server virtualization. http://p.sf.net/sfu/vmware-sfdev2dev
_______________________________________________ Open64-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/open64-devel
