http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59999
--- Comment #8 from Paulo J. Matos <pa...@matos-sorge.com> --- (In reply to Paulo J. Matos from comment #7) > (In reply to Richard Biener from comment #5) > > Apart from expand there is the redundant-extension-elimination, ree.c. > > In expand we get the following gimple for the loop: > ;; basic block 4, loop depth 0 > ;; pred: 2 > ;; 4 > # i_15 = PHI <0(2), i_12(4)> > # _18 = PHI <0(2), _4(4)> > _6 = arr[_18]; > _7 = _6 + 1; > arr[_18] = _7; > _17 = (unsigned short) i_15; > _13 = _17 + 1; > i_12 = (short int) _13; > _4 = (int) i_12; > if (_4 < limit_5(D)) > goto <bb 4>; > else > goto <bb 3>; > ;; succ: 4 > ;; 3 > > > Where _13 is an unsigned short and what we want to eliminate is this sign > extend: > _4 = (int) i_12; > > This doesn't seem trivial in the expand phase because to eliminate the sign > expand, you promote i_12 to int and have then to promote a bunch of other > variables, whose insn have been already emitted when you get here. Shouldn't > this be ivopts noticing that if it generates an int IV, it saves a sign > extend and therefore is better? Made a mistake. With the attached test, the final gimple before expand for the loop basic block is: ;; basic block 5, loop depth 0 ;; pred: 5 ;; 4 # i_26 = PHI <i_1(5), 0(4)> # ivtmp.24_18 = PHI <ivtmp.24_12(5), ivtmp.24_29(4)> _28 = (void *) ivtmp.24_18; _13 = MEM[base: _28, offset: 0B]; x.4_14 = x; _15 = _13 ^ x.4_14; MEM[base: _28, offset: 0B] = _15; ivtmp.24_12 = ivtmp.24_18 + 4; temp_ptr.5_17 = (Sample *) ivtmp.24_12; _11 = (unsigned short) i_26; _2 = _11 + 1; i_1 = (short int) _2; _10 = (int) i_1; if (_10 < _25) goto <bb 5>; else goto <bb 6>; ;; succ: 5 ;; 6 However, the point is the same. IVOPTS should probably generate an int IV instead of a short int IV to avoid the sign extend since removing the sign extend during RTL seems to be quite hard. What do you think?