Skip to content

Commit

Permalink
[g++11] Fix DecrementIntCell for g++10 and g++11
Browse files Browse the repository at this point in the history
There seems to be a compiler bug, that optimizes out the safety check
for INT_MIN in the DecrementIntCell function. It appears on RHEL 9.2
with g++ 11.4.1. Only in Release build. For more infoi, see:

https://stackoverflow.com/questions/78424303/g-optimizes-away-check-for-int-min-in-release-build

The issue seems to be fixed in g++12 and not yet present in g++9.

Solution:
Slightly change the function to ensure it is compiled correctly.
This modification should not alter the correct optimized code.

Basically, any change where the compiler cannot perform the two
optimization steps (in this order) should address the issue:

+ if (x == INT_MIN) x = INT_MAX; else x -= 1; ====> x -= 1
(this is equivalent on the x86 platform).
+ if (x - 1 < x) ====> if (true)
(this equivalence holds only at the mathematical level).

Change-Id: Ia3cea2849a88c4d7e2587ceb805cd3258652e3c5
Reviewed-on: http://gerrit.cloudera.org:8080/21396
Tested-by: Alexey Serbin <[email protected]>
Reviewed-by: Alexey Serbin <[email protected]>
(cherry picked from commit 1f0c0b0)
Reviewed-on: http://gerrit.cloudera.org:8080/21982
Tested-by: Abhishek Chennaka <[email protected]>
  • Loading branch information
martonka authored and achennaka committed Oct 28, 2024
1 parent 4843ecf commit bb469cb
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion src/kudu/common/key_util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ bool DecrementIntCell(void* cell_ptr) {
// Signed overflow is undefined in C. So, we'll use a branch here
// instead of counting on undefined behavior.
if (orig == MathLimits<cpp_type>::kMin) {
dec = MathLimits<cpp_type>::kMax;
return false;
} else {
dec = orig - 1;
}
Expand Down

0 comments on commit bb469cb

Please sign in to comment.