On Tue, Oct 19, 2021 at 09:47:45AM +0530, Siddhesh Poyarekar wrote: > Compute the unknown size value as a function of the min/max bit of > object_size_type. This transforms into a neat little branchless > sequence on x86_64: > > movl %edi, %eax > sarl %eax > xorl $1, %eax > negl %eax > cltq > > which should be faster than loading the value from memory. A quick > unscientific test using > > `time make check-gcc RUNTESTFLAGS="dg.exp=builtin*"`
But if you use some other higher bit of object_size_type for the mode (normal vs. dynamic) you'd need to mask it away, so it will become longer. Anyway, I guess that part is ok. > -/* Compute object_sizes for PTR, defined to an unknown value. */ > - > -static void > -unknown_object_size (struct object_size_info *osi, tree ptr) > -{ > - int object_size_type = osi->object_size_type; > - unsigned int varno = SSA_NAME_VERSION (ptr); > - unsigned HOST_WIDE_INT bytes; > - > - gcc_assert (object_sizes[object_size_type][varno] > - != unknown[object_size_type]); > - gcc_assert (osi->pass == 0); > - > - bytes = unknown[object_size_type]; > - > - if ((object_size_type & 2) == 0) > - { > - if (object_sizes[object_size_type][varno] < bytes) > - object_sizes[object_size_type][varno] = bytes; > - } > - else > - { > - if (object_sizes[object_size_type][varno] > bytes) > - object_sizes[object_size_type][varno] = bytes; > - } > -} But I don't think removing this function is desirable. Can it be greatly simplified? Yes, certainly. The assert verifies it is not unknown before, and then for mode 0 or 1 uses maximum which will always be unknown and for mode 2 or 3 minimum which will always be unknown as well. But I'd keep the asserts in there. So it can become int object_size_type = osi->object_size_type; unsigned int varno = SSA_NAME_VERSION (ptr); unsigned HOST_WIDE_INT bytes = unknown (object_size_type); gcc_checking_assert (object_sizes[object_size_type][varno] != bytes); gcc_checking_assert (osi->pass == 0); object_sizes[object_size_type][varno] = bytes; Jakub