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
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 static const char *source_file = __FILE__;
00074
00075
00076
00077 #include "defs.h"
00078 #include "glob.h"
00079 #include "stab.h"
00080 #include "strtab.h"
00081 #include "errors.h"
00082 #include "config_targ.h"
00083 #include "config_debug.h"
00084 #include "wn.h"
00085 #include "wn_util.h"
00086 #include "wn_trap.h"
00087 #include "f90_utils.h"
00088 #include "pu_info.h"
00089
00090
00091
00092 #include "i_cvrt.h"
00093
00094
00095
00096 #include "cwh_defines.h"
00097 #include "cwh_stk.h"
00098 #include "cwh_preg.h"
00099 #include "cwh_stab.h"
00100 #include "cwh_auxst.h"
00101 #include "cwh_block.h"
00102 #include "cwh_types.h"
00103 #include "cwh_stmt.h"
00104 #include "cwh_stab.h"
00105 #include "cwh_expr.h"
00106 #include "cwh_io.h"
00107 #include "cwh_intrin.h"
00108 #include "cwh_dst.h"
00109 #include "sgi_cmd_line.h"
00110 #include "cwh_addr.h"
00111 #include "cwh_addr.i"
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 extern void
00158 fei_seq_subscr( TYPE result_type )
00159 {
00160 WN *ex ;
00161 WN *lb ;
00162 WN *sb ;
00163 WN *ar ;
00164 WN *ad ;
00165 WN *wt ;
00166 ST *st ;
00167 TY_IDX ty ;
00168
00169 BOOL array_val ;
00170 BOOL sect ;
00171 BOOL trip ;
00172 TY_IDX ta ;
00173
00174 OPCODE op ;
00175 FLD_det det ;
00176 WN * bounds_assertion;
00177 char *field_name,*array_name;
00178
00179 (void) cwh_stk_pop_whatever();
00180 ex = cwh_expr_operand(NULL) ;
00181 lb = cwh_expr_operand(NULL) ;
00182 sb = cwh_expr_operand(NULL) ;
00183 bounds_assertion = cwh_addr_do_bounds_check(sb, lb, ex);
00184
00185 trip = cwh_addr_is_triplet(sb);
00186 sb = cwh_addr_zero_based(sb,lb);
00187 sb = F90_Wrap_ARREXP(sb);
00188 sect = WNOPR(sb) == OPR_ARRAYEXP;
00189
00190 array_val = sect || trip ;
00191 op = array_val ? opc_section : opc_array ;
00192
00193 switch(cwh_stk_get_class()) {
00194 case ADDR_item:
00195 case WN_item:
00196 ta = cwh_stk_get_TY();
00197 ar = cwh_expr_address(f_NONE);
00198
00199 if (array_val)
00200 if (cwh_addr_is_array(ar))
00201 WN_set_opcode(ar, opc_section) ;
00202
00203 cwh_addr_insert_bounds_check(bounds_assertion,ar);
00204 ar = cwh_addr_add_bound(ar,ex,sb);
00205 cwh_stk_push_typed(ar,WN_item,ta);
00206 break ;
00207
00208 case WN_item_whole_array:
00209 ta = cwh_stk_get_TY();
00210 ar = cwh_expr_address(f_NONE);
00211 if (array_val)
00212 if (cwh_addr_is_array(ar))
00213 WN_set_opcode(ar, opc_section) ;
00214
00215 cwh_addr_insert_bounds_check(bounds_assertion,ar);
00216 ar = cwh_addr_add_bound(ar,ex,sb);
00217 cwh_stk_push_typed(ar,WN_item_whole_array,ta);
00218 break ;
00219
00220 case ST_item:
00221 st = cwh_stk_pop_ST();
00222 ty = ST_type(st);
00223 ad = cwh_addr_address_ST(st) ;
00224 ar = cwh_addr_array(op,ad,ty);
00225 SET_ARRAY_NAME_MAP(ar,ST_name(st));
00226 cwh_addr_insert_bounds_check(bounds_assertion,ar);
00227 ar = cwh_addr_add_bound(ar,ex,sb);
00228 cwh_stk_push(ar,WN_item);
00229 break ;
00230
00231 case ST_item_whole_array:
00232 st = cwh_stk_pop_ST();
00233 ty = ST_type(st);
00234 ad = cwh_addr_address_ST(st) ;
00235 ar = cwh_addr_array(op,ad,ty);
00236 SET_ARRAY_NAME_MAP(ar,ST_name(st));
00237 cwh_addr_insert_bounds_check(bounds_assertion,ar);
00238 ar = cwh_addr_add_bound(ar,ex,sb);
00239 cwh_stk_push(ar,WN_item_whole_array);
00240 break ;
00241
00242 case FLD_item:
00243 field_name = cwh_stk_fld_name();
00244 det = cwh_addr_offset() ;
00245
00246
00247
00248
00249
00250
00251 if (cwh_stk_get_class() == ST_item ||
00252 cwh_stk_get_class() == ST_item_whole_array) {
00253
00254 st = cwh_stk_pop_ST();
00255 ad = cwh_addr_address_ST(st,det.off,det.type);
00256 array_name = ST_name(st);
00257
00258 } else {
00259
00260
00261
00262
00263 ad = cwh_expr_address(f_NONE);
00264 array_name = GET_ARRAY_NAME_MAP(ad);
00265 wt = WN_CreateIntconst(opc_pint,det.off);
00266 ad = cwh_expr_bincalc(OPR_ADD,ad,wt);
00267
00268 }
00269
00270 ar = cwh_addr_array(op,ad,det.type) ;
00271 if (strlen(field_name) > 0) {
00272
00273 if (array_name) {
00274 array_name = Index_To_Str(Save_Str2(array_name,field_name));
00275 } else {
00276 array_name = Index_To_Str(Save_Str2("(unknown)",field_name));
00277 }
00278 free(field_name);
00279 SET_ARRAY_NAME_MAP(ar,array_name);
00280 }
00281 cwh_addr_insert_bounds_check(bounds_assertion,ar);
00282 ar = cwh_addr_add_bound(ar,ex,sb);
00283 cwh_stk_push_typed(ar,WN_item,det.type);
00284 break ;
00285
00286 default:
00287 DevAssert((0),(" odd item in subscr"));
00288 }
00289 }
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302 static INT64
00303 cwh_addr_compute_stride_fudge_factor(TY_IDX in)
00304 {
00305
00306 TY_IDX ty_idx = cwh_types_array_TY(in);
00307 TY& t = Ty_Table[ty_idx];
00308 DevAssert((TY_kind(t)==KIND_ARRAY),("can't get fudge factor for non-array type"));
00309 TY& ty = Ty_Table[TY_etype(t)];
00310
00311 #define RETURN4 return(-4)
00312 #define RETURN2 return(-2)
00313 #define RETURN1 return(-1)
00314
00315 switch (TY_kind(ty)) {
00316 case KIND_SCALAR:
00317
00318 if (TY_size(ty) >= 4) {
00319 RETURN4;
00320 } else if (TY_size(ty) == 2) {
00321 RETURN2;
00322 } else {
00323 RETURN1;
00324 }
00325
00326 case KIND_ARRAY:
00327 RETURN1;
00328
00329 case KIND_STRUCT:
00330 if (TY_is_packed(ty)) {
00331 RETURN1;
00332 } else {
00333 RETURN4;
00334 }
00335
00336 default:
00337 DevAssert((0),("Don't know how to deal with this ty"));
00338 }
00339 RETURN4;
00340 }
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382 static void cwh_addr_fixup_nseq(WN **ex, WN **sb, WN *sm)
00383 {
00384
00385
00386
00387
00388 if (!may_be_noncontig) return;
00389
00390 WN_DELETE_Tree(*ex);
00391 *ex = sm;
00392 return;
00393 }
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412 extern void
00413 fei_nseq_subscr( TYPE result_type )
00414 {
00415 WN *ex ;
00416 WN *lb ;
00417 WN *sb ;
00418 WN *sm ;
00419 WN *ar ;
00420 WN *ad ;
00421 WN *wt ;
00422 ST *st ;
00423 #ifdef KEY
00424 TY_IDX ty = 0;
00425 #else
00426 TY_IDX ty ;
00427 #endif
00428 TY_IDX dope_ty ;
00429 #ifdef KEY
00430 WN_ESIZE esize = 0;
00431 #else
00432 WN_ESIZE esize;
00433 #endif
00434
00435 TY_IDX ta ;
00436 BOOL array_val ;
00437 BOOL sect ;
00438 BOOL trip ;
00439
00440 OPCODE op ;
00441 FLD_det det ;
00442 WN * bounds_assertion;
00443 char *field_name,*array_name;
00444
00445 sm = cwh_expr_operand(NULL) ;
00446 ex = cwh_expr_operand(NULL) ;
00447 lb = cwh_expr_operand(NULL) ;
00448 sb = cwh_expr_operand(NULL) ;
00449 bounds_assertion = cwh_addr_do_bounds_check(sb, lb, ex);
00450
00451 trip = cwh_addr_is_triplet(sb);
00452 sb = cwh_addr_zero_based(sb,lb);
00453 sb = F90_Wrap_ARREXP(sb);
00454 sect = WNOPR(sb) == OPR_ARRAYEXP;
00455
00456 array_val = sect || trip ;
00457 op = array_val ? opc_section : opc_array ;
00458
00459 switch(cwh_stk_get_class()) {
00460 case ADDR_item:
00461 case WN_item:
00462 case WN_item_whole_array:
00463 ta = cwh_stk_get_TY();
00464 ar = cwh_expr_address(f_NONE);
00465 if (array_val)
00466 if (cwh_addr_is_array(ar))
00467 WN_set_opcode(ar, opc_section) ;
00468
00469 if (WNOPR(ar)==OPR_ARRSECTION || WNOPR(ar)==OPR_ARRAY) {
00470 may_be_noncontig = (WN_element_size(ar) < 0 );
00471 }
00472 cwh_addr_fixup_nseq(&ex,&sb,sm);
00473 cwh_addr_insert_bounds_check(bounds_assertion,ar);
00474 ar = cwh_addr_add_bound(ar,ex,sb);
00475 cwh_stk_push_typed(ar,WN_item,ta);
00476 break ;
00477
00478 case DEREF_item:
00479 may_be_noncontig = FALSE;
00480 dope_ty = cwh_stk_get_TY();
00481 if (dope_ty) {
00482 TY& t = Ty_Table[dope_ty];
00483 ty = FLD_type(TY_fld(t));
00484 may_be_noncontig = TY_is_f90_pointer(t);
00485 }
00486 ar = cwh_expr_address(f_NONE);
00487 st = cwh_addr_WN_ST(ar);
00488 if (!dope_ty) {
00489 ty = ST_type(st);
00490 ty = cwh_types_dope_basic_TY(ty);
00491 }
00492
00493 if (ST_sclass(st) == SCLASS_FORMAL ||
00494 ST_auxst_is_non_contiguous(st) ||
00495 may_be_noncontig) {
00496 may_be_noncontig = TRUE;
00497 esize = cwh_addr_compute_stride_fudge_factor(ty);
00498 }
00499 array_name = GET_ARRAY_NAME_MAP(ar);
00500 ar = cwh_addr_array(op,ar,ty);
00501 if (array_name) {
00502 SET_ARRAY_NAME_MAP(ar,Index_To_Str(Save_Str2(ST_name(st),array_name)));
00503 } else {
00504 SET_ARRAY_NAME_MAP(ar,ST_name(st));
00505 }
00506 if (may_be_noncontig) WN_element_size(ar) = esize;
00507
00508 if (array_val)
00509 if (cwh_addr_is_array(ar))
00510 WN_set_opcode(ar, opc_section) ;
00511
00512 cwh_addr_fixup_nseq(&ex,&sb,sm);
00513 cwh_addr_insert_bounds_check(bounds_assertion,ar);
00514 ar = cwh_addr_add_bound(ar,ex,sb);
00515 cwh_stk_push(ar,WN_item);
00516 break;
00517
00518 case ST_item:
00519 case ST_item_whole_array:
00520 may_be_noncontig = FALSE;
00521 st = cwh_stk_pop_ST();
00522 ty = ST_type(st);
00523
00524 if (ST_sclass(st) == SCLASS_FORMAL ||
00525 ST_auxst_is_non_contiguous(st) ||
00526 TY_is_f90_pointer(Ty_Table[ty])) {
00527
00528 may_be_noncontig = TRUE;
00529 esize = cwh_addr_compute_stride_fudge_factor(ty);
00530 }
00531 ad = cwh_addr_address_ST(st) ;
00532 ar = cwh_addr_array(op,ad,ty);
00533 SET_ARRAY_NAME_MAP(ar,ST_name(st));
00534 if (may_be_noncontig) WN_element_size(ar) = esize;
00535
00536 cwh_addr_fixup_nseq(&ex,&sb,sm);
00537 cwh_addr_insert_bounds_check(bounds_assertion,ar);
00538 ar = cwh_addr_add_bound(ar,ex,sb);
00539 cwh_stk_push(ar,WN_item);
00540 break ;
00541
00542 case FLD_item:
00543 may_be_noncontig = FALSE;
00544 field_name = cwh_stk_fld_name();
00545 det = cwh_addr_offset() ;
00546
00547 if (TY_is_f90_pointer(Ty_Table[det.type])) {
00548
00549 may_be_noncontig = TRUE;
00550 esize = cwh_addr_compute_stride_fudge_factor(ty);
00551 }
00552
00553
00554
00555
00556
00557
00558 if (cwh_stk_get_class() == ST_item || cwh_stk_get_class() == ST_item_whole_array) {
00559 st = cwh_stk_pop_ST();
00560 ad = cwh_addr_address_ST(st,det.off,det.type) ;
00561 array_name = ST_name(st);
00562
00563 } else {
00564
00565
00566
00567
00568 ad = cwh_expr_address(f_NONE);
00569 array_name = GET_ARRAY_NAME_MAP(ad);
00570 wt = WN_CreateIntconst(opc_pint,det.off);
00571 ad = cwh_expr_bincalc(OPR_ADD,ad,wt);
00572 }
00573
00574 ar = cwh_addr_array(op,ad,det.type) ;
00575 if (strlen(field_name) > 0) {
00576
00577 if (array_name) {
00578 array_name = Index_To_Str(Save_Str2(array_name,field_name));
00579 } else {
00580 array_name = Index_To_Str(Save_Str2("(unknown)",field_name));
00581 }
00582 free(field_name);
00583 SET_ARRAY_NAME_MAP(ar,array_name);
00584 }
00585
00586 if (may_be_noncontig) WN_element_size(ar) = esize;
00587 cwh_addr_fixup_nseq(&ex,&sb,sm);
00588 cwh_addr_insert_bounds_check(bounds_assertion,ar);
00589 ar = cwh_addr_add_bound(ar,ex,sb);
00590 cwh_stk_push_typed(ar,WN_item,det.type);
00591 break ;
00592
00593 default:
00594 DevAssert((0),(" odd item in subscr"));
00595 }
00596 }
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609 extern void
00610 fei_subscr_triplet(TYPE result_type )
00611 {
00612 WN *lb ;
00613 WN *ub ;
00614 WN *str ;
00615 WN *wt ;
00616
00617 str = cwh_expr_operand(NULL) ;
00618 ub = cwh_expr_operand(NULL) ;
00619 lb = cwh_expr_operand(NULL) ;
00620
00621 wt = cwh_addr_triplet(lb,ub,str);
00622
00623 cwh_stk_push(wt,WN_item);
00624 }
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638 extern void
00639 fei_subscr_size( TYPE result_type, INT32 bounds_check)
00640 {
00641 check_bounds_this_access = (bounds_check != 0) && (cwh_io_in_ioblock==0);
00642 }
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666 extern void
00667 fei_substr(INT32 bounds_check)
00668 {
00669 WN * asz;
00670 WN * sz ;
00671 WN * lb ;
00672 WN * one;
00673 WN * ar ;
00674 TY_IDX ts ;
00675
00676 #ifdef KEY
00677 W_node ad = { 0, 0};
00678 #else
00679 W_node ad ;
00680 #endif
00681 FLD_det det ;
00682
00683 sz = cwh_expr_operand(NULL);
00684 lb = cwh_expr_operand(NULL);
00685
00686 switch(cwh_stk_get_class()){
00687 case ST_item:
00688 case ST_item_whole_array:
00689 case WN_item:
00690 case WN_item_whole_array:
00691 ts = cwh_stk_get_TY();
00692 ad = cwh_addr_substr_util(0,ts);
00693 break;
00694
00695 case DEREF_item:
00696 ad = cwh_addr_substr_util(0,0);
00697 break;
00698
00699 case FLD_item:
00700 det = cwh_addr_offset() ;
00701 ad = cwh_addr_substr_util(det.off,det.type) ;
00702 break ;
00703
00704 default:
00705 DevAssert((0),(" Odd string"));
00706 }
00707
00708 one = WN_CreateIntconst (opc_pint,1);
00709 lb = cwh_addr_zero_based(lb,one);
00710 asz = WN_COPY_Tree(sz);
00711 ar = cwh_addr_add_bound(W_wn(ad),asz,lb);
00712
00713 cwh_stk_push_STR(sz,ar,W_ty(ad),WN_item);
00714 }
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728 extern void
00729 fei_addr(TYPE basic)
00730 {
00731 WN * wn ;
00732
00733 wn = cwh_expr_address(f_T_SAVED);
00734 if (cwh_addr_is_array(wn)) {
00735
00736
00737
00738 wn = WN_CreateComma(OPCODE_make_op(OPR_COMMA,Pointer_Mtype,MTYPE_V),
00739 WN_CreateBlock(),wn);
00740
00741 }
00742 cwh_stk_push(wn,ADDR_item);
00743 }
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760 extern void
00761 fei_as_ref( TYPE result_type )
00762 {
00763 WN * ub;
00764 WN * ad;
00765 WN * sz;
00766 ST * st;
00767 TY_IDX ty;
00768
00769 TYPE_ID bt;
00770 INT32 nd,i;
00771
00772 ad = cwh_stk_pop_DEREF();
00773 st = WN_st(ad);
00774 nd = cwh_types_dope_rank(ST_type(st));
00775 ty = cwh_types_dope_basic_TY(ST_type(st));
00776 ad = cwh_addr_array(opc_section,ad,ty);
00777 bt = cwh_bound_int_typeid;
00778
00779 for (i = 0 ; i < nd ; i++) {
00780
00781 cwh_stk_push(st,ST_item);
00782 fei_get_dv_extent(nd-i,0);
00783 sz = cwh_stk_pop_WN();
00784 ub = cwh_expr_bincalc(OPR_SUB,WN_COPY_Tree(sz),WN_Intconst(bt,1)) ;
00785 ub = cwh_addr_triplet(WN_Intconst(bt,0),ub,WN_Intconst(bt,1)) ;
00786 ad = cwh_addr_add_bound(ad,sz,ub);
00787 }
00788 cwh_stk_push(ad,WN_item);
00789 }
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800 static WN *
00801 cwh_addr_array(OPCODE op, WN * addr, TY_IDX ty)
00802 {
00803 WN * wn ;
00804 TY_IDX aty ;
00805 INT16 nkids,i ;
00806
00807 aty = cwh_types_array_TY(ty);
00808
00809 TY& t = Ty_Table[aty];
00810 nkids = 2 * TY_AR_ndims(t) +1 ;
00811 wn = WN_Create ( op, nkids );
00812 WN_element_size(wn) = TY_size(TY_etype(t));
00813
00814 WN_kid(wn,0) = addr ;
00815
00816 FOREACH_AXIS(i,nkids) {
00817 WN_kid(wn,i+SZ_OFF(nkids)) = NULL ;
00818 WN_kid(wn,i+SUB_OFF(nkids)) = NULL ;
00819 }
00820 return wn ;
00821 }
00822
00823
00824 #ifdef KEY
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840 static WN *
00841 cwh_compare_index_and_bound(OPERATOR op, WN *lhs, WN *rhs) {
00842 TYPE_ID bt = cwh_get_highest_type(rhs, lhs);
00843 OPCODE opc = cwh_make_typed_opcode(op, MTYPE_I4, Mtype_comparison(bt));
00844 lhs = cwh_convert_to_ty(lhs,bt);
00845 rhs = cwh_convert_to_ty(rhs,bt);
00846 WN *wn = WN_CreateExp2(opc, lhs, rhs) ;
00847 return wn;
00848 }
00849 #endif
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872 static WN *
00873 cwh_addr_do_bounds_check(WN *subscript_in, WN *lbound, WN *extent)
00874 {
00875 WN *lbc,*ubc,*assertion,*subscript;
00876 WN *stride,*ub,*ubdecl;
00877 WN *arrexp;
00878 WN *temp;
00879 static OPCODE ge_op=OPCODE_UNKNOWN,lt_op=OPCODE_UNKNOWN,le_op=OPCODE_UNKNOWN;
00880 static TYPE log_type;
00881 PREG_NUM bc_preg;
00882
00883 if (!DEBUG_Subscript_Check || !check_bounds_this_access) return (NULL);
00884 if (ge_op == OPCODE_UNKNOWN) {
00885 ge_op = OPCODE_make_op(OPR_GE,MTYPE_I4,cwh_bound_int_typeid);
00886 lt_op = OPCODE_make_op(OPR_LT,MTYPE_I4,cwh_bound_int_typeid);
00887 le_op = OPCODE_make_op(OPR_LE,MTYPE_I4,cwh_bound_int_typeid);
00888 t_TY(log_type) = cast_to_int(logical4_ty);
00889 }
00890
00891 ubdecl = cwh_expr_bincalc(OPR_ADD,WN_COPY_Tree(lbound),WN_COPY_Tree(extent));
00892
00893
00894 subscript = F90_Wrap_ARREXP(subscript_in);
00895
00896 if (WNOPR(subscript)==OPR_TRIPLET) {
00897
00898 stride = WN_kid1(subscript);
00899 ub = cwh_addr_ubound_from_triplet(subscript);
00900
00901 if (WNOPR(stride) != OPR_INTCONST) {
00902
00903 #ifdef KEY
00904 temp = cwh_compare_index_and_bound(OPR_GE,
00905 WN_COPY_Tree(WN_kid0(subscript)),WN_COPY_Tree(lbound));
00906 lbc = cwh_compare_index_and_bound(OPR_LT,
00907 WN_COPY_Tree(WN_kid0(subscript)),WN_COPY_Tree(ubdecl));
00908 #else
00909 temp = WN_CreateExp2(ge_op,WN_COPY_Tree(WN_kid0(subscript)),WN_COPY_Tree(lbound));
00910 lbc = WN_CreateExp2(lt_op,WN_COPY_Tree(WN_kid0(subscript)),WN_COPY_Tree(ubdecl));
00911 #endif
00912 lbc = WN_LAND(temp,lbc);
00913
00914
00915 #ifdef KEY
00916 temp = cwh_compare_index_and_bound(OPR_GE,WN_COPY_Tree(ub),
00917 WN_COPY_Tree(lbound));
00918 ubc = cwh_compare_index_and_bound(OPR_LT,WN_COPY_Tree(ub),ubdecl);
00919 #else
00920 temp = WN_CreateExp2(ge_op,WN_COPY_Tree(ub),WN_COPY_Tree(lbound));
00921 ubc = WN_CreateExp2(lt_op,WN_COPY_Tree(ub),ubdecl);
00922 #endif
00923 ubc = WN_LAND(temp,ubc);
00924 } else {
00925
00926 if (WN_const_val(stride) > 0) {
00927
00928 #ifdef KEY
00929 lbc = cwh_compare_index_and_bound(OPR_GE,
00930 WN_COPY_Tree(WN_kid0(subscript)),WN_COPY_Tree(lbound));
00931 ubc = cwh_compare_index_and_bound(OPR_LT,WN_COPY_Tree(ub),ubdecl);
00932 #else
00933 lbc = WN_CreateExp2(ge_op,WN_COPY_Tree(WN_kid0(subscript)),WN_COPY_Tree(lbound));
00934 ubc = WN_CreateExp2(lt_op,WN_COPY_Tree(ub),ubdecl);
00935 #endif
00936 } else {
00937
00938 #ifdef KEY
00939 lbc = cwh_compare_index_and_bound(OPR_LT,
00940 WN_COPY_Tree(WN_kid0(subscript)), ubdecl);
00941 ubc = cwh_compare_index_and_bound(OPR_GE,
00942 WN_COPY_Tree(ub),WN_COPY_Tree(lbound));
00943 #else
00944 lbc = WN_CreateExp2(lt_op,WN_COPY_Tree(WN_kid0(subscript)),ubdecl);
00945 ubc = WN_CreateExp2(ge_op,WN_COPY_Tree(ub),WN_COPY_Tree(lbound));
00946 #endif
00947 }
00948 }
00949 assertion = WN_LAND(lbc,ubc);
00950
00951 } else if (WNOPR(subscript)==OPR_ARRAYEXP) {
00952
00953 arrexp = WN_COPY_Tree(subscript);
00954 #ifdef KEY
00955 lbc = cwh_compare_index_and_bound(OPR_GE,WN_COPY_Tree(WN_kid0(subscript)),
00956 WN_COPY_Tree(lbound));
00957 ubc = cwh_compare_index_and_bound(OPR_LT,WN_COPY_Tree(WN_kid0(arrexp)),
00958 ubdecl);
00959 #else
00960 lbc = WN_CreateExp2(ge_op,WN_COPY_Tree(WN_kid0(subscript)),WN_COPY_Tree(lbound));
00961 ubc = WN_CreateExp2(lt_op,WN_COPY_Tree(WN_kid0(arrexp)),ubdecl);
00962 #endif
00963 assertion = WN_LAND(lbc,ubc);
00964 WN_kid0(arrexp) = assertion;
00965 cwh_stk_push(arrexp,WN_item);
00966 fei_null_expr();
00967 fei_all(log_type);
00968 assertion = cwh_expr_operand(NULL);
00969 bc_preg = Create_Preg(MTYPE_I4,"bounds_check");
00970 cwh_block_append(WN_StidPreg(MTYPE_I4,bc_preg,assertion));
00971 assertion = WN_LdidPreg(MTYPE_I4,bc_preg);
00972 } else {
00973
00974 #ifdef KEY
00975 lbc = cwh_compare_index_and_bound(OPR_GE,WN_COPY_Tree(subscript),
00976 WN_COPY_Tree(lbound));
00977 ubc = cwh_compare_index_and_bound(OPR_LT,WN_COPY_Tree(subscript),ubdecl);
00978 #else
00979 lbc = WN_CreateExp2(ge_op,WN_COPY_Tree(subscript),WN_COPY_Tree(lbound));
00980 ubc = WN_CreateExp2(lt_op,WN_COPY_Tree(subscript),ubdecl);
00981 #endif
00982 assertion = WN_LAND(lbc,ubc);
00983 }
00984 if (WNOPR(assertion) == OPR_INTCONST) {
00985 if (WN_const_val(assertion) != 0) {
00986
00987 WN_DELETE_Tree(assertion);
00988 return (NULL);
00989 }
00990 }
00991 return (assertion);
00992 }
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007 static void
01008 cwh_addr_insert_bounds_check(WN *assertion, WN *ar)
01009 {
01010 WN *args[4];
01011 BOOL byval[4];
01012 WN *save_block,*fail_block;
01013 char *proc_name;
01014 char *array_name;
01015 INT axis,ndim;
01016 INT64 lineno;
01017
01018 if (assertion == NULL) return;
01019
01020
01021 ndim = WN_num_dim(ar);
01022 for (axis = 0; axis < ndim; axis++) {
01023 if (WN_array_dim(ar,axis) == NULL) break;
01024 }
01025 axis = ndim - axis;
01026
01027
01028
01029
01030
01031 fail_block = WN_CreateBlock();
01032 assertion = WN_CreateIf(assertion, WN_CreateBlock(), fail_block);
01033 cwh_block_append(assertion);
01034 save_block = cwh_block_exchange_current(fail_block);
01035
01036
01037 lineno = USRCPOS_linenum(current_srcpos);
01038 args[1] = WN_Intconst(MTYPE_I4,lineno);
01039 byval[1] = TRUE;
01040
01041 proc_name = cwh_dst_filename_from_filenum(SRCPOS_filenum(current_srcpos));
01042 args[0] = WN_LdaString(proc_name, 0, strlen(proc_name));
01043 byval[0] = TRUE;
01044
01045 array_name = GET_ARRAY_NAME_MAP(ar);
01046 if (array_name) {
01047 args[2] = WN_LdaString(array_name, 0, strlen(array_name)+1);
01048 } else {
01049 args[2] = WN_Intconst(Pointer_Mtype,0);
01050 }
01051 byval[2] = TRUE;
01052 args[3] = WN_Intconst(MTYPE_I4,axis);
01053 byval[3] = TRUE;
01054 cwh_intrin_call(INTRN_F90BOUNDS_CHECK, 4, args, NULL, byval, MTYPE_V);
01055 cwh_block_set_current(save_block);
01056 }
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072 static WN *
01073 cwh_addr_add_bound(WN * ar, WN * sz, WN *subscript)
01074 {
01075 INT16 nkids,i ;
01076
01077 nkids = WN_kid_count(ar) ;
01078
01079 FOREACH_AXIS(i,nkids) {
01080 if (WN_kid(ar,i) == NULL) {
01081 WN_kid(ar,i+SZ_OFF(nkids)) = sz;
01082 WN_kid(ar,i+SUB_OFF(nkids)) = subscript ;
01083 break ;
01084 }
01085 }
01086
01087
01088 return ar ;
01089 }
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104 static inline bool
01105 cwh_addr_use_mstid_mldid(ST *st)
01106 {
01107 BOOL res = WHIRL_Mldid_Mstid_On &&
01108 !ST_is_equivalenced(st) &&
01109 !ST_is_f90_target(st);
01110
01111 return res ;
01112 }
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124 extern WN *
01125 cwh_addr_ldid(ST *st, OFFSET_64 off, TY_IDX ty)
01126 {
01127
01128 WN * wn ;
01129 TYPE_ID bt ;
01130
01131 if (cwh_addr_use_mstid_mldid(st)) {
01132
01133 if (TY_kind(ty) != KIND_SCALAR && TY_kind(ty) != KIND_STRUCT)
01134 bt = Pointer_Mtype;
01135 else
01136 bt = TY_mtype(ty);
01137
01138 } else {
01139
01140 if (TY_kind(ty) != KIND_SCALAR)
01141 bt = Pointer_Mtype;
01142 else
01143 bt = TY_mtype(ty);
01144 }
01145
01146 if (BIG_OFFSET(off)) {
01147 wn = cwh_addr_lda(st,off,ty);
01148 wn = cwh_addr_iload(wn,0,ty);
01149
01150 } else {
01151
01152 wn = cwh_addr_mk_ldid(st,off,bt,ty);
01153 }
01154 cwh_addr_access_flags(st,ACCESSED_LOAD);
01155 return (wn) ;
01156 }
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171 extern WN *
01172 cwh_addr_mk_ldid(ST *st, OFFSET_64 off, TYPE_ID bt, TY_IDX ty)
01173 {
01174
01175 WN * wn ;
01176 OPCODE opc ;
01177
01178 opc = Ldid_Opcode [bt];
01179
01180 if (cwh_addr_use_mstid_mldid(st)) {
01181
01182 if (TY_size(ty) != MTYPE_byte_size (bt) &&
01183 TY_kind(ty) != KIND_STRUCT)
01184 Set_TY_IDX_index (ty, TY_IDX_index (MTYPE_To_TY (bt)));
01185
01186 } else {
01187
01188 if (TY_size(ty) != MTYPE_byte_size (bt))
01189 Set_TY_IDX_index (ty, TY_IDX_index (MTYPE_To_TY (bt)));
01190 }
01191
01192 wn = WN_CreateLdid (opc,off,st,ty) ;
01193
01194 return wn ;
01195 }
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207 extern WN *
01208 cwh_addr_mload(WN *wt, OFFSET_64 off, TY_IDX ty, WN * sz)
01209 {
01210 WN * wn ;
01211 TY_IDX tp ;
01212
01213 if (cwh_addr_f90_pointer_reference(wt)) {
01214 tp = cwh_types_mk_f90_pointer_ty(ty);
01215 } else {
01216 tp = cwh_types_make_pointer_type(ty, FALSE);
01217 }
01218
01219 if (BIG_OFFSET(off)) {
01220 wt = cwh_expr_bincalc(OPR_ADD,wt,WN_Intconst(Pointer_Mtype,off));
01221 off = 0;
01222 }
01223
01224 if (! sz)
01225 sz = WN_CreateIntconst (opc_pint, TY_size(ty)) ;
01226
01227 wn = WN_CreateMload(off,tp,wt,sz);
01228
01229 return (wn) ;
01230 }
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241 static WN *
01242 cwh_addr_iload(WN *wt, OFFSET_64 off, TY_IDX ty)
01243 {
01244 WN * wn ;
01245 TY_IDX tp ;
01246 OPCODE op;
01247
01248 if (cwh_addr_f90_pointer_reference(wt)) {
01249 tp = cwh_types_mk_f90_pointer_ty(ty);
01250 } else {
01251 tp = cwh_types_make_pointer_type(ty, FALSE);
01252 }
01253
01254 if (BIG_OFFSET(off)) {
01255 wt = cwh_expr_bincalc(OPR_ADD,wt,WN_Intconst(Pointer_Mtype,off));
01256 off = 0;
01257 }
01258 op = Load_Opcode [TY_mtype(ty)];
01259 wn = WN_CreateIload (op,off,ty,tp,wt);
01260
01261 return (wn) ;
01262 }
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275 extern ST *
01276 cwh_addr_WN_ST(WN * wn)
01277 {
01278 ST * st = NULL ;
01279 WN *kid;
01280 INT i;
01281
01282 switch (WNOPR(wn)) {
01283 case OPR_ARRAY:
01284 case OPR_ARRSECTION:
01285 case OPR_ARRAYEXP:
01286 case OPR_ILOAD:
01287 st = cwh_addr_WN_ST(WN_kid0(wn));
01288 break ;
01289
01290 case OPR_LDA:
01291 case OPR_LDID:
01292 st = WN_st(wn) ;
01293 break;
01294
01295 case OPR_INTCONST:
01296
01297 break;
01298
01299
01300 case OPR_ADD:
01301 for (i=0; i <= 1; i++) {
01302 kid = WN_kid(wn,i);
01303 switch (WNOPR(kid)) {
01304 case OPR_ARRAY:
01305 case OPR_ARRSECTION:
01306 case OPR_ARRAYEXP:
01307 case OPR_LDA:
01308 case OPR_LDID:
01309 case OPR_ILOAD:
01310 st = cwh_addr_WN_ST(kid);
01311 return (st);
01312 }
01313 }
01314
01315
01316 default:
01317 DevAssert((OPCODE_is_expression(WN_opcode(wn))),(" Unexpected WN"));
01318 break;
01319 }
01320
01321 return (st) ;
01322 }
01323
01324
01325
01326
01327
01328
01329
01330
01331
01332
01333
01334
01335 extern WN *
01336 cwh_addr_load_WN(WN * awn, OFFSET_64 off, TY_IDX dty)
01337 {
01338 TY_IDX ty ;
01339 TY_IDX ts ;
01340 WN * wn = NULL;
01341
01342 if (dty == 0)
01343 ty = cwh_types_WN_TY(awn,FALSE);
01344 else
01345 ty = dty ;
01346
01347 switch(TY_kind(ty)) {
01348
01349 case KIND_POINTER:
01350 case KIND_SCALAR :
01351 wn = cwh_addr_iload(awn,off,ty);
01352 break ;
01353
01354 case KIND_ARRAY :
01355 ts = cwh_types_scalar_TY(ty);
01356 if (TY_kind(ts) == KIND_STRUCT)
01357 wn = cwh_addr_mload(awn,off,ts, NULL);
01358 else
01359 wn = cwh_addr_iload(awn,off,ts);
01360 break;
01361
01362 case KIND_STRUCT :
01363 ts = cwh_types_scalar_TY(ty);
01364 wn = cwh_addr_mload(awn,off,ts, NULL);
01365 break ;
01366
01367 default:
01368 DevAssert((0),("unimplemented WN load"));
01369 break;
01370 }
01371
01372 return (wn);
01373 }
01374
01375
01376
01377
01378
01379
01380
01381
01382
01383
01384
01385
01386 extern WN *
01387 cwh_addr_load_ST(ST * st, OFFSET_64 off, TY_IDX dty)
01388 {
01389
01390 WN * wn = NULL;
01391 WN * wa;
01392 TY_IDX ts;
01393 TY_IDX ty;
01394
01395 INT fg ;
01396
01397 ty = ST_type(st);
01398 fg = ACCESSED_LOAD;
01399
01400 switch (ST_sclass(st)) {
01401 case SCLASS_FORMAL:
01402 if (dty)
01403 ts = dty;
01404 else if (TY_kind(ty) == KIND_POINTER)
01405 ts = TY_pointed(ty);
01406 else
01407 ts = ty;
01408
01409 if (BY_VALUE(ty)) {
01410 wn = cwh_addr_ldid(st,off,ts);
01411 } else {
01412 wa = cwh_addr_address_ST(st);
01413 wn = cwh_addr_load_WN(wa,off,ts);
01414 }
01415 break ;
01416
01417 case SCLASS_AUTO:
01418 case SCLASS_FSTATIC:
01419 case SCLASS_PSTATIC:
01420 case SCLASS_REG:
01421 case SCLASS_COMMON:
01422 case SCLASS_DGLOBAL:
01423 case SCLASS_FORMAL_REF:
01424
01425 switch(TY_kind(ty)) {
01426
01427 case KIND_POINTER :
01428 fg |= ACCESSED_STORE | ACCESSED_ILOAD | ACCESSED_ISTORE;
01429
01430 case KIND_SCALAR :
01431
01432 ts = (dty ? dty : ty);
01433 if (ST_class(st)==CLASS_VAR && ST_auxst_is_auto_or_cpointer(st)) {
01434
01435 wa = cwh_addr_address_ST(st);
01436 wn = cwh_addr_load_WN(wa,0,ts);
01437 fg |= ACCESSED_ILOAD;
01438 } else {
01439 wn = cwh_addr_ldid(st,off,ts);
01440 }
01441 break ;
01442
01443 case KIND_ARRAY :
01444 wa = cwh_addr_address_ST(st,off);
01445 wn = cwh_addr_load_WN(wa,0,0);
01446 break ;
01447
01448 case KIND_STRUCT :
01449 ts = (dty ? dty : ty);
01450
01451 if (cwh_addr_use_mstid_mldid(st)) {
01452
01453 if (TY_kind(ts) == KIND_POINTER){
01454 fg |= ACCESSED_STORE | ACCESSED_ILOAD | ACCESSED_ISTORE;
01455 }
01456 wn = cwh_addr_ldid(st,off,ts);
01457 }
01458 else {
01459 if (TY_kind(ts) == KIND_SCALAR)
01460 wn = cwh_addr_ldid(st,off,ts);
01461
01462 else if (TY_kind(ts) == KIND_POINTER){
01463 fg |= ACCESSED_STORE | ACCESSED_ILOAD | ACCESSED_ISTORE;
01464 wn = cwh_addr_ldid(st,off,ts);
01465
01466 } else {
01467 wa = cwh_addr_address_ST(st,off,ts);
01468 wn = cwh_addr_load_WN(wa,0,ts);
01469 }
01470 }
01471 break ;
01472
01473 default:
01474 DevAssert((0),("unimplemented ST load"));
01475 break;
01476 }
01477 break ;
01478
01479 default:
01480 DevAssert((0),("Odd ST load"));
01481 break;
01482 }
01483
01484 cwh_addr_access_flags(st,fg);
01485 return (wn);
01486 }
01487
01488
01489
01490
01491
01492
01493
01494
01495
01496
01497
01498 extern WN *
01499 cwh_addr_stid(ST *st, OFFSET_64 off, TY_IDX ty , WN * rhs)
01500 {
01501 WN * wn ;
01502 WN * wt ;
01503 TY_IDX tl ;
01504
01505 TYPE t ;
01506 TYPE_ID bt;
01507 OPCODE op;
01508
01509 #ifdef KEY // bug 7612
01510 if (WN_operator(rhs) == OPR_LDA) {
01511 ST *lda_st = WN_st(rhs);
01512 Set_ST_addr_saved(lda_st);
01513 }
01514 #endif
01515
01516 rhs = cwh_convert_to_ty(rhs, TY_mtype(ty));
01517
01518 if (BIG_OFFSET(off)) {
01519 wn = cwh_addr_lda(st,off,ty);
01520 wn = cwh_addr_istore(wn,0,ty,rhs);
01521
01522 } else {
01523
01524 tl = ty;
01525 bt = TY_mtype(ty) ;
01526
01527 # if ! (defined (linux) || defined(BUILD_OS_DARWIN))
01528 if (IS_ALTENTRY_TEMP(st)) {
01529 if (MTYPE_is_integral(bt)) {
01530 tl = cwh_stab_altentry_TY(st,TRUE);
01531 st = ST_base(st);
01532 bt = TY_mtype(tl);
01533
01534 } else if (! ST_auxst_altentry_shareTY(ST_base(st))) {
01535
01536 if ((bt == MTYPE_C4) && (ST_ofst(st) != 0)) {
01537
01538 op = Stid_Opcode [bt];
01539 wn = WN_CreateStid (op,off,st,ty,WN_COPY_Tree(rhs));
01540 cwh_block_append(wn);
01541
01542 bt = MTYPE_F4;
01543 tl = Be_Type_Tbl(bt);
01544 wt = cwh_convert_to_ty(WN_COPY_Tree(rhs),bt);
01545 op = Stid_Opcode [bt];
01546 wn = WN_CreateStid (op,4,ST_base(st),tl,wt);
01547 cwh_block_append(wn);
01548
01549 t_TY((t)) = cast_to_uint(tl);
01550 cwh_stk_push(rhs,WN_item);
01551 fei_imag(t);
01552 rhs = cwh_stk_pop_WN();
01553 off = 12;
01554 st = ST_base(st);
01555
01556 }
01557 }
01558 }
01559 # endif
01560
01561 op = Stid_Opcode [bt];
01562 wn = WN_CreateStid (op,off,st,tl,rhs);
01563 }
01564
01565 cwh_addr_access_flags(st,ACCESSED_STORE);
01566 return (wn);
01567 }
01568
01569
01570
01571
01572
01573
01574
01575
01576
01577
01578 extern WN *
01579 cwh_addr_istore(WN * lhs, OFFSET_64 off, TY_IDX ty, WN * rhs)
01580 {
01581 WN * wn ;
01582 TY_IDX tp ;
01583 OPCODE op ;
01584
01585 if (cwh_addr_f90_pointer_reference(lhs)) {
01586 tp = cwh_types_mk_f90_pointer_ty(ty);
01587 } else {
01588 tp = cwh_types_make_pointer_type(ty, FALSE);
01589 }
01590
01591 if (BIG_OFFSET(off)) {
01592 lhs = cwh_expr_bincalc(OPR_ADD,lhs,WN_Intconst(Pointer_Mtype,off));
01593 off = 0;
01594 }
01595 rhs = cwh_convert_to_ty(rhs, TY_mtype(ty));
01596 op = Store_Opcode [TY_mtype(ty)];
01597 wn = WN_CreateIstore(op,off,tp,rhs,lhs);
01598
01599 return (wn);
01600 }
01601
01602
01603
01604
01605
01606
01607
01608
01609
01610
01611
01612 extern WN *
01613 cwh_addr_mstore(WN * ad, OFFSET_64 off, TY_IDX ty, WN * rhs)
01614 {
01615 TY_IDX tp ;
01616 WN * wn ;
01617 WN * sz ;
01618
01619 if (cwh_addr_f90_pointer_reference(ad)) {
01620 tp = cwh_types_mk_f90_pointer_ty(ty);
01621 } else {
01622 tp = cwh_types_make_pointer_type(ty, FALSE);
01623 }
01624
01625 if (BIG_OFFSET(off)) {
01626 ad = cwh_expr_bincalc(OPR_ADD,ad,WN_Intconst(Pointer_Mtype,off));
01627 off = 0;
01628 }
01629 sz = WN_CreateIntconst (opc_pint, TY_size(ty)) ;
01630 wn = WN_CreateMstore (off,tp,rhs,ad,sz);
01631
01632 return (wn);
01633 }
01634
01635
01636
01637
01638
01639
01640
01641
01642
01643
01644
01645 extern void
01646 cwh_addr_store_ST(ST * st, OFFSET_64 off, TY_IDX dty, WN * rhs)
01647 {
01648 WN * wn;
01649 WN * wa;
01650 TY_IDX ts;
01651 TY_IDX ty;
01652 INT fg ;
01653
01654 ty = ST_type(st);
01655 fg = ACCESSED_STORE;
01656
01657 switch (ST_sclass(st)) {
01658
01659 case SCLASS_FORMAL:
01660 if (dty)
01661 ts = dty;
01662 else if (TY_kind(ty) == KIND_POINTER)
01663 ts = TY_pointed(ty);
01664 else
01665 ts = ty;
01666
01667 if (BY_VALUE(ty)) {
01668 wn = cwh_addr_stid(st,0,ts,rhs);
01669 cwh_block_append(wn) ;
01670
01671 } else {
01672 wa = cwh_addr_address_ST(st);
01673 cwh_addr_store_WN(wa,off,ts,rhs);
01674 }
01675 break ;
01676
01677 case SCLASS_AUTO:
01678 case SCLASS_PSTATIC:
01679 case SCLASS_FSTATIC:
01680 case SCLASS_REG:
01681 case SCLASS_COMMON:
01682 case SCLASS_DGLOBAL:
01683 case SCLASS_FORMAL_REF:
01684
01685 ts = (dty ? dty : ty);
01686 switch(TY_kind(ty)) {
01687
01688 case KIND_POINTER:
01689 fg |= ACCESSED_LOAD | ACCESSED_ILOAD | ACCESSED_ISTORE;
01690
01691 case KIND_SCALAR :
01692 if (ST_class(st)==CLASS_VAR && ST_auxst_is_auto_or_cpointer(st)) {
01693 wa = cwh_addr_address_ST(st);
01694 cwh_addr_store_WN(wa,off,0,rhs);
01695 fg |= ACCESSED_ISTORE;
01696
01697 } else {
01698 wn = cwh_addr_stid(st,off,ts,rhs);
01699 cwh_block_append(wn) ;
01700
01701
01702
01703
01704 # if ! (defined (linux) || defined(BUILD_OS_DARWIN))
01705 if (IS_ALTENTRY_TEMP(st)) {
01706 if (TY_mtype(ts) == MTYPE_CQ){
01707 if(!ST_auxst_altentry_shareTY(ST_base(st))) {
01708 wn = cwh_addr_load_ST(st,0,NULL);
01709 cwh_addr_store_ST(Altaddress_ST,0,NULL,wn);
01710 }
01711 }
01712 }
01713 # endif
01714
01715
01716
01717
01718
01719
01720 if (still_in_preamble)
01721 cwh_types_copyin_pragma(st);
01722 }
01723 break ;
01724
01725 case KIND_ARRAY:
01726 wa = cwh_addr_address_ST(st,off);
01727 cwh_addr_store_WN(wa,0,0,rhs);
01728 break ;
01729
01730 case KIND_STRUCT:
01731 if ( cwh_addr_use_mstid_mldid(st)) {
01732
01733 if(TY_kind(ts) == KIND_POINTER){
01734 fg |= ACCESSED_LOAD | ACCESSED_ILOAD | ACCESSED_ISTORE;
01735 }
01736 wn = cwh_addr_stid(st,off,ts,rhs);
01737 cwh_block_append(wn) ;
01738
01739 } else {
01740
01741 if (TY_kind(ts) == KIND_SCALAR) {
01742 wn = cwh_addr_stid(st,off,ts,rhs);
01743 cwh_block_append(wn) ;
01744
01745 } else if(TY_kind(ts) == KIND_POINTER){
01746 fg |= ACCESSED_LOAD | ACCESSED_ILOAD | ACCESSED_ISTORE;
01747 wn = cwh_addr_stid(st,off,ts,rhs);
01748 cwh_block_append(wn) ;
01749
01750 } else {
01751 wa = cwh_addr_address_ST(st,off);
01752 cwh_addr_store_WN(wa,0,ts,rhs);
01753 }
01754 }
01755 break ;
01756
01757 default:
01758 DevAssert((0),("Odd ST store"));
01759 break;
01760 }
01761 break ;
01762
01763 default:
01764 DevAssert((0),("Odd ST store"));
01765 break;
01766 }
01767 cwh_addr_access_flags(st,fg);
01768 }
01769
01770
01771
01772
01773
01774
01775
01776
01777
01778
01779
01780
01781
01782
01783 extern void
01784 cwh_addr_store_WN(WN * lhs, OFFSET_64 off, TY_IDX dty, WN * rhs)
01785 {
01786 #ifdef KEY
01787 WN * wn = 0;
01788 #else
01789 WN * wn ;
01790 #endif
01791 TY_IDX ts ;
01792 TY_IDX ty ;
01793
01794 if (dty)
01795 ty = dty ;
01796 else
01797 ty = cwh_types_WN_TY(lhs,FALSE);
01798
01799 switch(TY_kind(ty)) {
01800
01801 case KIND_SCALAR:
01802 case KIND_POINTER:
01803 wn = cwh_addr_istore(lhs,off,ty,rhs);
01804 break ;
01805
01806 case KIND_ARRAY:
01807 ts = cwh_types_scalar_TY(ty);
01808 if (TY_kind(ts) == KIND_STRUCT)
01809 wn = cwh_addr_mstore(lhs,off,ts,rhs);
01810 else
01811 wn = cwh_addr_istore(lhs,off,ts,rhs);
01812 break;
01813
01814 case KIND_STRUCT:
01815 wn = cwh_addr_mstore(lhs,off,ty,rhs);
01816 break ;
01817
01818 default:
01819 DevAssert((0),("Odd WN store"));
01820 }
01821
01822 cwh_block_append(wn) ;
01823 }
01824
01825
01826
01827
01828
01829
01830
01831
01832
01833
01834
01835
01836
01837
01838
01839
01840
01841
01842
01843
01844 extern WN *
01845 cwh_addr_address_ST(ST * st, OFFSET_64 off, TY_IDX ty)
01846 {
01847 WN * wn ;
01848 INT fg ;
01849 TY_IDX tp;
01850
01851 if (ty == 0) {
01852 if (ST_class(st) == CLASS_FUNC)
01853 ty = ST_pu_type(st);
01854 else
01855 ty = ST_type(st);
01856 }
01857
01858 switch (ST_sclass(st)){
01859 case SCLASS_FORMAL:
01860
01861 DevAssert((TY_kind(ty) == KIND_POINTER),("formal & non-pointer"));
01862
01863 wn = cwh_addr_ldid(st,0,ty);
01864 if (off != 0)
01865 wn = cwh_expr_bincalc(OPR_ADD,wn,WN_Intconst(Pointer_Mtype,off));
01866
01867 fg = ACCESSED_LOAD|ACCESSED_ILOAD|ACCESSED_ISTORE ;
01868 cwh_addr_access_flags(st,fg);
01869 break;
01870
01871 default:
01872 if (Has_Base_Block(st) && ST_auxst_is_auto_or_cpointer(st)) {
01873
01874 tp = cwh_types_make_pointer_type(ty,FALSE);
01875 wn = cwh_addr_ldid(ST_base(st),0,tp);
01876 if (off != 0)
01877 wn = cwh_expr_bincalc(OPR_ADD,wn,WN_Intconst(Pointer_Mtype,off));
01878 } else {
01879 wn = cwh_addr_lda(st,off,ty) ;
01880 }
01881 break;
01882 }
01883
01884 return (wn);
01885 }
01886
01887
01888
01889
01890
01891
01892
01893
01894
01895
01896 static WN *
01897 cwh_addr_lda(ST * st, OFFSET_64 off, TY_IDX ty)
01898 {
01899 TY_IDX tp ;
01900 WN * wn ;
01901 INT fg ;
01902
01903 tp = cwh_types_make_pointer_type(ty, FALSE);
01904
01905
01906
01907 if (BIG_OFFSET(off)) {
01908 wn = WN_CreateLda (opc_lda,0,tp,st);
01909 wn = cwh_expr_bincalc(OPR_ADD,wn,WN_Intconst(Pointer_Mtype,off));
01910
01911 } else {
01912 wn = WN_CreateLda (opc_lda,off,tp,st);
01913 }
01914
01915 fg = ACCESSED_LOAD|ACCESSED_ILOAD ;
01916 cwh_addr_access_flags(st,fg);
01917
01918 return (wn);
01919 }
01920
01921
01922
01923
01924
01925
01926
01927
01928
01929
01930 static WN *
01931 cwh_addr_triplet(WN *lb,WN *ub,WN *str)
01932 {
01933 WN * wn ;
01934
01935 wn = WN_Create (opc_triplet, 3) ;
01936 WN_kid0(wn) = lb;
01937 WN_kid2(wn) = cwh_addr_extent(lb,ub,str);
01938 WN_kid1(wn) = str;
01939
01940 return (wn);
01941 }
01942
01943
01944
01945
01946
01947
01948
01949
01950
01951
01952
01953 static WN *
01954 cwh_addr_zero_based(WN *sub, WN * lb)
01955 {
01956
01957 if (cwh_addr_is_triplet(sub))
01958 WN_kid0(sub) = cwh_expr_bincalc(OPR_SUB,WN_kid0(sub),lb);
01959 else
01960 sub = cwh_expr_bincalc(OPR_SUB,sub,lb);
01961
01962 return (sub);
01963 }
01964
01965
01966
01967
01968
01969
01970
01971
01972
01973
01974 extern WN *
01975 cwh_addr_extent(WN * lb, WN * ub, WN * str)
01976 {
01977 WN * wt ;
01978 WN * wub ;
01979 WN * wlb ;
01980 WN * ws1 ;
01981 WN * ws2 ;
01982
01983 ws1 = WN_COPY_Tree(str) ;
01984 ws2 = WN_COPY_Tree(str);
01985 wlb = WN_COPY_Tree(lb) ;
01986 wub = WN_COPY_Tree(ub);
01987
01988 wt = cwh_expr_bincalc(OPR_SUB,wub,wlb);
01989 wt = cwh_expr_bincalc(OPR_ADD,wt,ws1);
01990 wt = cwh_expr_bincalc(OPR_DIV,wt,ws2);
01991
01992 return (wt);
01993 }
01994
01995
01996
01997
01998
01999
02000
02001
02002
02003 extern WN *
02004 cwh_addr_ubound_from_triplet(WN * triplet)
02005 {
02006 WN *lb;
02007 WN *st;
02008 WN *ex;
02009 WN *ub;
02010
02011 lb = WN_COPY_Tree(WN_kid0(triplet));
02012 st = WN_COPY_Tree(WN_kid1(triplet));
02013 ex = WN_COPY_Tree(WN_kid2(triplet));
02014
02015
02016 ex = cwh_expr_bincalc(OPR_SUB,ex,WN_Intconst(cwh_bound_int_typeid,1));
02017
02018 ub = cwh_expr_bincalc(OPR_MPY,ex,st);
02019 ub = cwh_expr_bincalc(OPR_ADD,ub,lb);
02020
02021 return (ub);
02022 }
02023
02024
02025
02026
02027
02028
02029
02030
02031
02032
02033
02034
02035
02036
02037
02038 static WN *
02039 cwh_addr_adjust_array(WN *wn, TY_IDX ty)
02040 {
02041
02042 WN * sz ;
02043 WN * extent;
02044 TY_IDX tl ;
02045 INT i,ndim;
02046
02047 ndim = WN_num_dim(wn);
02048
02049 WN_element_size(wn) = -1;
02050
02051 if (TY_kind(TY_AR_etype(ty)) == KIND_ARRAY) {
02052
02053 tl = TY_AR_etype(ty);
02054
02055 sz = cwh_types_bound_WN(tl,0,UPPER);
02056 for (i=ndim-1; i >= 0; i--) {
02057 extent = WN_array_dim(wn,i);
02058 WN_array_dim(wn,i) = sz;
02059 sz = cwh_expr_bincalc(OPR_MPY,extent,WN_COPY_Tree(sz));
02060 }
02061 WN_DELETE_Tree(sz);
02062 }
02063
02064 return(wn);
02065 }
02066
02067
02068
02069
02070
02071
02072
02073
02074
02075
02076 extern FLD_det
02077 cwh_addr_offset(void)
02078 {
02079 FLD_det det ;
02080 FLD_HANDLE fld (cwh_stk_pop_FLD());
02081
02082 det.off = FLD_ofst(fld);
02083 det.type = FLD_type(fld);
02084
02085 while (cwh_stk_get_class() == FLD_item)
02086 det.off += FLD_ofst(FLD_HANDLE (cwh_stk_pop_FLD()));
02087
02088 return(det);
02089 }
02090
02091
02092
02093
02094
02095
02096
02097
02098
02099 extern BOOL
02100 cwh_addr_is_array(WN * wn)
02101 {
02102 return(WN_opcode(wn) == opc_array);
02103 }
02104 extern BOOL
02105 cwh_addr_is_section(WN * wn)
02106 {
02107 return(WN_opcode(wn) == opc_section);
02108 }
02109 static BOOL
02110 cwh_addr_is_triplet(WN * wn)
02111 {
02112 return(WN_opcode(wn) == opc_triplet);
02113 }
02114
02115
02116
02117
02118
02119
02120
02121
02122
02123
02124
02125
02126
02127
02128
02129
02130 extern WN *
02131 cwh_addr_find_section(WN * awn , enum p_flag flag)
02132 {
02133 WN * wn = NULL ;
02134
02135 if (awn == NULL)
02136 return (wn);
02137
02138 switch (WNOPR(awn)){
02139 case OPR_ARRSECTION:
02140 wn = awn ;
02141 break;
02142
02143 case OPR_ARRAYEXP:
02144 wn = cwh_addr_find_section(WN_kid0(awn),flag);
02145 break;
02146
02147 case OPR_ARRAY:
02148 case OPR_ILOAD:
02149 case OPR_MLOAD:
02150 wn = cwh_addr_find_section(WN_kid0(awn),flag);
02151 if (wn == WN_kid0(awn))
02152 if (flag == p_RETURN_PARENT)
02153 wn = awn;
02154
02155 break;
02156
02157 case OPR_ADD:
02158 case OPR_SUB:
02159 wn = cwh_addr_find_section(WN_kid0(awn),flag);
02160
02161 if (wn == WN_kid0(awn))
02162 if (flag == p_RETURN_PARENT)
02163 wn = awn;
02164
02165 if (wn == NULL) {
02166 wn = cwh_addr_find_section(WN_kid1(awn),flag);
02167 if (wn == WN_kid1(awn)) {
02168 if (flag == p_RETURN_PARENT)
02169 wn = awn;
02170 }
02171 }
02172 break;
02173
02174 default:
02175 wn = NULL;
02176 break;
02177 }
02178 return(wn) ;
02179 }
02180
02181
02182
02183
02184
02185
02186
02187
02188
02189
02190 extern WN *
02191 cwh_addr_find_address(WN * wn)
02192 {
02193
02194 switch (WNOPR(wn)){
02195 case OPR_ILOAD:
02196 case OPR_MLOAD:
02197 case OPR_LDA:
02198 break;
02199
02200 case OPR_ARRAY:
02201 case OPR_ARRSECTION:
02202 case OPR_ARRAYEXP:
02203 wn = cwh_addr_find_address(WN_kid0(wn));
02204 break ;
02205
02206 case OPR_LDID:
02207 break ;
02208
02209 default:
02210 if (OPCODE_is_expression(WN_opcode(wn)))
02211 wn = cwh_addr_find_address(WN_kid0(wn));
02212
02213 }
02214 return(wn) ;
02215 }
02216
02217
02218
02219
02220
02221
02222
02223
02224
02225
02226
02227
02228
02229
02230
02231
02232
02233
02234
02235
02236
02237
02238
02239 static W_node
02240 cwh_addr_substr_util(OFFSET_64 off, TY_IDX dty )
02241 {
02242 TY_IDX ty ;
02243 TY_IDX te ;
02244 ST * st ;
02245 WN * ad ;
02246 W_node r;
02247
02248 ty = dty ;
02249
02250 if (cwh_stk_get_class() == ST_item || cwh_stk_get_class() == ST_item_whole_array) {
02251
02252 st = cwh_stk_pop_ST();
02253 if (ty == 0)
02254 ty = ST_type(st);
02255 ad = cwh_addr_address_ST(st,off,ty);
02256
02257 ty = cwh_types_array_TY(ty);
02258
02259 } else {
02260
02261 ad = cwh_expr_address(f_NONE);
02262
02263 if (ty == 0) {
02264 ty = cwh_types_WN_TY(ad,TRUE);
02265 ty = cwh_types_array_TY(ty);
02266 }
02267
02268 if (WNOPR(ad) == OPR_ARRSECTION || WNOPR(ad) == OPR_ARRAY)
02269 if (WN_element_size(ad) == 0)
02270 ad = cwh_addr_adjust_array(ad,ty);
02271
02272 ad = cwh_expr_bincalc(OPR_ADD,ad,WN_Intconst(Pointer_Mtype,off));
02273 }
02274
02275 te = ty ;
02276 if (TY_kind(TY_AR_etype(ty)) == KIND_ARRAY)
02277 te = TY_AR_etype(ty);
02278
02279 W_wn(r) = cwh_addr_array(opc_array,ad,te);
02280 W_ty(r) = ty;
02281
02282 return(r);
02283 }
02284
02285
02286
02287
02288
02289
02290
02291
02292
02293
02294
02295
02296 extern WN *
02297 cwh_addr_temp_section(WN * ad, TY_IDX ty)
02298 {
02299 WN * ar;
02300 WN * lb;
02301 WN * ub;
02302 WN * sz;
02303 WN * szmult;
02304 #ifdef KEY
02305 TY_IDX aty = 0;
02306 #else
02307 TY_IDX aty;
02308 #endif
02309 BOOL noncontig;
02310 INT32 ndims;
02311
02312
02313 INT16 i ;
02314
02315 ar = cwh_addr_array(opc_section,ad,ty);
02316 if (WN_element_size(ar) <= 0) {
02317 aty = TY_AR_etype(cwh_types_array_TY(ty));
02318 noncontig = TRUE;
02319 } else {
02320 noncontig = FALSE;
02321 }
02322
02323 ndims = TY_AR_ndims(Ty_Table[ty]);
02324
02325 if (noncontig) {
02326 WN_element_size(ar) = -1;
02327 sz = cwh_types_bound_WN(aty,0,UPPER);
02328 for (i = ndims-1 ; i >= 0 ; i--) {
02329 lb = cwh_types_bound_WN(ty,i,LOW);
02330 ub = cwh_types_bound_WN(ty,i,UPPER);
02331 szmult = cwh_expr_bincalc(OPR_ADD,
02332 cwh_addr_zero_based(WN_COPY_Tree(ub),WN_COPY_Tree(lb)),
02333 WN_Intconst(cwh_bound_int_typeid,1)) ;
02334
02335 lb = cwh_addr_triplet(lb,ub,WN_Intconst(cwh_bound_int_typeid,1)) ;
02336 ar = cwh_addr_add_bound(ar,WN_COPY_Tree(sz),lb);
02337 sz = cwh_expr_bincalc(OPR_MPY,sz,szmult);
02338 }
02339 WN_DELETE_Tree(sz);
02340 } else {
02341 for (i = ndims-1 ; i >= 0 ; i--) {
02342 lb = cwh_types_bound_WN(ty,i,LOW);
02343 ub = cwh_types_bound_WN(ty,i,UPPER);
02344 sz = cwh_expr_bincalc(OPR_ADD,
02345 cwh_addr_zero_based(WN_COPY_Tree(ub),WN_COPY_Tree(lb)),
02346 WN_Intconst(cwh_bound_int_typeid,1)) ;
02347
02348 lb = cwh_addr_triplet(lb,ub,WN_Intconst(cwh_bound_int_typeid,1)) ;
02349 ar = cwh_addr_add_bound(ar,sz,lb);
02350 }
02351 }
02352 return(ar);
02353 }
02354
02355
02356
02357
02358
02359
02360
02361
02362
02363
02364
02365
02366
02367
02368
02369
02370 extern void
02371 cwh_addr_nonc_util(WN **aa, WN **bb)
02372 {
02373 WN *a ;
02374 WN *b ;
02375 WN *wn ;
02376 WN *as ;
02377 WN *bs ;
02378 WN *pa ;
02379
02380 WN *s1d ;
02381 WN *p1d ;
02382 WN **a1d ;
02383 WN *snd ;
02384
02385 INT16 ar ;
02386 INT16 br ;
02387
02388 a = *aa;
02389 b = *bb;
02390 as = cwh_addr_find_section(a,p_RETURN_SECTION);
02391 bs = cwh_addr_find_section(b,p_RETURN_SECTION);
02392
02393 DevAssert((as != NULL), ("missing section"));
02394 DevAssert((bs != NULL), ("missing section"));
02395
02396 ar = WN_kid_count(as);
02397 br = WN_kid_count(bs);
02398
02399
02400
02401
02402 if (ar == br )
02403 return ;
02404
02405 if (ar < br ) {
02406
02407 s1d = as ;
02408 p1d = a ;
02409 a1d = aa ;
02410 snd = bs ;
02411
02412
02413 } else {
02414
02415 s1d = bs ;
02416 p1d = b ;
02417 a1d = bb ;
02418 snd = as ;
02419 }
02420
02421 pa = cwh_addr_find_section(p1d,p_RETURN_PARENT);
02422 wn = cwh_addr_nonc_recast(s1d,snd) ;
02423
02424 if (pa != s1d) {
02425
02426 if (WN_kid0(pa) == s1d)
02427 WN_kid0(pa) = wn;
02428 else
02429 WN_kid1(pa) = wn;
02430
02431 wn = NULL;
02432 } else
02433 *a1d = wn ;
02434 }
02435
02436
02437
02438
02439
02440
02441
02442
02443
02444
02445
02446
02447
02448
02449 static WN *
02450 cwh_addr_nonc_recast(WN *wt, WN *wa)
02451 {
02452 WN * wn ;
02453 WN * sc0 ;
02454 WN * sc1 ;
02455 WN * zr0 ;
02456 WN * one ;
02457 WN * lin ;
02458
02459 INT16 nk ;
02460 INT16 i ;
02461
02462 BOOL dope ;
02463
02464 nk = WN_kid_count(wa);
02465 wn = WN_Create (opc_section,nk);
02466 WN_element_size(wn) = WN_element_size(wt) ;
02467
02468 dope = (WN_element_size(wa) < 0) ;
02469
02470 WN_kid(wn,0) = WN_kid(wt,0);
02471 WN_kid(wt,0) = NULL;
02472
02473 DevAssert((WN_kid_count(wt) == 3),(" Not 1d"));
02474
02475 FOREACH_AXIS(i,nk) {
02476
02477
02478
02479 if (dope) {
02480 sc0 = WN_kid(wa,i+SUB_OFF(nk));
02481
02482 if (WNOPR(sc0) == OPR_ARRAYEXP)
02483 sc0 = WN_kid(sc0,1);
02484
02485 else {
02486 DevAssert((WNOPR(sc0) == OPR_TRIPLET),("nonc rhs"));
02487 sc0 = WN_COPY_Tree(WN_kid2(sc0));
02488 }
02489
02490 } else
02491 sc0 = WN_COPY_Tree(WN_kid(wa,i+SZ_OFF(nk))) ;
02492
02493 sc1 = WN_COPY_Tree(sc0);
02494 zr0 = WN_Intconst(cwh_bound_int_typeid,0);
02495 one = WN_Intconst(cwh_bound_int_typeid,1);
02496 sc1 = cwh_expr_bincalc(OPR_SUB,sc1,one);
02497 one = WN_Intconst(cwh_bound_int_typeid,1);
02498
02499 WN_kid(wn,i+SZ_OFF(nk)) = sc0;
02500 WN_kid(wn,i+SUB_OFF(nk)) = cwh_addr_triplet(zr0,sc1,one);
02501 }
02502
02503
02504
02505
02506 DevAssert((WNOPR(WN_kid(wt,1+SUB_OFF(2))) == OPR_TRIPLET),(" No triplet"));
02507
02508 lin = WN_kid0(WN_kid(wt,1+SUB_OFF(2)));
02509
02510 if ((WNOPR(lin) != OPR_INTCONST) ||
02511 (WN_const_val(lin) != 0)) {
02512
02513 lin = WN_COPY_Tree(lin);
02514 lin = cwh_expr_bincalc(OPR_MPY,lin,WN_CreateIntconst(opc_pint,WN_element_size(wt)));
02515 wn = cwh_expr_bincalc(OPR_ADD,lin,wn);
02516 }
02517
02518 WN_DELETE_Tree(wt);
02519 return wn ;
02520 }
02521
02522
02523
02524
02525
02526
02527
02528
02529
02530
02531 static void
02532 cwh_addr_access_flags(ST *st , INT fg)
02533 {
02534
02535 if (IN_NESTED_PU)
02536 if (HOST_ASSOCIATED(st)) {
02537 cwh_stab_add_pragma(st,(WN_PRAGMA_ACCESSED_FLAGS) fg ) ;
02538 }
02539 }
02540
02541
02542
02543
02544
02545
02546
02547
02548
02549
02550
02551
02552 extern void
02553 cwh_addr_init_target(void)
02554 {
02555
02556 if (Pointer_Size == 4) {
02557
02558 opc_lda = OPC_U4LDA;
02559 opc_call = OPC_U4CALL ;
02560 opc_array = OPC_U4ARRAY;
02561 opc_pint = OPC_U4INTCONST;
02562 opc_sint = OPC_I4INTCONST;
02563 opc_section = OPC_U4ARRSECTION;
02564 opc_triplet = OPC_I4TRIPLET ;
02565 cwh_addr_char_len_typeid = MTYPE_I4;
02566 cwh_bound_int_typeid = MTYPE_I4;
02567 cwh_doloop_typeid = MTYPE_I4;
02568
02569 } else {
02570
02571 opc_lda = OPC_U8LDA;
02572 opc_call = OPC_U8CALL ;
02573 opc_pint = OPC_U8INTCONST;
02574 opc_sint = OPC_I8INTCONST;
02575 opc_array = OPC_U8ARRAY;
02576 opc_section = OPC_U8ARRSECTION;
02577 opc_triplet = OPC_I8TRIPLET ;
02578 cwh_addr_char_len_typeid = MTYPE_I4;
02579 cwh_bound_int_typeid = MTYPE_I8;
02580 cwh_doloop_typeid = MTYPE_I8;
02581 }
02582 cwh_types_init_target();
02583 }
02584
02585
02586
02587
02588
02589
02590
02591
02592
02593
02594
02595
02596
02597
02598
02599
02600
02601
02602 static BOOL cwh_addr_f90_pointer_reference_ls(WN * ls)
02603 {
02604 OPERATOR opr;
02605 INT i,nkids;
02606 BOOL r;
02607
02608 opr = WN_operator(ls);
02609 switch (opr) {
02610 case OPR_LDID:
02611 case OPR_LDA:
02612 return (FALSE);
02613
02614 case OPR_ILOAD:
02615 case OPR_MLOAD:
02616 return ( cwh_addr_f90_pointer_reference(WN_kid0(ls)));
02617
02618 case OPR_ISTORE:
02619 case OPR_MSTORE:
02620 return ( cwh_addr_f90_pointer_reference(WN_kid1(ls)));
02621
02622 default:
02623 nkids = WN_kid_count(ls);
02624 r = FALSE;
02625 for (i=0 ; i < nkids; i++) {
02626 r |= cwh_addr_f90_pointer_reference(WN_kid(ls,i));
02627 }
02628 return (r);
02629 }
02630 }
02631
02632 extern BOOL
02633 cwh_addr_f90_pointer_reference(WN * addr)
02634 {
02635 OPERATOR opr;
02636 ST *st;
02637 opr = WN_operator(addr);
02638
02639 switch (opr) {
02640 case OPR_LDID:
02641 st = WN_st(addr);
02642 if (ST_class(st) == CLASS_VAR) {
02643 return (ST_auxst_is_f90_pointer(st));
02644 }
02645 return (FALSE);
02646
02647 case OPR_LDA:
02648 #if 0
02649 st = WN_st(addr);
02650 if (ST_class(st) == CLASS_VAR) {
02651 return (ST_auxst_is_f90_pointer(st));
02652 }
02653 #endif
02654 return (FALSE);
02655
02656 case OPR_ILOAD:
02657 if (TY_is_f90_pointer(WN_load_addr_ty(addr)) ||
02658 TY_is_f90_pointer(TY_pointed(WN_load_addr_ty(addr)))) {
02659 return (TRUE);
02660 }
02661 return (FALSE);
02662
02663 case OPR_ARRSECTION:
02664 case OPR_ARRAY:
02665 case OPR_ARRAYEXP:
02666 return (cwh_addr_f90_pointer_reference(WN_kid0(addr)));
02667
02668 case OPR_INTCONST:
02669 return (FALSE);
02670
02671 default:
02672
02673 return ( cwh_addr_f90_pointer_reference_ls (addr));
02674 }
02675 }
02676
02677
02678 extern void
02679 fei_field_dot(TYPE type)
02680 {
02681
02682 return;
02683 }