[llvm-commits] [dragonegg] r168870 - in /dragonegg/branches/release_32: src/Convert.cpp test/validator/fortran/2012-11-29-VectorCstCast.f

Duncan Sands baldrick at free.fr
Thu Nov 29 03:43:30 PST 2012


Author: baldrick
Date: Thu Nov 29 05:43:30 2012
New Revision: 168870

URL: http://llvm.org/viewvc/llvm-project?rev=168870&view=rev
Log:
Backport the fix for PR13561 (r168868) to the 3.2 branch.  Original commit
message:

Fix PR13561, a crash when the GCC vectorizer is turned on.  What happens here is
that a vector with type <2 x i64> is being initialized with <i1 1, i1 1>, a type
mismatch.  This is coming directly from GCC, which is pretty relaxed about types
in general, expecting implicit casts somewhat like in C.  Fix this by turning
GCC's implicit type cast into an explicit LLVM one.

Added:
    dragonegg/branches/release_32/test/validator/fortran/2012-11-29-VectorCstCast.f
Modified:
    dragonegg/branches/release_32/src/Convert.cpp

Modified: dragonegg/branches/release_32/src/Convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/branches/release_32/src/Convert.cpp?rev=168870&r1=168869&r2=168870&view=diff
==============================================================================
--- dragonegg/branches/release_32/src/Convert.cpp (original)
+++ dragonegg/branches/release_32/src/Convert.cpp Thu Nov 29 05:43:30 2012
@@ -6607,7 +6607,10 @@
     return getDefaultValue(getRegType(TREE_TYPE(reg)));
 
   // Convert the elements.
+  VectorType *ResTy = cast<VectorType>(getRegType(TREE_TYPE(reg)));
+  Type *ResEltTy = ResTy->getElementType();
   SmallVector<Constant*, 16> Elts;
+  bool DstIsSigned = !TYPE_UNSIGNED(TREE_TYPE(TREE_TYPE(reg)));
   for (tree elt = TREE_VECTOR_CST_ELTS(reg); elt; elt = TREE_CHAIN(elt)) {
     Constant *Elt = EmitRegisterConstant(TREE_VALUE(elt));
     // LLVM does not support vectors of pointers, so turn any pointers into
@@ -6616,6 +6619,13 @@
       Type *IntTy = getDataLayout().getIntPtrType(Elt->getType());
       Elt = Builder.getFolder().CreatePtrToInt(Elt, IntTy);
     }
+    // Make any implicit type conversions explicit.
+    if (Elt->getType() != ResEltTy) {
+      bool SrcIsSigned = !TYPE_UNSIGNED(TREE_TYPE(TREE_VALUE(elt)));
+      Instruction::CastOps opcode =
+        CastInst::getCastOpcode(Elt, SrcIsSigned, ResEltTy, DstIsSigned);
+      Elt = TheFolder->CreateCast(opcode, Elt, ResEltTy);
+    }
     Elts.push_back(Elt);
   }
 

Added: dragonegg/branches/release_32/test/validator/fortran/2012-11-29-VectorCstCast.f
URL: http://llvm.org/viewvc/llvm-project/dragonegg/branches/release_32/test/validator/fortran/2012-11-29-VectorCstCast.f?rev=168870&view=auto
==============================================================================
--- dragonegg/branches/release_32/test/validator/fortran/2012-11-29-VectorCstCast.f (added)
+++ dragonegg/branches/release_32/test/validator/fortran/2012-11-29-VectorCstCast.f Thu Nov 29 05:43:30 2012
@@ -0,0 +1,29 @@
+C RUN: %dragonegg -S %s -o - -O1 -ftree-vectorize -fplugin-arg-dragonegg-enable-gcc-optzns -fdefault-integer-8 -ffixed-line-length-120 -fno-second-underscore
+C PR13561
+
+      SUBROUTINE scratc(hpspnp)
+      IMPLICIT NONE
+
+      INTEGER HEAPDM
+      PARAMETER (HEAPDM=2)
+      INTEGER HEAP(HEAPDM)
+      COMMON // HEAP
+
+      integer hpspnp(*)
+      INTEGER N
+
+      INTEGER p_UPHBLS
+      COMMON p_UPHBLS
+
+      LOGICAL UPBOND, UPANGL, UPDIHE, UPIMPR
+      COMMON  /UPCOD/ UPBOND, UPANGL, UPDIHE, UPIMPR
+
+      UPBOND=.TRUE.
+      UPANGL=.TRUE.
+      UPDIHE=.TRUE.
+      UPIMPR=.TRUE.
+      DO N=1,10
+         call assign_logical(heap(p_UPHBLS),N,.TRUE.)
+      ENDDO
+      RETURN
+      END





More information about the llvm-commits mailing list