From: ameline@vnet.ibm.com (Ian Ameline)
Date: Thu, 8 Oct 92 14:35:48 EDT
Subject: Re: OS/2, my final analysis.
Newsgroups: comp.os.os2.advocacy
Organization: C-Set/2 Development, IBM Canada Lab.
Disclaimer: This posting represents the poster's views, not those of IBM

In article <1992Oct8.150454.13736@njitgw.njit.edu>,
dic5340@hertz.njit.edu (David Charlap) writes:
>
>In article <1992Oct6.010321.37312@ns1.cc.lehigh.edu> sjb5@ns1.cc.lehigh.edu (STACY JOHN BEHRENS) writes:
>>In article <1992Sep30.175139.22736@solaris.rz.tu-clausthal.de>, ch@sg1502.chemie.uni-marburg.de (Christoph H. Hochstaetter) writes:
>>>I have almost no time for my development work, because I am busy to
>>>install all those bugfixes and CSDs, e.g. for the C-Compiler there
>>>is already CSD Level 14 for a 6 month old product and it still does
>>>not work reliable.
>>
>>Right.  I'm going to assume the this is sacasm.
>
>I hope so.  I mean, IBM's last CSD for OS/2 1.3 was level WR05050.  I
>hope he wouldn't think that IBM released over 5,000 patches!
>--

   C-Set/2 CSD numbers bear some relation to how many revisions, but not
much -- these are the build numbers since GA. If a build fails due to a
LAN error (like 12, 13, 16, 18 & 19), or an error is setting up the
build tools, or the environment on any of the build machines on the LAN
is in error (1 through 6) if the test dept finds anything strange -- We
increment the number -- the only ones shipped out are 8, 9, 14, 17 (to
1 customer with a critical situation) and now 22 (the latest). Note that
each of these is not a "revision". The only changes made were the bug
fixes documented in the CSDFIXES.LST file that comes with the CSD. Each
bug fix consists on average of less than 5 lines of code changed in the
compiler. As of CSD 14 there were 32 fixes, for a total delta of well
under 200 lines of code -- less than 75 of them being related to
optimization problems. Hardly the 14'th revision of the optimizer...

   Just so we're dealing with facts here, and not speculation, below is
the complete list of all bugs reported before Sept 26/92, and all other
changes made to the compiler, debugger or run-time library since GA.
Note that _ALL_ of the bugs reported are fixed (Including The one Brian
reported -- PJ05431), and that the fixes are available free of charge.

  Note that of the 47 items below, 13 are optimization problems where the
compiler generated incorrect code, and 3 are traps in the optimizer
itself. When you combine the compiler, run-time, and debugger, you get
about a quarter of a million lines of C --- and 42 errors reported to
date. (5 items are performance/minor functional enhancements)

Regards,
Ian Ameline.

  C SET/2 RELEASE 1.0 FIXES:
  +-----------+---------------------------------------------------------------+
  | APAR      | PROBLEM DESCRIPTION                                           |
  | NUMBER    |                                                               |
  +-----------+---------------------------------------------------------------+
1 | PJ03523   | Optimization problem: bad register selection causes general   |
  |           | protection fault at runtime.                                  |
  +-----------+---------------------------------------------------------------+
2 | PJ03662   | Optimization problem: bad register selection around a call    |
  |           | causes incorrect output at runtime.                           |
  +-----------+---------------------------------------------------------------+
3 | PJ03682   | Optimization problem: tail call optimization was altering a   |
  |           | register erroneously.                                         |
  +-----------+---------------------------------------------------------------+
4 | PJ03767   | The compiler could not open files with names containing DBCS  |
  |           | characters where the second byte of the characters was 0x5C.  |
  +-----------+---------------------------------------------------------------+
5 | PJ03923   | Optimization problem: generated floating-point code was       |
  |           | causing the floating point register stack to overflow or      |
  |           | underflow.                                                    |
  +-----------+---------------------------------------------------------------+
6 | PJ03948   | Optimization problem: multiplying by constant negative        |
  |           | numbers which are powers of 2 was causing incorrect code to   |
  |           | be generated.                                                 |
  +-----------+---------------------------------------------------------------+
7 | PJ03952   | Optimization problem: multiplying by constants that are near  |
  |           | powers of 2 was causing incorrect code to be generated.       |
  +-----------+---------------------------------------------------------------+
8 | PJ03957   | Compiler was emitting object records longer than the linker's |
  |           | 1024 byte limit.  This causes the linker to produce the       |
  |           | message "L1057: data record too large".  NOTE: There is more  |
  |           | than one cause for this symptom and there is another fix      |
  |           | coming soon.                                                  |
  +-----------+---------------------------------------------------------------+
