]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/gimple-builder.c
PR fortran/95090 - ICE: identifier overflow
[thirdparty/gcc.git] / gcc / gimple-builder.c
CommitLineData
ff2a63a7 1/* Functions for high level gimple building routines.
8d9254fc 2 Copyright (C) 2013-2020 Free Software Foundation, Inc.
ff2a63a7
AM
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 3, or (at your option)
9any later version.
10
11GCC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
19
20#include "config.h"
21#include "system.h"
22#include "coretypes.h"
c7131fb2 23#include "backend.h"
ff2a63a7 24#include "tree.h"
c7131fb2 25#include "gimple.h"
d8a2d370 26#include "stringpool.h"
f90aa46c 27#include "tree-vrp.h"
442b4905 28#include "tree-ssanames.h"
ff2a63a7
AM
29
30
31/* Return the expression type to use based on the CODE and type of
32 the given operand OP. If the expression CODE is a comparison,
33 the returned type is boolean_type_node. Otherwise, it returns
34 the type of OP. */
35
36static tree
37get_expr_type (enum tree_code code, tree op)
38{
39 return (TREE_CODE_CLASS (code) == tcc_comparison)
40 ? boolean_type_node
41 : TREE_TYPE (op);
42}
43
44
45/* Build a new gimple assignment. The LHS of the assignment is a new
46 temporary whose type matches the given expression. MODE indicates
47 whether the LHS should be an SSA or a normal temporary. CODE is
48 the expression code for the RHS. OP1 is the first operand and VAL
49 is an integer value to be used as the second operand. */
50
538dd0b7 51gassign *
ff2a63a7
AM
52build_assign (enum tree_code code, tree op1, int val, tree lhs)
53{
54 tree op2 = build_int_cst (TREE_TYPE (op1), val);
55 if (lhs == NULL_TREE)
b731b390 56 lhs = make_ssa_name (get_expr_type (code, op1));
0d0e4a03 57 return gimple_build_assign (lhs, code, op1, op2);
ff2a63a7
AM
58}
59
538dd0b7 60gassign *
355fe088 61build_assign (enum tree_code code, gimple *g, int val, tree lhs )
ff2a63a7
AM
62{
63 return build_assign (code, gimple_assign_lhs (g), val, lhs);
64}
65
66
67/* Build and return a new GIMPLE assignment. The new assignment will
68 have the opcode CODE and operands OP1 and OP2. The type of the
69 expression on the RHS is inferred to be the type of OP1.
70
71 The LHS of the statement will be an SSA name or a GIMPLE temporary
72 in normal form depending on the type of builder invoking this
73 function. */
74
538dd0b7 75gassign *
ff2a63a7
AM
76build_assign (enum tree_code code, tree op1, tree op2, tree lhs)
77{
78 if (lhs == NULL_TREE)
b731b390 79 lhs = make_ssa_name (get_expr_type (code, op1));
0d0e4a03 80 return gimple_build_assign (lhs, code, op1, op2);
ff2a63a7
AM
81}
82
538dd0b7 83gassign *
355fe088 84build_assign (enum tree_code code, gimple *op1, tree op2, tree lhs)
ff2a63a7
AM
85{
86 return build_assign (code, gimple_assign_lhs (op1), op2, lhs);
87}
88
538dd0b7 89gassign *
355fe088 90build_assign (enum tree_code code, tree op1, gimple *op2, tree lhs)
ff2a63a7
AM
91{
92 return build_assign (code, op1, gimple_assign_lhs (op2), lhs);
93}
94
538dd0b7 95gassign *
355fe088 96build_assign (enum tree_code code, gimple *op1, gimple *op2, tree lhs)
ff2a63a7
AM
97{
98 return build_assign (code, gimple_assign_lhs (op1), gimple_assign_lhs (op2),
99 lhs);
100}
101
102
103/* Create and return a type cast assignment. This creates a NOP_EXPR
104 that converts OP to TO_TYPE. */
105
538dd0b7 106gassign *
ff2a63a7
AM
107build_type_cast (tree to_type, tree op, tree lhs)
108{
109 if (lhs == NULL_TREE)
b731b390 110 lhs = make_ssa_name (to_type);
0d0e4a03 111 return gimple_build_assign (lhs, NOP_EXPR, op);
ff2a63a7
AM
112}
113
538dd0b7 114gassign *
355fe088 115build_type_cast (tree to_type, gimple *op, tree lhs)
ff2a63a7
AM
116{
117 return build_type_cast (to_type, gimple_assign_lhs (op), lhs);
118}
119
120
121