Skip to content

Commit c4db30f

Browse files
committed
Add constant sign extension optimization to SCCP
This extends the SCCP optimizer to handle compile-time constant sign extension operations (OP_sign_ext), complementing the existing constant truncation optimization. - 8-bit to 32-bit sign extension (char to int) - 16-bit to 32-bit sign extension (short to int) - Proper sign bit propagation for negative values When sign extension operations have constant operands, they are evaluated at compile-time and replaced with direct constant loads, eliminating runtime overhead. Example transformations: - char c = -1; int i = c; → i directly loads 0xFFFFFFFF (-1) - char c = 127; int i = c; → i directly loads 0x0000007F (127)
1 parent a9009d0 commit c4db30f

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

src/opt-sccp.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,40 @@ bool simple_sccp(func_t *func)
7575
}
7676
break;
7777

78+
case OP_sign_ext:
79+
/* Constant sign extension optimization integrated into SCCP */
80+
if (insn->rs1 && insn->rs1->is_const && !insn->rd->is_global &&
81+
insn->sz > 0) {
82+
int value = insn->rs1->init_val;
83+
int result = value;
84+
85+
/* Perform sign extension based on source size */
86+
if (insn->sz == 1) {
87+
/* Sign extend from 8 bits */
88+
result = (value & 0x80) ? (value | 0xFFFFFF00)
89+
: (value & 0xFF);
90+
} else if (insn->sz == 2) {
91+
/* Sign extend from 16 bits */
92+
result = (value & 0x8000) ? (value | 0xFFFF0000)
93+
: (value & 0xFFFF);
94+
} else if (insn->sz == 4) {
95+
/* No sign extension needed for 32-bit */
96+
result = value;
97+
} else {
98+
/* Invalid size, skip */
99+
break;
100+
}
101+
102+
/* Convert to constant load */
103+
insn->opcode = OP_load_constant;
104+
insn->rd->is_const = true;
105+
insn->rd->init_val = result;
106+
insn->rs1 = NULL;
107+
insn->sz = 0;
108+
changed = true;
109+
}
110+
break;
111+
78112
case OP_add:
79113
case OP_sub:
80114
case OP_mul:

0 commit comments

Comments
 (0)