@@ -3248,17 +3248,7 @@ void IR_Builder::doConsFolding(G4_INST *inst) {
3248
3248
return op && op->isImm () && !op->isRelocImm ();
3249
3249
};
3250
3250
3251
- if (inst->isMath () && inst->asMathInst ()->isOneSrcMath ()) {
3252
- G4_Operand* src0 = inst->getSrc (0 );
3253
- if (srcIsFoldableImm (src0)) {
3254
- G4_Imm* foldedImm =
3255
- foldConstVal (src0->asImm (), inst);
3256
- if (foldedImm) {
3257
- inst->setOpcode (G4_mov);
3258
- inst->setSrc (foldedImm, 0 );
3259
- }
3260
- }
3261
- } else if (inst->getNumSrc () == 2 ) {
3251
+ if (inst->getNumSrc () == 2 ) {
3262
3252
G4_Operand *src0 = inst->getSrc (0 );
3263
3253
G4_Operand *src1 = inst->getSrc (1 );
3264
3254
if (srcIsFoldableImm (src0) && srcIsFoldableImm (src1)) {
@@ -3304,6 +3294,48 @@ void IR_Builder::doConsFolding(G4_INST *inst) {
3304
3294
} // TODO: integer mad, bfn, bfi, bfe
3305
3295
}
3306
3296
}
3297
+
3298
+ // Perform constant folding for math instructions
3299
+ // op dst, Imm
3300
+ // =>
3301
+ // mov dst, Imm'
3302
+ G4_INST *IR_Builder::doMathConsFolding (INST_LIST_ITER &iter) {
3303
+ G4_INST *inst = *iter;
3304
+
3305
+ if (inst->getSaturate ())
3306
+ return inst;
3307
+
3308
+ auto srcIsFoldableImm = [](const G4_Operand *op) {
3309
+ return op && op->isImm () && !op->isRelocImm ();
3310
+ };
3311
+
3312
+ if (inst->isMath () && inst->asMathInst ()->isOneSrcMath ()) {
3313
+ G4_Operand *src0 = inst->getSrc (0 );
3314
+ if (srcIsFoldableImm (src0)) {
3315
+ G4_Imm *foldedImm = foldConstVal (src0->asImm (), inst);
3316
+ if (foldedImm) {
3317
+ auto pred = duplicateOperand (inst->getPredicate ());
3318
+ auto condMod = duplicateOperand (inst->getCondMod ());
3319
+ auto dst = duplicateOperand (inst->getDst ());
3320
+ auto execSize = inst->getExecSize ();
3321
+ auto sat = inst->getSaturate ();
3322
+ auto options = inst->getOption ();
3323
+
3324
+ G4_INST *newInst =
3325
+ createInternalInst (pred, G4_mov, condMod, sat, execSize, dst,
3326
+ foldedImm, nullptr , options);
3327
+ newInst->inheritDIFrom (inst);
3328
+ inst->transferUse (newInst);
3329
+ *iter = newInst;
3330
+
3331
+ return newInst;
3332
+ }
3333
+ }
3334
+ }
3335
+
3336
+ return inst;
3337
+ }
3338
+
3307
3339
// Do the following algebraic simplification:
3308
3340
// - mul v, src0, 0 ==> 0, commutative
3309
3341
// - and v, src0, 0 ==> 0, commutative
0 commit comments