9 | NOAPAR    | Compile time performance was improved.                        |
  +-----------+---------------------------------------------------------------+
10| NOAPAR    | The compiler was unable to find files in a subdirectory on a  |
  |           | LAN drive.                                                    |
  +-----------+---------------------------------------------------------------+
11| PJ04295   | The kbhit library function was not working.                   |
  +-----------+---------------------------------------------------------------+
12| PJ04465   | The cprintf, fprintf, printf, and sprintf functions were not  |
  |           | printing floating-point values between 0.5 and 1.0 correctly  |
  |           | when zero precision was specified.                            |
  +-----------+---------------------------------------------------------------+
13| PJ04602   | Optimization problem: simple loops with induction variable    |
  |           | increments greater than one were being incorrectly turned     |
  |           | into memset or memcpy builtin function calls.                 |
  +-----------+---------------------------------------------------------------+
14| PJ04604   | When the compiler turned switch statements into jump tables,  |
  |           | the default code segment was always being referenced even if  |
  |           | the function containing the switch statement was specified in |
  |           | an alloc_text pragma.                                         |
  +-----------+---------------------------------------------------------------+
15| PJ04652   | Optimization problem: the stack pointer was not being decre-  |
  |           | mented before an indirect _Optlink call where the return      |
  |           | value was being used as a parameter to a tail call.           |
  +-----------+---------------------------------------------------------------+
16| PJ04674   | When #pragma handler was specified for a 32-bit callback      |
  |           | function the compiler generated bad code for copying the      |
  |           | parameters from the 16-bit stack to the 32-bit stack.         |
  +-----------+---------------------------------------------------------------+
17| PJ04811   | Incorrect code was being generated for a complicated          |
  |           | expression where a short variable was being added to the      |
  |           | address of an element of an array of structures.              |
  +-----------+---------------------------------------------------------------+
18| PJ05088   | Optimization problem: the compiler was trapping when opti-    |
  |           | mizing a loop containing a divide and modulo operation with   |
  |           | the same operands.                                            |
  +-----------+---------------------------------------------------------------+
19| PJ05100   | Optimization problem: incorrect code was being generated for  |
  |           | a switch statement containing a case zero where the switch    |
  |           | variable had to be converted to an int from an unsigned char. |
  +-----------+---------------------------------------------------------------+
20| PJ05124   | Incorrect code was being generated when the result of com-    |
  |           | paring two shorts with less than or greater than operators    |
  |           | was stored into an integer variable.                          |
  +-----------+---------------------------------------------------------------+
21| PJ05140   | Incorrect code was being generated for _Optlink functions     |
  |           | that have a number of floating-point or aggregate parameters  |
  |           | followed by integer parameters.                               |
  +-----------+---------------------------------------------------------------+
22| PJ05013   | The compiler was trapping when trying to compile a compli-    |
  |           | cated expression where the address of an element of an array  |
  |           | of structures was indexed and then a member of the structure  |
  |           | was accessed.                                                 |
  +-----------+---------------------------------------------------------------+
23| PJ04674   | The problem with #pragma handler on callback functions was    |
  |           | really only a problem with _Far16 _Cdecl callback functions.  |
  |           | So the fix in CSD0011 broke the case where #pragma handler    |
  |           | was used on a _Far16 _Pascal callback function.  Now both     |
  |           | work.                                                         |
  +-----------+---------------------------------------------------------------+
24| PJ04390   | The C runtime termination routine was not freeing all storage |
  |           | allocated during initialization.                              |
  +-----------+---------------------------------------------------------------+
25| PJ05087   | Partial static initialization of a structure containing a     |
  |           | union containing a structure containing bitfields was not     |
  |           | working.                                                      |
  +-----------+---------------------------------------------------------------+
26| NOAPAR    | Some enhancements were made to the compiler to reduce memory  |
  |           | usage during compilation and therefore reduce compile times.  |
  +-----------+---------------------------------------------------------------+
27| PJ05087   | The assembler listing was incorrect after the real problem    |
  |           | was fixed in CSD0013.                                         |
  +-----------+---------------------------------------------------------------+
28| PJ05225   | Optimization problem: the compiler was trapping when opti-    |
  |           | mizing a procedure containing a loop nested within another    |
  |           | loop where an invariant in the inner loop was an induction    |
  |           | variable for the outer loop.                                  |
  +-----------+---------------------------------------------------------------+
29| PJ05230   | Optimization problem: incorrect code was generated for an     |
  |           | _Optlink function containing a loop where an invariant was a  |
  |           | register parameter and it was used in a conditional           |
  |           | expression within the loop.                                   |
  +-----------+---------------------------------------------------------------+
