Skip to content

Commit adb61f8

Browse files
committed
refactor fixI8TruncUseChain to remove nesting
1 parent 137873b commit adb61f8

File tree

1 file changed

+43
-33
lines changed

1 file changed

+43
-33
lines changed

llvm/lib/Target/DirectX/DXILLegalizePass.cpp

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,15 @@ static void fixI8TruncUseChain(Instruction &I,
2424
SmallVectorImpl<Instruction *> &ToRemove,
2525
DenseMap<Value *, Value *> &ReplacedValues) {
2626

27-
auto *Cmp = dyn_cast<CmpInst>(&I);
28-
29-
if (auto *Trunc = dyn_cast<TruncInst>(&I)) {
30-
if (Trunc->getDestTy()->isIntegerTy(8)) {
31-
ReplacedValues[Trunc] = Trunc->getOperand(0);
32-
ToRemove.push_back(Trunc);
33-
}
34-
} else if (I.getType()->isIntegerTy(8) ||
35-
(Cmp && Cmp->getOperand(0)->getType()->isIntegerTy(8))) {
36-
IRBuilder<> Builder(&I);
37-
38-
SmallVector<Value *> NewOperands;
27+
auto ProcessOperands = [&](SmallVector<Value *> &NewOperands) {
3928
Type *InstrType = IntegerType::get(I.getContext(), 32);
29+
4030
for (unsigned OpIdx = 0; OpIdx < I.getNumOperands(); ++OpIdx) {
4131
Value *Op = I.getOperand(OpIdx);
4232
if (ReplacedValues.count(Op))
4333
InstrType = ReplacedValues[Op]->getType();
4434
}
35+
4536
for (unsigned OpIdx = 0; OpIdx < I.getNumOperands(); ++OpIdx) {
4637
Value *Op = I.getOperand(OpIdx);
4738
if (ReplacedValues.count(Op))
@@ -52,36 +43,55 @@ static void fixI8TruncUseChain(Instruction &I,
5243
// Note: options here are sext or sextOrTrunc.
5344
// Since i8 isn't supported, we assume new values
5445
// will always have a higher bitness.
46+
assert(NewBitWidth > Value.getBitWidth() &&
47+
"Replacement's BitWidth should be larger than Current.");
5548
APInt NewValue = Value.sext(NewBitWidth);
5649
NewOperands.push_back(ConstantInt::get(InstrType, NewValue));
5750
} else {
5851
assert(!Op->getType()->isIntegerTy(8));
5952
NewOperands.push_back(Op);
6053
}
6154
}
62-
63-
Value *NewInst = nullptr;
64-
if (auto *BO = dyn_cast<BinaryOperator>(&I)) {
65-
NewInst =
66-
Builder.CreateBinOp(BO->getOpcode(), NewOperands[0], NewOperands[1]);
67-
68-
if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(&I)) {
69-
if (OBO->hasNoSignedWrap())
70-
cast<BinaryOperator>(NewInst)->setHasNoSignedWrap();
71-
if (OBO->hasNoUnsignedWrap())
72-
cast<BinaryOperator>(NewInst)->setHasNoUnsignedWrap();
73-
}
74-
} else if (Cmp) {
75-
NewInst = Builder.CreateCmp(Cmp->getPredicate(), NewOperands[0],
76-
NewOperands[1]);
77-
Cmp->replaceAllUsesWith(NewInst);
55+
};
56+
IRBuilder<> Builder(&I);
57+
if (auto *Trunc = dyn_cast<TruncInst>(&I)) {
58+
if (Trunc->getDestTy()->isIntegerTy(8)) {
59+
ReplacedValues[Trunc] = Trunc->getOperand(0);
60+
ToRemove.push_back(Trunc);
7861
}
79-
80-
if (NewInst) {
81-
ReplacedValues[&I] = NewInst;
82-
ToRemove.push_back(&I);
62+
}
63+
Value *NewInst = nullptr;
64+
if (auto *BO = dyn_cast<BinaryOperator>(&I)) {
65+
if (!I.getType()->isIntegerTy(8))
66+
return;
67+
SmallVector<Value *> NewOperands;
68+
ProcessOperands(NewOperands);
69+
NewInst =
70+
Builder.CreateBinOp(BO->getOpcode(), NewOperands[0], NewOperands[1]);
71+
if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(&I)) {
72+
if (OBO->hasNoSignedWrap())
73+
cast<BinaryOperator>(NewInst)->setHasNoSignedWrap();
74+
if (OBO->hasNoUnsignedWrap())
75+
cast<BinaryOperator>(NewInst)->setHasNoUnsignedWrap();
8376
}
84-
} else if (auto *Cast = dyn_cast<CastInst>(&I)) {
77+
}
78+
79+
if (auto *Cmp = dyn_cast<CmpInst>(&I)) {
80+
if (!Cmp->getOperand(0)->getType()->isIntegerTy(8))
81+
return;
82+
SmallVector<Value *> NewOperands;
83+
ProcessOperands(NewOperands);
84+
NewInst =
85+
Builder.CreateCmp(Cmp->getPredicate(), NewOperands[0], NewOperands[1]);
86+
Cmp->replaceAllUsesWith(NewInst);
87+
}
88+
if (NewInst) {
89+
ReplacedValues[&I] = NewInst;
90+
ToRemove.push_back(&I);
91+
return;
92+
}
93+
94+
if (auto *Cast = dyn_cast<CastInst>(&I)) {
8595
if (Cast->getSrcTy()->isIntegerTy(8)) {
8696
ToRemove.push_back(Cast);
8797
Cast->replaceAllUsesWith(ReplacedValues[Cast->getOperand(0)]);

0 commit comments

Comments
 (0)