[llvm-commits] [dragonegg] r155479 - in /dragonegg/trunk: include/dragonegg/Internals.h src/Convert.cpp test/validator/fortran/2012-04-24-CondExpr.f90

Duncan Sands baldrick at free.fr
Tue Apr 24 13:14:03 PDT 2012


Author: baldrick
Date: Tue Apr 24 15:14:02 2012
New Revision: 155479

URL: http://llvm.org/viewvc/llvm-project?rev=155479&view=rev
Log:
In gcc-4.7, COND_EXPR has been changed from a gimple single assign rhs to a
(more logical) ternary assign rhs.  This fixes PR12609.

Added:
    dragonegg/trunk/test/validator/fortran/2012-04-24-CondExpr.f90
Modified:
    dragonegg/trunk/include/dragonegg/Internals.h
    dragonegg/trunk/src/Convert.cpp

Modified: dragonegg/trunk/include/dragonegg/Internals.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/include/dragonegg/Internals.h?rev=155479&r1=155478&r2=155479&view=diff
==============================================================================
--- dragonegg/trunk/include/dragonegg/Internals.h (original)
+++ dragonegg/trunk/include/dragonegg/Internals.h Tue Apr 24 15:14:02 2012
@@ -570,10 +570,15 @@
   Value *EmitReg_WIDEN_MULT_EXPR(tree_node *type, tree_node *op0,
                                  tree_node *op1);
 
+  // Ternary expressions.
+  Value *EmitReg_CondExpr(tree_node *op0, tree_node *op1, tree_node *op2);
+
   Value *EmitLoadOfLValue(tree_node *exp);
   Value *EmitOBJ_TYPE_REF(tree_node *exp);
   Value *EmitADDR_EXPR(tree_node *exp);
+#if (GCC_MINOR < 7)
   Value *EmitCondExpr(tree_node *exp);
+#endif
   Value *EmitCallOf(Value *Callee, gimple_statement_d *stmt,
                     const MemRef *DestLoc, const AttrListPtr &PAL);
   CallInst *EmitSimpleCall(StringRef CalleeName, tree_node *ret_type,

Modified: dragonegg/trunk/src/Convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/Convert.cpp?rev=155479&r1=155478&r2=155479&view=diff
==============================================================================
--- dragonegg/trunk/src/Convert.cpp (original)
+++ dragonegg/trunk/src/Convert.cpp Tue Apr 24 15:14:02 2012
@@ -2816,30 +2816,14 @@
   return Builder.CreateBitCast(LV.Ptr, getRegType(TREE_TYPE(exp)));
 }
 
+#if (GCC_MINOR < 7)
 Value *TreeToLLVM::EmitCondExpr(tree exp) {
-  // Emit the condition.  It may not be in SSA form, but if not then it is a
-  // comparison.
-  // COND_EXPR_COND and friends do not work for VEC_COND_EXPR, which is also
-  // handled here, which is why the tree operands are accessed directly.
-  tree cond = TREE_OPERAND(exp, 0);
-  Value *CondVal = COMPARISON_CLASS_P(cond) ?
-    EmitCompare(TREE_OPERAND(cond, 0), TREE_OPERAND(cond, 1), TREE_CODE(cond)) :
-    EmitRegister(cond);
-
-  // Ensure the condition has i1 type.
-  if (!CondVal->getType()->getScalarType()->isIntegerTy(1))
-    CondVal = Builder.CreateICmpNE(CondVal,
-                                   Constant::getNullValue(CondVal->getType()));
-
-  // Emit the true and false values.
-  Value *TrueVal = EmitRegister(TREE_OPERAND(exp, 1));
-  Value *FalseVal = EmitRegister(TREE_OPERAND(exp, 2));
-  FalseVal = TriviallyTypeConvert(FalseVal, TrueVal->getType());
-
-  // Select the value to use based on the condition.
-  Value *Result = Builder.CreateSelect(CondVal, TrueVal, FalseVal);
-  return TriviallyTypeConvert(Result, getRegType(TREE_TYPE(exp)));
+  return TriviallyTypeConvert(EmitReg_CondExpr(TREE_OPERAND(exp, 0),
+                                               TREE_OPERAND(exp, 1),
+                                               TREE_OPERAND(exp, 2)),
+                              getRegType(TREE_TYPE(exp)));
 }
