-
Type:
Bug
-
Resolution: Fixed
-
Priority:
Medium
-
Code Generation Tools
-
CODEGEN-15605
-
-
-
default
At the -O3 optimization level, dividing a 64-bit integer such as 'long long' or 'unsigned long long' by an integer of a smaller size such as signed or unsigned "char" or "short" may result in erroneous values. This applies to natural division '/' operators as well as integer division builtin functions.
Example source:
#include <stdint.h>
int64_t divide_s64_by_s16(int64_t dividend, int32_t divisor) {
return dividend / (int16_t)divisor;
}
Affected builtin functions:
- __builtin_c29_div_u32_u32
- __builtin_c29_tdiv_s32_u32
- __builtin_c29_tdiv_s32_s32
- __builtin_c29_ediv_s32_s32
- __builtin_c29_mdiv_s32_s32
- __builtin_c29_div_u64_u32
- __builtin_c29_tdiv_s64_u32
- __builtin_c29_tdiv_s64_s32
- __builtin_c29_ediv_s64_s32
- __builtin_c29_mdiv_s64_s32
- __builtin_c29_div_u64_u64
- __builtin_c29_tdiv_s64_s64
- __builtin_c29_ediv_s64_s64
- __builtin_c29_mdiv_s64_s64