+2011-08-19 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR middle-end/49721
+ * explow.c (convert_memory_address_addr_space): Also permute the
+ conversion and addition of constant for zero-extend.
+
2011-08-19 Joseph Myers <joseph@codesourcery.com>
* c-parser.c (c_parser_postfix_expression): Handle
case PLUS:
case MULT:
- /* For addition we can safely permute the conversion and addition
- operation if one operand is a constant and converting the constant
- does not change it or if one operand is a constant and we are
- using a ptr_extend instruction (POINTERS_EXTEND_UNSIGNED < 0).
+ /* FIXME: For addition, we used to permute the conversion and
+ addition operation only if one operand is a constant and
+ converting the constant does not change it or if one operand
+ is a constant and we are using a ptr_extend instruction
+ (POINTERS_EXTEND_UNSIGNED < 0) even if the resulting address
+ may overflow/underflow. We relax the condition to include
+ zero-extend (POINTERS_EXTEND_UNSIGNED > 0) since the other
+ parts of the compiler depend on it. See PR 49721.
+
We can always safely permute them if we are making the address
narrower. */
if (GET_MODE_SIZE (to_mode) < GET_MODE_SIZE (from_mode)
|| (GET_CODE (x) == PLUS
&& CONST_INT_P (XEXP (x, 1))
- && (XEXP (x, 1) == convert_memory_address_addr_space
- (to_mode, XEXP (x, 1), as)
- || POINTERS_EXTEND_UNSIGNED < 0)))
+ && (POINTERS_EXTEND_UNSIGNED != 0
+ || XEXP (x, 1) == convert_memory_address_addr_space
+ (to_mode, XEXP (x, 1), as))))
return gen_rtx_fmt_ee (GET_CODE (x), to_mode,
convert_memory_address_addr_space
(to_mode, XEXP (x, 0), as),
+2011-08-19 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR middle-end/49721
+ * gfortran.dg/pr49721-1.f: New.
+ * gfortran.fortran-torture/compile/pr49721-1.f: Likewise.
+
2011-08-19 Joseph Myers <joseph@codesourcery.com>
* gcc.dg/builtin-complex-err-1.c, gcc.dg/builtin-complex-err-2.c,
--- /dev/null
+! PR middle-end/49721
+! { dg-do compile }
+! { dg-options "-O3 -funroll-loops" }
+
+ subroutine midbloc6(c,a2,a2i,q)
+ parameter (ndim2=6)
+ parameter (ndim=3)
+ dimension ri(ndim2),cr(ndim2,ndim2),xj(ndim2,ndim2),q(*)
+ @,sai(ndim2,ndim2),cm(ndim2,ndim2),w(ndim2,ndim2)
+ dimension vr(ndim2,ndim2),vi(ndim2,ndim2),s1(ndim2,ndim2),p(ndim)
+ dimension xq(6),qb(2),qc(2),ifl(6),iplane(3)
+ save
+ call eig66(cr,rr,ri,vr,vi)
+ xq(i)=asin(ri(i))/x2pi
+ i9=6
+ qb(1)=q(1)/x2pi
+ do 180 i=1,2
+ do 170 j=1,6
+ 120 if(xq(j)) 130,190,140
+ 130 if(qb(i)-0.5d0) 160,150,150
+ 140 if(qb(i)-0.5d0) 150,150,160
+ 150 continue
+ tst=abs(abs(qb(i))-abs(xq(j)))
+ 160 continue
+ 170 continue
+ iplane(i)=k
+ 180 continue
+ 190 continue
+ n1=iplane(3)
+ if(i9.eq.6) then
+ z=vr(1,n1)*vi(2,n1)-vr(2,n1)*vi(1,n1)+vr(3,n1)*vi(4,n1)-vr(4,n1)
+ endif
+ sai(6,i)=vi(i,n1)/z
+ call dacond6(a2,zero)
+ end
--- /dev/null
+ PARAMETER( LM=7 )
+ PARAMETER( NM=2+2**LM, NV=NM**3 )
+ PARAMETER( NR = (8*(NM**3+NM**2+5*NM-23+7*LM))/7 )
+ COMMON /X/ U, V, R, A
+ REAL*8 U(NR),V(NV),R(NR),A(0:3)
+ DO 20 IT=1,NIT
+ CALL RESID(U,V,R,N,A)
+ 20 CONTINUE
+ END