Index: llvm/lib/CodeGen/GlobalISel/CSEInfo.cpp =================================================================== --- llvm/lib/CodeGen/GlobalISel/CSEInfo.cpp +++ llvm/lib/CodeGen/GlobalISel/CSEInfo.cpp @@ -59,6 +59,7 @@ case TargetOpcode::G_UNMERGE_VALUES: case TargetOpcode::G_TRUNC: case TargetOpcode::G_PTR_ADD: + case TargetOpcode::G_EXTRACT: return true; } return false; Index: llvm/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp =================================================================== --- llvm/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp +++ llvm/lib/CodeGen/GlobalISel/CSEMIRBuilder.cpp @@ -70,6 +70,9 @@ void CSEMIRBuilder::profileSrcOp(const SrcOp &Op, GISelInstProfileBuilder &B) const { switch (Op.getSrcOpKind()) { + case SrcOp::SrcType::Ty_Imm: + B.addNodeIDImmediate(static_cast(Op.getImm())); + break; case SrcOp::SrcType::Ty_Predicate: B.addNodeIDImmediate(static_cast(Op.getPredicate())); break; Index: llvm/unittests/CodeGen/GlobalISel/CSETest.cpp =================================================================== --- llvm/unittests/CodeGen/GlobalISel/CSETest.cpp +++ llvm/unittests/CodeGen/GlobalISel/CSETest.cpp @@ -96,6 +96,15 @@ auto CSEFMul = CSEB.buildInstr(TargetOpcode::G_AND, {s32}, {Copies[0], Copies[1]}); EXPECT_EQ(&*CSEFMul, &*NonCSEFMul); + + auto ExtractMIB = CSEB.buildInstr(TargetOpcode::G_EXTRACT, {s16}, + {Copies[0], static_cast(0)}); + auto ExtractMIB1 = CSEB.buildInstr(TargetOpcode::G_EXTRACT, {s16}, + {Copies[0], static_cast(0)}); + auto ExtractMIB2 = CSEB.buildInstr(TargetOpcode::G_EXTRACT, {s16}, + {Copies[0], static_cast(1)}); + EXPECT_EQ(&*ExtractMIB, &*ExtractMIB1); + EXPECT_NE(&*ExtractMIB, &*ExtractMIB2); } TEST_F(AArch64GISelMITest, TestCSEConstantConfig) {