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

Duncan Sands baldrick at free.fr
Thu Nov 29 03:01:26 PST 2012


Author: baldrick
Date: Thu Nov 29 05:01:25 2012
New Revision: 168868

URL: http://llvm.org/viewvc/llvm-project?rev=168868&view=rev
Log:
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/trunk/test/validator/fortran/2012-11-29-VectorCstCast.f
Modified:
    dragonegg/trunk/src/Convert.cpp

Modified: dragonegg/trunk/src/Convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/Convert.cpp?rev=168868&r1=168867&r2=168868&view=diff
==============================================================================
--- dragonegg/trunk/src/Convert.cpp (original)
+++ dragonegg/trunk/src/Convert.cpp Thu Nov 29 05:01:25 2012
@@ -6597,14 +6597,26 @@
     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;
-  for (tree elt = TREE_VECTOR_CST_ELTS(reg); elt; elt = TREE_CHAIN(elt))
-    Elts.push_back(EmitRegisterConstant(TREE_VALUE(elt)));
+  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));
+    // 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);
+  }
 
   // If there weren't enough elements then set the rest of the vector to the
   // default value.
   if (Elts.size() < TYPE_VECTOR_SUBPARTS(TREE_TYPE(reg))) {
-    Constant *Default = getDefaultValue(Elts[0]->getType());
+    Constant *Default = getDefaultValue(ResEltTy);
     Elts.append(TYPE_VECTOR_SUBPARTS(TREE_TYPE(reg)) - Elts.size(), Default);
   }
 

Added: dragonegg/trunk/test/validator/fortran/2012-11-29-VectorCstCast.f
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/test/validator/fortran/2012-11-29-VectorCstCast.f?rev=168868&view=auto
==============================================================================
--- dragonegg/trunk/test/validator/fortran/2012-11-29-VectorCstCast.f (added)
+++ dragonegg/trunk/test/validator/fortran/2012-11-29-VectorCstCast.f Thu Nov 29 05:01:25 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