[llvm-commits] [dragonegg] r155481 - in /dragonegg/branches/release_31: 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:25:15 PDT 2012
Author: baldrick
Date: Tue Apr 24 15:25:15 2012
New Revision: 155481
URL: http://llvm.org/viewvc/llvm-project?rev=155481&view=rev
Log:
Port commit 155479 from mainline. Original commit message:
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/branches/release_31/test/validator/fortran/2012-04-24-CondExpr.f90
Modified:
dragonegg/branches/release_31/include/dragonegg/Internals.h
dragonegg/branches/release_31/src/Convert.cpp
Modified: dragonegg/branches/release_31/include/dragonegg/Internals.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/branches/release_31/include/dragonegg/Internals.h?rev=155481&r1=155480&r2=155481&view=diff
==============================================================================
--- dragonegg/branches/release_31/include/dragonegg/Internals.h (original)
+++ dragonegg/branches/release_31/include/dragonegg/Internals.h Tue Apr 24 15:25:15 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/branches/release_31/src/Convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/branches/release_31/src/Convert.cpp?rev=155481&r1=155480&r2=155481&view=diff
==============================================================================
--- dragonegg/branches/release_31/src/Convert.cpp (original)
+++ dragonegg/branches/release_31/src/Convert.cpp Tue Apr 24 15:25:15 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/branches/release_31/test/validator/fortran/2012-04-24-CondExpr.f90
URL: http://llvm.org/viewvc/llvm-project/dragonegg/branches/release_31/test/validator/fortran/2012-04-24-CondExpr.f90?rev=155481&view=auto
==============================================================================
--- dragonegg/branches/release_31/test/validator/fortran/2012-04-24-CondExpr.f90 (added)
+++ dragonegg/branches/release_31/test/validator/fortran/2012-04-24-CondExpr.f90 Tue Apr 24 15:25:15 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