+#endif
 
 Value *TreeToLLVM::EmitOBJ_TYPE_REF(tree exp) {
   return Builder.CreateBitCast(EmitRegister(OBJ_TYPE_REF_EXPR(exp)),
@@ -7183,6 +7167,31 @@
   return CastFromSameSizeInteger(Res, getRegType(TREE_TYPE(op0)));
 }
 
+/// EmitReg_CondExpr - Handle COND_EXPR and VEC_COND_EXPR gimple assign right-
+/// hand sides.
+Value *TreeToLLVM::EmitReg_CondExpr(tree op0, tree op1, tree op2) {
+  // The condition is either a comparison or an SSA register.  Note that the
+  // reason for accessing tree operands directly rather than taking advantage
+  // of COND_EXPR_COND and friends is that the latter fail for VEC_COND_EXPR,
+  // which is also handled here.
+  Value *CondVal = COMPARISON_CLASS_P(op0) ?
+    EmitCompare(TREE_OPERAND(op0, 0), TREE_OPERAND(op0, 1), TREE_CODE(op0)) :
+    EmitRegister(op0);
+
+  // Ensure the condition has i1 type.
+  if (!CondVal->getType()->getScalarType()->isIntegerTy(1))
+    CondVal = Builder.CreateICmpNE(CondVal,
+                                   Constant::getNullValue(CondVal->getType()));
+
+  // Emit the true and false values.
+  Value *TrueVal = EmitRegister(op1);
+  Value *FalseVal = EmitRegister(op2);
+  FalseVal = TriviallyTypeConvert(FalseVal, TrueVal->getType());
+
+  // Select the value to use based on the condition.
+  return Builder.CreateSelect(CondVal, TrueVal, FalseVal);
+}
+
 Value *TreeToLLVM::EmitReg_COMPLEX_EXPR(tree op0, tree op1) {
   return CreateComplex(EmitRegister(op0), EmitRegister(op1));
 }
@@ -8523,6 +8532,7 @@
   tree_code code = gimple_assign_rhs_code(stmt);
   tree rhs1 = gimple_assign_rhs1(stmt);
   tree rhs2 = gimple_assign_rhs2(stmt);
+  tree rhs3 = gimple_assign_rhs3(stmt);
 
   Value *RHS = 0;
   switch (code) {
@@ -8668,6 +8678,11 @@
     RHS = EmitReg_VEC_WIDEN_MULT_LO_EXPR(type, rhs1, rhs2); break;
   case WIDEN_MULT_EXPR:
     RHS = EmitReg_WIDEN_MULT_EXPR(type, rhs1, rhs2); break;
+
+  // Ternary expressions.
+  case COND_EXPR:
+  case VEC_COND_EXPR:
+    RHS = EmitReg_CondExpr(rhs1, rhs2, rhs3); break;
   }
 
   return TriviallyTypeConvert(RHS, getRegType(type));
@@ -8684,8 +8699,10 @@
 
   // Expressions (tcc_expression).
   case ADDR_EXPR:     return EmitADDR_EXPR(rhs);
+#if (GCC_MINOR < 7)
   case COND_EXPR:
   case VEC_COND_EXPR: return EmitCondExpr(rhs);
+#endif
   case OBJ_TYPE_REF:  return EmitOBJ_TYPE_REF(rhs);
 
   // Exceptional (tcc_exceptional).

Added: dragonegg/trunk/test/validator/fortran/2012-04-24-CondExpr.f90
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/test/validator/fortran/2012-04-24-CondExpr.f90?rev=155479&view=auto
==============================================================================
--- dragonegg/trunk/test/validator/fortran/2012-04-24-CondExpr.f90 (added)
+++ dragonegg/trunk/test/validator/fortran/2012-04-24-CondExpr.f90 Tue Apr 24 15:14:02 2012
@@ -0,0 +1,24 @@
+! RUN: %dragonegg -S %s -O3 -fplugin-arg-dragonegg-enable-gcc-optzns
+! PR12609
+      MODULE MAIN1
+      INTEGER :: IHOUR , ISEAS , IREC , IGRP , NUMREC , NUMGRP
+      REAL , ALLOCATABLE :: SHVALS(:,:,:,:,:)
+      INTEGER :: NSEAHR(4,24) , NSEACM(4,24)
+      END
+
+      PROGRAM SHAVE
+      USE MAIN1
+      REAL :: SNUM
+      DO ISEAS = 1 , 4
+         DO IHOUR = 1 , 24
+            SNUM = NSEAHR(ISEAS,IHOUR) - NSEACM(ISEAS,IHOUR)
+            DO IGRP = 1 , NUMGRP
+               DO IREC = 1 , NUMREC
+                  SHVALS(IREC,IGRP,ISEAS,IHOUR,1) = (1./SNUM)           &
+     &               *SHVALS(IREC,IGRP,ISEAS,IHOUR,1)
+               ENDDO
+            ENDDO
+         ENDDO
+      ENDDO
+      CONTINUE
+      END





More information about the llvm-commits mailing list