00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #ifdef _KEEP_RCS_ID
00054
00055 #endif
00056
00057
00058
00059
00060 #include "config_opt.h"
00061 extern BOOL WOPT_Enable_Goto;
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 BOOL Show_OPT_Warnings = TRUE;
00072
00073
00074 OPTION_LIST *Alias_Option = NULL;
00075 BOOL Alias_Pointer_Parms = TRUE;
00076 BOOL Alias_Pointer_Cray = FALSE;
00077 BOOL Alias_Pointer_Types = FALSE;
00078 BOOL Alias_Not_In_Union = FALSE;
00079 BOOL Alias_Pointer_Strongly_Typed = FALSE;
00080 BOOL Alias_Pointer_Named_Data = FALSE;
00081 BOOL Alias_Pointer_Restricted = FALSE;
00082 BOOL Alias_Pointer_Disjoint = FALSE;
00083 BOOL Alias_Common_Scalar = FALSE;
00084
00085
00086
00087
00088 static BOOL Alias_Pointer_Cckr = FALSE;
00089 static BOOL Alias_Pointer_Types_Set = FALSE;
00090 static BOOL Alias_Not_In_Union_Set = FALSE;
00091 BOOL Alias_F90_Pointer_Unaliased = FALSE;
00092
00093
00094 BOOL Align_Object = TRUE;
00095 BOOL Align_Padding = FALSE;
00096
00097
00098 #ifdef BACK_END
00099 # define ALIGN_INSTS &Align_Instructions
00100 #else
00101 # define ALIGN_INSTS &Ignore_Int
00102 #endif
00103
00104
00105 BOOL Enable_Cfold_Aggressive = FALSE;
00106 static BOOL Cfold_Aggr_Set = FALSE;
00107 BOOL Enable_Cfold_Reassociate = FALSE;
00108 static BOOL Cfold_Reassoc_Set = FALSE;
00109 BOOL Enable_Cfold_Intrinsics = FALSE;
00110 BOOL Cfold_Intrinsics_Set = FALSE;
00111 BOOL CIS_Allowed = TRUE;
00112 static BOOL CIS_Set = FALSE;
00113 BOOL Enable_CVT_Opt= FALSE;
00114 BOOL Enable_CVT_Opt_Set= FALSE;
00115 BOOL Optimize_CVTL_Exp = FALSE;
00116 BOOL Div_Split_Allowed = FALSE;
00117 static BOOL Div_Split_Set = FALSE;
00118 BOOL Fast_Exp_Allowed = FALSE;
00119 static BOOL Fast_Exp_Set = FALSE;
00120 BOOL Fast_IO_Allowed = FALSE;
00121 static BOOL Fast_IO_Set = FALSE;
00122 BOOL Fast_Sqrt_Allowed = FALSE;
00123 static BOOL Fast_Sqrt_Set = FALSE;
00124 BOOL Rsqrt_Allowed = FALSE;
00125 static BOOL Rsqrt_Set = FALSE;
00126 BOOL Recip_Allowed;
00127 static BOOL Recip_Set = FALSE;
00128 BOOL Simp_Fold_Unsigned_Relops = FALSE;
00129 static BOOL Simp_Fold_Unsigned_Relops_Set = FALSE;
00130
00131 BOOL Simp_Unsafe_Relops = FALSE;
00132 static BOOL Simp_Unsafe_Relops_Set = FALSE;
00133 BOOL Simp_Canonicalize = TRUE;
00134 BOOL Enable_WN_Simp = TRUE;
00135 static BOOL Enable_WN_Simp_Set=FALSE;
00136 BOOL GCM_Eager_Null_Ptr_Deref = FALSE;
00137
00138
00139 BOOL GCM_Eager_Null_Ptr_Deref_Set=FALSE;
00140 BOOL GCM_Speculative_Ptr_Deref= TRUE;
00141
00142
00143 BOOL GCM_Speculative_Ptr_Deref_Set=FALSE;
00144
00145
00146 #define DEFAULT_OLIMIT 3000
00147 #define DEFAULT_O3_OLIMIT 4000
00148 #define MAX_OLIMIT INT32_MAX
00149 INT32 Olimit = DEFAULT_OLIMIT;
00150 static BOOL Olimit_Set = FALSE;
00151 BOOL Olimit_opt = FALSE;
00152 static BOOL Olimit_opt_Set = FALSE;
00153
00154
00155 static OPTION_LIST *Opt_Skip = NULL;
00156 SKIPLIST *Optimization_Skip_List = NULL;
00157 static OPTION_LIST *Region_Skip = NULL;
00158 SKIPLIST *Region_Skip_List = NULL;
00159
00160
00161 char *Ofast = NULL;
00162 BOOL OPT_Pad_Common = FALSE;
00163 BOOL OPT_Reorg_Common = FALSE;
00164 BOOL OPT_Reorg_Common_Set = FALSE;
00165 BOOL OPT_Unroll_Analysis = TRUE;
00166 BOOL OPT_Unroll_Analysis_Set = FALSE;
00167 BOOL OPT_Lower_Speculate = FALSE;
00168 BOOL OPT_Lower_Treeheight = FALSE;
00169 static BOOL OPT_Lower_Treeheight_Set = FALSE;
00170 BOOL OPT_Inline_Divide = TRUE;
00171 static BOOL OPT_Inline_Divide_Set = FALSE;
00172 BOOL OPT_Space = FALSE;
00173 BOOL Early_MP_Processing = FALSE;
00174 BOOL Implied_Do_Io_Opt = TRUE;
00175 BOOL Cray_Ivdep=FALSE;
00176 BOOL Liberal_Ivdep=FALSE;
00177 BOOL Inhibit_EH_opt=FALSE;
00178 BOOL Allow_wrap_around_opt = TRUE;
00179 static BOOL Allow_wrap_around_opt_Set = FALSE;
00180 BOOL Enable_GOT_Call_Conversion = FALSE;
00181 static BOOL Enable_GOT_Call_overridden = FALSE;
00182 BOOL OPT_recompute_addr_flags = FALSE;
00183 BOOL OPT_IPA_addr_analysis = TRUE;
00184 BOOL Delay_U64_Lowering = TRUE;
00185 BOOL OPT_shared_memory = TRUE;
00186
00187 BOOL Section_For_Each_Function = FALSE;
00188 BOOL Inline_Intrinsics_Early=FALSE;
00189 BOOL Enable_extract_compose=TRUE;
00190
00191 #ifdef __linux__
00192 BOOL Enable_WFE_DFE = FALSE;
00193 #endif
00194
00195
00196
00197 INT32 Instrumentation_Phase_Num = 0;
00198 BOOL Instrumentation_Enabled = FALSE;
00199 UINT32 Instrumentation_Actions = 0;
00200 BOOL Instrumentation_Unique_Output = FALSE;
00201 OPTION_LIST *Feedback_Option = NULL;
00202
00203
00204 static BOOL Fprop_Limit_Set = FALSE;
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 static OPTION_DESC Options_OPT[] = {
00215 { OVK_BOOL, OV_VISIBLE, TRUE, "warning", "warn",
00216 0, 0, 0, &Show_OPT_Warnings, NULL,
00217 "Control interpretation of possible variable aliasing" },
00218
00219 { OVK_LIST, OV_VISIBLE, TRUE, "alias", "alia",
00220 0, 0, 0, &Alias_Option, NULL,
00221 "Control interpretation of possible variable aliasing" },
00222
00223 { OVK_INT32, OV_SHY, TRUE, "align_instructions", "align_i",
00224 16, 0, 1024, ALIGN_INSTS, NULL,
00225 "Align subprogram entries and loops by given byte count" },
00226
00227 { OVK_BOOL, OV_INTERNAL, TRUE, "align_object", "align_o",
00228 0, 0, 0, &Align_Object, NULL,
00229 "Allow realignment of objects to improve memory accesses" },
00230
00231 { OVK_BOOL, OV_INTERNAL, TRUE, "align_padding", "align_p",
00232 0, 0, 0, &Align_Padding, NULL,
00233 "Allow padding of objects to improve memory alignment" },
00234
00235 { OVK_INT32, OV_INTERNAL, TRUE, "bblength", "bb",
00236 DEF_BBLENGTH, MIN_BBLENGTH, MAX_BBLENGTH, &Split_BB_Length, NULL,
00237 "Restrict BB length by splitting longer BBs" },
00238
00239 { OVK_BOOL, OV_VISIBLE, TRUE, "cis", "cis",
00240 0, 0, 0, &CIS_Allowed, &CIS_Set,
00241 "Convert sin/cos pairs into a single call" },
00242
00243 { OVK_INT32, OV_VISIBLE, TRUE, "const_copy_limit", "const",
00244 DEF_CONST_COPY_TN_CNT, 0, INT32_MAX,&Const_Copy_TN_CNT, NULL,
00245 "Avoid constant/copy propagation if there are more than n expressions" },
00246
00247 { OVK_BOOL, OV_VISIBLE, TRUE, "cray_ivdep", "cray_ivdep",
00248 0, 0, 0, &Cray_Ivdep, NULL,
00249 "IVDEP pragma/directive break parallelism-inhibiting dependencies" },
00250
00251 { OVK_BOOL, OV_INTERNAL, TRUE, "cvt", "cvt",
00252 0, 0, 0, &Enable_CVT_Opt, &Enable_CVT_Opt_Set,
00253 "Optimize conversion operators" },
00254
00255 { OVK_BOOL, OV_VISIBLE, TRUE, "div_split", "div_split",
00256 0, 0, 0, &Div_Split_Allowed, &Div_Split_Set ,
00257 "Allow splitting of a/b into a*recip(b)" },
00258
00259 { OVK_BOOL, OV_INTERNAL, TRUE, "early_mp", "early_mp",
00260 0, 0, 0, &Early_MP_Processing, NULL,
00261 "Lower before LNO" },
00262
00263 { OVK_BOOL, OV_VISIBLE, TRUE, "fast_bit_intrinsics", "fast_bit",
00264 0, 0, 0, &Fast_Bit_Allowed, &Fast_Bit_Set,
00265 "Don't check bit count range for Fortran bit intrinsics" },
00266
00267 { OVK_BOOL, OV_VISIBLE, TRUE, "fast_complex", "fast_co",
00268 0, 0, 0, &Fast_Complex_Allowed, &Fast_Complex_Set,
00269 "Use fast algorithms with limited domains for complex norm and divide" },
00270
00271 { OVK_BOOL, OV_VISIBLE, TRUE, "fast_exp", "fast_ex",
00272 0, 0, 0, &Fast_Exp_Allowed, &Fast_Exp_Set,
00273 "Use multiplication and square root for exp() where faster" },
00274
00275 { OVK_BOOL, OV_VISIBLE, TRUE, "fast_io", "fast_io",
00276 0, 0, 0, &Fast_IO_Allowed, &Fast_IO_Set,
00277 "Inline some C I/O routines if __INLINE_INTRINSICS is defined" },
00278
00279 { OVK_BOOL, OV_VISIBLE, TRUE, "fast_nint", "fast_nint",
00280 0, 0, 0, &Fast_NINT_Allowed, &Fast_NINT_Set,
00281 "Use IEEE rounding instead of Fortran rounding for NINT intrinsics" },
00282
00283 { OVK_BOOL, OV_VISIBLE, TRUE, "fast_sqrt", "fast_sq",
00284 0, 0, 0, &Fast_Sqrt_Allowed, &Fast_Sqrt_Set,
00285 "May use x*rsqrt(x) for sqrt(x) on machines where faster" },
00286
00287 { OVK_BOOL, OV_VISIBLE, TRUE, "fast_trunc", "fast_trunc",
00288 0, 0, 0, &Fast_trunc_Allowed, &Fast_trunc_Set,
00289 "Inline NINT and related intrinsics with limited-domain algorithm" },
00290
00291 { OVK_BOOL, OV_SHY, TRUE, "fold_aggressive", "fold_ag",
00292 0, 0, 0, &Enable_Cfold_Aggressive, &Cfold_Aggr_Set,
00293 "Allow aggressive expression folding optimizations" },
00294
00295 { OVK_BOOL, OV_SHY, TRUE, "fold_intrinsics", "fold_i",
00296 0, 0, 0, &Enable_Cfold_Intrinsics, &Cfold_Intrinsics_Set,
00297 "Allow expression folding of Fortran intrinsic calls" },
00298
00299 { OVK_BOOL, OV_VISIBLE, TRUE, "fold_reassociate", "fold_r",
00300 0, 0, 0, &Enable_Cfold_Reassociate, &Cfold_Reassoc_Set,
00301 "Allow optimizations which reassociate floating point operators" },
00302
00303 { OVK_BOOL, OV_VISIBLE, TRUE, "fold_unsafe_relops", "fold_unsafe_relops",
00304 0, 0, 0, &Simp_Unsafe_Relops, &Simp_Unsafe_Relops_Set,
00305 "Allow relational operator folding which may cause integer overflow" },
00306
00307 { OVK_BOOL, OV_VISIBLE, TRUE, "fold_unsigned_relops", "fold_unsigned",
00308 0, 0, 0, &Simp_Fold_Unsigned_Relops, &Simp_Fold_Unsigned_Relops_Set,
00309 "Allow relop folding which may cause unsigned integer overflow" },
00310
00311 { OVK_BOOL, OV_VISIBLE, TRUE, "got_call_conversion", "got_call",
00312 0, 0, 0, &Enable_GOT_Call_Conversion, &Enable_GOT_Call_overridden,
00313 "Allow function address loads to be moved out of loops" },
00314
00315 { OVK_BOOL, OV_INTERNAL, TRUE, "goto_conversion", "goto",
00316 0, 0, 0, &WOPT_Enable_Goto, NULL,
00317 "Enable conversion of GOTO to more structured constructs" },
00318
00319 { OVK_INT32, OV_VISIBLE, TRUE, "IEEE_arithmetic", "IEEE_a",
00320 1, 1, 3, &IEEE_Arithmetic, &IEEE_Arith_Set,
00321 "Level of conformance to IEEE-754 arithmetic rules" },
00322
00323 { OVK_BOOL, OV_SHY, TRUE, "IEEE_comparisons", "IEEE_c",
00324 0, 0, 0, &Force_IEEE_Comparisons, NULL,
00325 "Force conforming operations on IEEE-754 NaN and Inf values" },
00326
00327 { OVK_BOOL, OV_VISIBLE, TRUE, "IEEE_NaN_Inf", "IEEE_N",
00328 0, 0, 0, &Force_IEEE_Comparisons, NULL,
00329 "Force conforming operations on IEEE-754 NaN and Inf values" },
00330
00331 { OVK_BOOL, OV_SHY, TRUE, "implied_do_io_opt", NULL,
00332 1, 0, 0, &Implied_Do_Io_Opt, NULL,
00333 "Optimize implied DO I/O to minimize calls in Fortran" },
00334
00335 { OVK_BOOL, OV_VISIBLE, TRUE, "inline_intrinsics", "inline_intr",
00336 0, 0, 0, &Inline_Intrinsics_Allowed, &Inline_Intrinsics_Set,
00337 "Allow inlining of Fortran intrinsic functions" },
00338
00339 { OVK_BOOL, OV_SHY, TRUE, "ldx", "ldx",
00340 0, 0, 0, &Indexed_Loads_Allowed, NULL,
00341 "Allow generation of indexed load/store operations" },
00342
00343 { OVK_BOOL, OV_VISIBLE, TRUE, "liberal_ivdep", "liberal_ivdep",
00344 0, 0, 0, &Liberal_Ivdep, NULL,
00345 "IVDEP pragmas/directives break all dependencies within an array" },
00346
00347 { OVK_BOOL, OV_VISIBLE, TRUE, "Inhibit_EH_opt", "Inhibit_EH_opt",
00348 0, 0, 0, &Inhibit_EH_opt, NULL,
00349 "Don't remove EH regions without calls" },
00350
00351 { OVK_BOOL, OV_INTERNAL, TRUE, "nary", "nary",
00352 0, 0, 0, &Enable_NaryExpr, &Enable_NaryExpr_Set,
00353 "Allow N-ary tree height reduction of MADDs" },
00354
00355 { OVK_NAME, OV_SHY, FALSE, "Ofast", "Ofast",
00356 0, 0, 0, &Ofast, NULL,
00357 "Tailor options for performance on current target" },
00358
00359 { OVK_INT32, OV_VISIBLE, FALSE, "Olimit", "Ol",
00360 DEFAULT_OLIMIT, 0, MAX_OLIMIT, &Olimit, &Olimit_Set,
00361 "Limit size of subprograms which will be optimized" },
00362
00363 { OVK_BOOL, OV_INTERNAL, FALSE, "Olimit_opt", "Olimit_o",
00364 0, 0, 0, &Olimit_opt, &Olimit_opt_Set,
00365 "Use regions if Olimit exceeded" },
00366
00367 { OVK_BOOL, OV_VISIBLE, TRUE, "pad_common", "pad",
00368 0, 0, 0, &OPT_Pad_Common, NULL,
00369 "Force padding of COMMON blocks to improve cache behavior" },
00370
00371 { OVK_BOOL, OV_INTERNAL, TRUE, "ptr_opt", "ptr_o",
00372 0, 0, 0, &Ptr_Opt_Allowed, NULL,
00373 "Allow treatment of pointers as arrays when possible in C" },
00374
00375 { OVK_BOOL, OV_INTERNAL, FALSE, "rail", "rail",
00376 0, 0, 0, &Regions_Around_Inner_Loops, NULL,
00377 "Insert regions around inner loops" },
00378
00379 { OVK_BOOL, OV_INTERNAL, FALSE, "rbi", "rbi",
00380 0, 0, 0, &Region_Boundary_Info, NULL,
00381 "Create region boundary information" },
00382
00383 { OVK_BOOL, OV_VISIBLE, TRUE, "recip", "recip",
00384 0, 0, 0, &Recip_Allowed, &Recip_Set,
00385 "Allow use of recip instruction" },
00386
00387 { OVK_LIST, OV_SHY, FALSE, "region_skip_equal", "region_skip_e",
00388 0, 0, 4096, &Region_Skip, NULL,
00389 "Skip optimization of this region" },
00390
00391 { OVK_LIST, OV_SHY, FALSE, "region_skip_before", "region_skip_b",
00392 0, 0, 4096, &Region_Skip, NULL,
00393 "Skip optimization of regions before this one" },
00394
00395 { OVK_LIST, OV_SHY, FALSE, "region_skip_after", "region_skip_a",
00396 0, 0, 4096, &Region_Skip, NULL,
00397 "Skip optimization of regions after this one" },
00398
00399 { OVK_BOOL, OV_VISIBLE, TRUE, "reorg_common", "reorg",
00400 0, 0, 0, &OPT_Reorg_Common, &OPT_Reorg_Common_Set,
00401 "Allow splitting of COMMON blocks to improve cache behavior" },
00402
00403 { OVK_BOOL, OV_VISIBLE, FALSE, "procedure_reorder", "procedure_reorder",
00404 0, 0, 0, &Section_For_Each_Function, NULL,
00405 "Place each function in its own .text section" },
00406
00407 { OVK_INT32, OV_VISIBLE, TRUE, "roundoff", "ro",
00408 2, 0, 3, &Roundoff_Level, &Roundoff_Set,
00409 "Level of acceptable departure from source roundoff semantics" },
00410
00411 { OVK_BOOL, OV_VISIBLE, TRUE, "rsqrt", "rsqrt",
00412 0, 0, 0, &Rsqrt_Allowed, &Rsqrt_Set,
00413 "Allow use of rsqrt instruction" },
00414
00415 { OVK_BOOL, OV_VISIBLE, TRUE, "shared_memory", "shared_mem",
00416 0, 0, 0, &OPT_shared_memory, NULL,
00417 "Assume use of shared memory" },
00418
00419 { OVK_LIST, OV_SHY, FALSE, "skip_equal", "skip_e",
00420 0, 0, 4096, &Opt_Skip, NULL,
00421 "Skip optimization of this subprogram" },
00422
00423 { OVK_LIST, OV_SHY, FALSE, "skip_before", "skip_b",
00424 0, 0, 4096, &Opt_Skip, NULL,
00425 "Skip optimization of subprograms before this one" },
00426
00427 { OVK_LIST, OV_SHY, FALSE, "skip_after", "skip_a",
00428 0, 0, 4096, &Opt_Skip, NULL,
00429 "Skip optimization of subprograms after this one" },
00430
00431 { OVK_BOOL, OV_VISIBLE, FALSE, "space", "sp",
00432 0, 0, 0, &OPT_Space, NULL,
00433 "Bias optimizations to minimize code space" },
00434
00435 { OVK_BOOL, OV_INTERNAL, TRUE, "speculate", "",
00436 0, 0, 0, &OPT_Lower_Speculate, NULL,
00437 "Allow speculation for CAND/COR operators" },
00438
00439 { OVK_BOOL, OV_INTERNAL, TRUE, "speculative_null_ptr_deref","",
00440 0, 0, 0, &GCM_Eager_Null_Ptr_Deref, &GCM_Eager_Null_Ptr_Deref_Set,
00441 "Allow speculation of loads above NULL pointer tests" },
00442
00443 { OVK_BOOL, OV_INTERNAL, TRUE, "speculative_ptr_deref","",
00444 0, 0, 0, &GCM_Speculative_Ptr_Deref, &GCM_Speculative_Ptr_Deref_Set,
00445 "Allow speculative loads of memory locations that differ by a small offset from some referenced memory location" },
00446
00447 { OVK_BOOL, OV_VISIBLE, TRUE, "swp", "swp",
00448 0, 0, 0, &Enable_SWP, &Enable_SWP_overridden,
00449 "Enable software pipelining" },
00450
00451 { OVK_BOOL, OV_INTERNAL, TRUE, "treeheight", "",
00452 0, 0, 0, &OPT_Lower_Treeheight, &OPT_Lower_Treeheight_Set,
00453 "Allow tree height reduction" },
00454
00455 { OVK_BOOL, OV_INTERNAL, TRUE, "inline_divide", "",
00456 0, 0, 0, &OPT_Inline_Divide, &OPT_Inline_Divide_Set,
00457 "Inline divide and remainder operations if possible" },
00458
00459 { OVK_BOOL, OV_VISIBLE, TRUE, "unroll_analysis", "unroll_analysis",
00460 0, 0, 0, &OPT_Unroll_Analysis, &OPT_Unroll_Analysis_Set,
00461 "Analyze inner loop requirements before unrolling" },
00462
00463 { OVK_INT32, OV_VISIBLE, TRUE, "unroll_size", "unroll_s",
00464 0, 0, INT32_MAX, &OPT_unroll_size, &OPT_unroll_size_overridden,
00465 "Maximum size of loops to be unrolled" },
00466
00467 { OVK_INT32, OV_VISIBLE, TRUE, "unroll_times_max", "unroll",
00468 0, 0, INT32_MAX, &OPT_unroll_times, &OPT_unroll_times_overridden,
00469 "Maximum number of times to unroll loops" },
00470
00471 { OVK_BOOL, OV_INTERNAL, TRUE, "wn_simplify", "wn_simp",
00472 0, 0, 0, &Enable_WN_Simp, &Enable_WN_Simp_Set,
00473 "Enable simplifier" },
00474
00475 { OVK_BOOL, OV_VISIBLE, TRUE, "wrap_around_unsafe_opt", "wrap_around_unsafe",
00476 0, 0, 0, &Allow_wrap_around_opt, &Allow_wrap_around_opt_Set,
00477 "Allow LFTR which may wrap around MAX_INT" },
00478
00479
00480 {OVK_BOOL, OV_VISIBLE, TRUE, "mem_intrinsics", "",
00481 0, 0, 0, &CG_mem_intrinsics, NULL,
00482 "Enable inline expansion of memory intrinsics (bzero, blkclr, bcopy, memset, memcpy, memmove)" },
00483 {OVK_INT32, OV_VISIBLE, TRUE, "memmove_count", "memmove",
00484 16, 0, INT32_MAX, &CG_memmove_inst_count,&CG_memmove_inst_count_overridden,
00485 "Maximum size of inline expansion of memory intrinsics" },
00486 {OVK_BOOL, OV_VISIBLE, TRUE, "bcopy_cannot_overlap", "",
00487 0, 0, 0, &CG_bcopy_cannot_overlap, NULL,
00488 "Assume that source and target of bcopy cannot overlap" },
00489 {OVK_BOOL, OV_VISIBLE, TRUE, "memcpy_cannot_overlap", "",
00490 0, 0, 0, &CG_memcpy_cannot_overlap, NULL,
00491 "Assume that source and target of memcpy cannot overlap" },
00492 {OVK_BOOL, OV_VISIBLE, TRUE, "memmove_cannot_overlap", "",
00493 0, 0, 0, &CG_memmove_cannot_overlap, NULL,
00494 "Assume that source and target of memmove cannot overlap" },
00495 {OVK_BOOL, OV_VISIBLE, TRUE, "memmove_nonconst", "",
00496 0, 0, 0, &CG_memmove_nonconst, NULL,
00497 "Enable inline expansion of memory intrinsics (bzero, blkclr, bcopy, memset, memcpy, memmove) whose size is not a constant" },
00498
00499 { OVK_BOOL, OV_INTERNAL, TRUE, "ipa_addr_analysis", "ipa_addr",
00500 0, 0, 0, &OPT_IPA_addr_analysis, NULL,
00501 "Enable the use of IPA address analysis result in the backend"},
00502
00503 { OVK_BOOL, OV_INTERNAL, TRUE, "recompute_addr_flags", "",
00504 0, 0, 0, &OPT_recompute_addr_flags, NULL,
00505 "Recompute address flags in the backend (for debugging)"},
00506
00507 { OVK_INT32, OV_VISIBLE, TRUE, "instrument", "instr",
00508 0, 0, 3, &Instrumentation_Phase_Num, &Instrumentation_Enabled,
00509 "Phases in the compiler where instrumentation needs to be done" },
00510
00511 { OVK_UINT32, OV_INTERNAL, TRUE, "instrument_action", "",
00512 0, 0, UINT32_MAX, &Instrumentation_Actions, &Instrumentation_Enabled,
00513 "Phases in the compiler where instrumentation needs to be done" },
00514
00515 { OVK_BOOL, OV_INTERNAL, FALSE, "instr_unique_output", "",
00516 0, 0, 0, &Instrumentation_Unique_Output, NULL,
00517 "Always create a unique name for the profile data file" },
00518
00519 { OVK_LIST, OV_VISIBLE, TRUE, "feedback", "feed",
00520 0, 0, 0, &Feedback_Option, NULL,
00521 "Phases in the compiler where feedback needs to be done" },
00522
00523 { OVK_BOOL, OV_INTERNAL, TRUE, "early_intrinsics", "",
00524 0, 0, 0, &Inline_Intrinsics_Early, NULL,
00525 "Lower intrinsics early" },
00526
00527 { OVK_BOOL, OV_INTERNAL, TRUE, "delay_u64_lowering", "delay_u64",
00528 0, 0, 0, &Delay_U64_Lowering, NULL,
00529 "Delay unsigned 64-bit lowering to after wopt" },
00530
00531 { OVK_BOOL, OV_INTERNAL, TRUE, "extract_deposit", "extr",
00532 0, 0, 0, &Enable_extract_compose, NULL,
00533 "Enable use of extract/compose opcodes" },
00534
00535 { OVK_BOOL, OV_VISIBLE, FALSE, "ansi_setjmp", "ansi_setjmp",
00536 0, 0, 0, &LANG_Ansi_Setjmp_On, &LANG_Ansi_Setjmp_Set,
00537 "C/C++: enable optimization of functions with calls to setjmp" },
00538
00539 #ifdef __linux__
00540 { OVK_BOOL, OV_INTERNAL, TRUE, "wfe_dfe", "wfe_dfe",
00541 0, 0, 0, &Enable_WFE_DFE, NULL,
00542 "Enable dead function elimination in the frontend" },
00543 #endif
00544
00545
00546
00547 { OVK_OBSOLETE, OV_INTERNAL, FALSE, "global_limit", NULL,
00548 0, 0, 0, NULL, NULL, "" },
00549
00550 { OVK_OBSOLETE, OV_INTERNAL, FALSE, "feopt", NULL,
00551 0, 0, 0, NULL, NULL,
00552 "Enable special optimizations in front ends" },
00553
00554 { OVK_OBSOLETE, OV_VISIBLE, FALSE, "fold_arith_limit", NULL,
00555 0, 0, 0, NULL, NULL,
00556 "Limit size of subexpressions to be folded" },
00557
00558 { OVK_OBSOLETE, OV_INTERNAL, FALSE, "fold_float", NULL,
00559 0, 0, 0, NULL, NULL,
00560 "Allow expression folding optimizations of floating point" },
00561
00562 { OVK_OBSOLETE, OV_INTERNAL, FALSE, "fprop_limit", NULL,
00563 0, 0, INT32_MAX, NULL, NULL, "" },
00564
00565 { OVK_COUNT }
00566 };