Skip to content

Commit 466b5ec

Browse files
authored
Support CCP for 16bit integer min and max operations. (KhronosGroup#6280)
1 parent 1c74ae5 commit 466b5ec

File tree

2 files changed

+186
-54
lines changed

2 files changed

+186
-54
lines changed

source/opt/const_folding_rules.cpp

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1433,14 +1433,29 @@ const analysis::Constant* FoldMin(const analysis::Type* result_type,
14331433
const analysis::Constant* b,
14341434
analysis::ConstantManager*) {
14351435
if (const analysis::Integer* int_type = result_type->AsInteger()) {
1436-
if (int_type->width() == 32) {
1436+
if (int_type->width() <= 32) {
1437+
assert(
1438+
(a->AsIntConstant() != nullptr || a->AsNullConstant() != nullptr) &&
1439+
"Must be an integer or null constant.");
1440+
assert(
1441+
(b->AsIntConstant() != nullptr || b->AsNullConstant() != nullptr) &&
1442+
"Must be an integer or null constant.");
1443+
14371444
if (int_type->IsSigned()) {
1438-
int32_t va = a->GetS32();
1439-
int32_t vb = b->GetS32();
1445+
int32_t va = (a->AsIntConstant() != nullptr)
1446+
? a->AsIntConstant()->GetS32BitValue()
1447+
: 0;
1448+
int32_t vb = (b->AsIntConstant() != nullptr)
1449+
? b->AsIntConstant()->GetS32BitValue()
1450+
: 0;
14401451
return (va < vb ? a : b);
14411452
} else {
1442-
uint32_t va = a->GetU32();
1443-
uint32_t vb = b->GetU32();
1453+
uint32_t va = (a->AsIntConstant() != nullptr)
1454+
? a->AsIntConstant()->GetU32BitValue()
1455+
: 0;
1456+
uint32_t vb = (b->AsIntConstant() != nullptr)
1457+
? b->AsIntConstant()->GetU32BitValue()
1458+
: 0;
14441459
return (va < vb ? a : b);
14451460
}
14461461
} else if (int_type->width() == 64) {
@@ -1473,14 +1488,29 @@ const analysis::Constant* FoldMax(const analysis::Type* result_type,
14731488
const analysis::Constant* b,
14741489
analysis::ConstantManager*) {
14751490
if (const analysis::Integer* int_type = result_type->AsInteger()) {
1476-
if (int_type->width() == 32) {
1491+
if (int_type->width() <= 32) {
1492+
assert(
1493+
(a->AsIntConstant() != nullptr || a->AsNullConstant() != nullptr) &&
1494+
"Must be an integer or null constant.");
1495+
assert(
1496+
(b->AsIntConstant() != nullptr || b->AsNullConstant() != nullptr) &&
1497+
"Must be an integer or null constant.");
1498+
14771499
if (int_type->IsSigned()) {
1478-
int32_t va = a->GetS32();
1479-
int32_t vb = b->GetS32();
1500+
int32_t va = (a->AsIntConstant() != nullptr)
1501+
? a->AsIntConstant()->GetS32BitValue()
1502+
: 0;
1503+
int32_t vb = (b->AsIntConstant() != nullptr)
1504+
? b->AsIntConstant()->GetS32BitValue()
1505+
: 0;
14801506
return (va > vb ? a : b);
14811507
} else {
1482-
uint32_t va = a->GetU32();
1483-
uint32_t vb = b->GetU32();
1508+
uint32_t va = (a->AsIntConstant() != nullptr)
1509+
? a->AsIntConstant()->GetU32BitValue()
1510+
: 0;
1511+
uint32_t vb = (b->AsIntConstant() != nullptr)
1512+
? b->AsIntConstant()->GetU32BitValue()
1513+
: 0;
14841514
return (va > vb ? a : b);
14851515
}
14861516
} else if (int_type->width() == 64) {

0 commit comments

Comments
 (0)