30| PJ05393   | Optimization problem: the compiler was trapping when com-     |
  |           | piling code with consecutive calls to strcat with the same    |
  |           | first parameter.                                              |
  +-----------+---------------------------------------------------------------+
31| PJ05431   | Optimization problem: the compiler was incorrectly removing a |
  |           | store to a local variable before a loop.                      |
  +-----------+---------------------------------------------------------------+
32| PJ05450   | The thunk prolog routine was using 64K too much stack in      |
  |           | certain situations.                                           |
  +-----------+---------------------------------------------------------------+
  | NOTE:  The fixes listed above were included in CSD0014.                   |
  +-----------+---------------------------------------------------------------+
33| PJ05303   | Optimization problem: a parameter in an _Optlink function     |
  |           | that was assigned to a global register was not being kept     |
  |           | alive long enough.                                            |
  +-----------+---------------------------------------------------------------+
34| PJ05737   | A "data record too large" message from the linker was being   |
  |           | generated when a union where the first member was more than   |
  |           | 1024 bytes smaller than another member was being initialized  |
  |           | OR when an aggregate within a user data segment was unini-    |
  |           | tialized.                                                     |
  +-----------+---------------------------------------------------------------+
35| PJ05722   | The compiler was generating an IMUL instruction with an       |
  |           | operand size prefix but the constant was 32 bits long instead |
  |           | of 16-bits long.                                              |
  +-----------+---------------------------------------------------------------+
36| PJ05723   | Optimization problem: the compiler was trapping when trying   |
  |           | to optimize a floating-point intensive procedure where        |
  |           | floating-point spills and reloads were necessary.             |
  +-----------+---------------------------------------------------------------+
37| PJ05716   | The compiler was emitting stack probes when the size of all   |
  |           | local variables was greater than 4K instead of when the size  |
  |           | is greater than 2K.  In some cases, stack probes were being   |
  |           | emitted in the wrong place as well.  This would cause strange |
  |           | traps to occur in multi-threaded programs.                    |
  +-----------+---------------------------------------------------------------+
38| PJ05728   | Stack probes were not enabled during compilation of multi-    |
  |           | threaded runtime library code.                                |
  +-----------+---------------------------------------------------------------+
39| PJ05556   | The runtime library termination routine was not checking to   |
  |           | make sure runtime initialization had completed.               |
  +-----------+---------------------------------------------------------------+
40| NOAPAR    | Provides a means to set the number of spaces to be inserted   |
  |           | when tabs are encountered in the source file.  The default    |
  |           | tab expansion is 8 spaces, as it was in the original IPMD.  A |
  |           | new environment variable, PMDTAB, is now available to cus-    |
  |           | tomize the tab expansion constant.  For example, "SET         |
  |           | PMDTAB=5" causes 5 spaces to be inserted for every tab.       |
  +-----------+---------------------------------------------------------------+
41| PJ05863   | In multithreaded applications, the debugger would perform a   |
  |           | "Run" when a "Step over" or a "Step debug" was requested.     |
  +-----------+---------------------------------------------------------------+
42| PJ05148   | Internal debugger errors were sometimes reported when per-    |
  |           | forming a "Find" and when scrolling the source view.          |
  +-----------+---------------------------------------------------------------+
43| PJ05117   | Occasionally the debugger would automatically shut itself     |
  |           | down when creating or scrolling a source view.  Included in   |
  |           | this APAR is a problem in which the application is left       |
  |           | active when the debugger terminates after an exception.       |
  +-----------+---------------------------------------------------------------+
44| NOAPAR    | General internal PM debugging enhancements                    |
  +-----------+---------------------------------------------------------------+
45| NOAPAR    | General internal storage window enhancements                  |
  +-----------+---------------------------------------------------------------+
46| NOAPAR    | The name displayed for a subscripted array (i.e., x(i)) is    |
  |           | not always updated - if the value remains the same while the  |
  |           | name changes, the name is not updated.                        |
  +-----------+---------------------------------------------------------------+
47| NOAPAR    | If the stack window is open and data is entered in the appli- |
  |           | cation window, the stack view can display the wrong part name |
  |           | for a function name.  This can also cause the debugger to     |
  |           | crash if the focus is changed between the source, the stack,  |
  |           | and the application several times.                            |
  +-----------+---------------------------------------------------------------+
  | NOTE:  The fixes listed above were included in CSD0022.                   |
  +---------------------------------------------------------------------------+


Newsgroups: comp.os.os2.advocacy