Skip to content

Inconsistent behaviour between using logical and bitwise and/or on smin/smax #62898

@Kmeakin

Description

@Kmeakin

GCC recognises all these functions as equivalent, but LLVM doesn't:

int32_t smin(int32_t x, int32_t y) { return x < y ? x : y; }
int32_t smax(int32_t x, int32_t y) { return x < y ? x : y; }

bool smin_or_bitwise(int32_t x) { return (x < 0) | (smin(x, 1) < 0); }
bool smin_or_logical(int32_t x) { return (x < 0) || (smin(x, 1) < 0); }

bool smin_and_bitwise(int32_t x) { return (x < 0) & (smin(x, 1) < 0); }
bool smin_and_logical(int32_t x) { return (x < 0) && (smin(x, 1) < 0); }

bool smax_or_bitwise(int32_t x) { return (x < 0) | (smax(x, 1) < 0); }
bool smax_or_logical(int32_t x) { return (x < 0) || (smax(x, 1) < 0); }

bool smax_and_bitwise(int32_t x) { return (x < 0) & (smax(x, 1) < 0); }
bool smax_and_logical(int32_t x) { return (x < 0) && (smax(x, 1) < 0); }

https://godbolt.org/z/9caPKxz9h

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions