Skip to content

Commit 69dbcd0

Browse files
committed
[InstCombine] Refactor simplifyDemandedUse{Bits/VectorElts}Intrinsic
1 parent d76a123 commit 69dbcd0

14 files changed

+60
-59
lines changed

llvm/include/llvm/Analysis/TargetTransformInfo.h

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -666,14 +666,15 @@ class TargetTransformInfo {
666666
IntrinsicInst & II) const;
667667
/// Can be used to implement target-specific instruction combining.
668668
/// \see instCombineIntrinsic
669-
std::optional<Value *> simplifyDemandedUseBitsIntrinsic(
670-
InstCombiner & IC, IntrinsicInst & II, APInt DemandedMask,
671-
KnownBits & Known, bool &KnownBitsComputed) const;
669+
std::optional<Value *>
670+
simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II,
671+
const APInt &DemandedMask, KnownBits &Known,
672+
bool &KnownBitsComputed) const;
672673
/// Can be used to implement target-specific instruction combining.
673674
/// \see instCombineIntrinsic
674675
std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
675-
InstCombiner & IC, IntrinsicInst & II, APInt DemandedElts,
676-
APInt & UndefElts, APInt & UndefElts2, APInt & UndefElts3,
676+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedElts,
677+
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
677678
std::function<void(Instruction *, unsigned, APInt, APInt &)>
678679
SimplifyAndSetOp) const;
679680
/// @}
@@ -1839,11 +1840,12 @@ class TargetTransformInfo::Concept {
18391840
getPreferredTailFoldingStyle(bool IVUpdateMayOverflow = true) = 0;
18401841
virtual std::optional<Instruction *> instCombineIntrinsic(
18411842
InstCombiner &IC, IntrinsicInst &II) = 0;
1842-
virtual std::optional<Value *> simplifyDemandedUseBitsIntrinsic(
1843-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedMask,
1844-
KnownBits & Known, bool &KnownBitsComputed) = 0;
1843+
virtual std::optional<Value *>
1844+
simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II,
1845+
const APInt &DemandedMask, KnownBits &Known,
1846+
bool &KnownBitsComputed) = 0;
18451847
virtual std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
1846-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts,
1848+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedElts,
18471849
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
18481850
std::function<void(Instruction *, unsigned, APInt, APInt &)>
18491851
SimplifyAndSetOp) = 0;
@@ -2293,14 +2295,14 @@ class TargetTransformInfo::Model final : public TargetTransformInfo::Concept {
22932295
}
22942296
std::optional<Value *>
22952297
simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II,
2296-
APInt DemandedMask, KnownBits &Known,
2298+
const APInt &DemandedMask, KnownBits &Known,
22972299
bool &KnownBitsComputed) override {
22982300
return Impl.simplifyDemandedUseBitsIntrinsic(IC, II, DemandedMask, Known,
22992301
KnownBitsComputed);
23002302
}
23012303
std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
2302-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
2303-
APInt &UndefElts2, APInt &UndefElts3,
2304+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedElts,
2305+
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
23042306
std::function<void(Instruction *, unsigned, APInt, APInt &)>
23052307
SimplifyAndSetOp) override {
23062308
return Impl.simplifyDemandedVectorEltsIntrinsic(

llvm/include/llvm/Analysis/TargetTransformInfoImpl.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,14 +194,14 @@ class TargetTransformInfoImplBase {
194194

195195
std::optional<Value *>
196196
simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II,
197-
APInt DemandedMask, KnownBits &Known,
197+
const APInt &DemandedMask, KnownBits &Known,
198198
bool &KnownBitsComputed) const {
199199
return std::nullopt;
200200
}
201201

202202
std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
203-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
204-
APInt &UndefElts2, APInt &UndefElts3,
203+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedElts,
204+
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
205205
std::function<void(Instruction *, unsigned, APInt, APInt &)>
206206
SimplifyAndSetOp) const {
207207
return std::nullopt;

llvm/include/llvm/CodeGen/BasicTTIImpl.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -682,15 +682,15 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
682682

683683
std::optional<Value *>
684684
simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II,
685-
APInt DemandedMask, KnownBits &Known,
685+
const APInt &DemandedMask, KnownBits &Known,
686686
bool &KnownBitsComputed) {
687687
return BaseT::simplifyDemandedUseBitsIntrinsic(IC, II, DemandedMask, Known,
688688
KnownBitsComputed);
689689
}
690690

691691
std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
692-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
693-
APInt &UndefElts2, APInt &UndefElts3,
692+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedElts,
693+
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
694694
std::function<void(Instruction *, unsigned, APInt, APInt &)>
695695
SimplifyAndSetOp) {
696696
return BaseT::simplifyDemandedVectorEltsIntrinsic(

llvm/include/llvm/Transforms/InstCombine/InstCombiner.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -348,12 +348,11 @@ class LLVM_LIBRARY_VISIBILITY InstCombiner {
348348

349349
// Call target specific combiners
350350
std::optional<Instruction *> targetInstCombineIntrinsic(IntrinsicInst &II);
351-
std::optional<Value *>
352-
targetSimplifyDemandedUseBitsIntrinsic(IntrinsicInst &II, APInt DemandedMask,
353-
KnownBits &Known,
354-
bool &KnownBitsComputed);
351+
std::optional<Value *> targetSimplifyDemandedUseBitsIntrinsic(
352+
IntrinsicInst &II, const APInt &DemandedMask, KnownBits &Known,
353+
bool &KnownBitsComputed);
355354
std::optional<Value *> targetSimplifyDemandedVectorEltsIntrinsic(
356-
IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
355+
IntrinsicInst &II, const APInt &DemandedElts, APInt &UndefElts,
357356
APInt &UndefElts2, APInt &UndefElts3,
358357
std::function<void(Instruction *, unsigned, APInt, APInt &)>
359358
SimplifyAndSetOp);

llvm/lib/Analysis/TargetTransformInfo.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -365,15 +365,15 @@ TargetTransformInfo::instCombineIntrinsic(InstCombiner &IC,
365365
}
366366

367367
std::optional<Value *> TargetTransformInfo::simplifyDemandedUseBitsIntrinsic(
368-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedMask, KnownBits &Known,
369-
bool &KnownBitsComputed) const {
368+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedMask,
369+
KnownBits &Known, bool &KnownBitsComputed) const {
370370
return TTIImpl->simplifyDemandedUseBitsIntrinsic(IC, II, DemandedMask, Known,
371371
KnownBitsComputed);
372372
}
373373

374374
std::optional<Value *> TargetTransformInfo::simplifyDemandedVectorEltsIntrinsic(
375-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
376-
APInt &UndefElts2, APInt &UndefElts3,
375+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedElts,
376+
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
377377
std::function<void(Instruction *, unsigned, APInt, APInt &)>
378378
SimplifyAndSetOp) const {
379379
return TTIImpl->simplifyDemandedVectorEltsIntrinsic(

llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2107,7 +2107,7 @@ AArch64TTIImpl::instCombineIntrinsic(InstCombiner &IC,
21072107
}
21082108

21092109
std::optional<Value *> AArch64TTIImpl::simplifyDemandedVectorEltsIntrinsic(
2110-
InstCombiner &IC, IntrinsicInst &II, APInt OrigDemandedElts,
2110+
InstCombiner &IC, IntrinsicInst &II, const APInt &OrigDemandedElts,
21112111
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
21122112
std::function<void(Instruction *, unsigned, APInt, APInt &)>
21132113
SimplifyAndSetOp) const {

llvm/lib/Target/AArch64/AArch64TargetTransformInfo.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ class AArch64TTIImpl : public BasicTTIImplBase<AArch64TTIImpl> {
125125
IntrinsicInst &II) const;
126126

127127
std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
128-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
129-
APInt &UndefElts2, APInt &UndefElts3,
128+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedElts,
129+
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
130130
std::function<void(Instruction *, unsigned, APInt, APInt &)>
131131
SimplifyAndSetOp) const;
132132

llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,8 +1370,8 @@ static Value *simplifyAMDGCNMemoryIntrinsicDemanded(InstCombiner &IC,
13701370
}
13711371

13721372
std::optional<Value *> GCNTTIImpl::simplifyDemandedVectorEltsIntrinsic(
1373-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
1374-
APInt &UndefElts2, APInt &UndefElts3,
1373+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedElts,
1374+
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
13751375
std::function<void(Instruction *, unsigned, APInt, APInt &)>
13761376
SimplifyAndSetOp) const {
13771377
switch (II.getIntrinsicID()) {

llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,8 @@ class GCNTTIImpl final : public BasicTTIImplBase<GCNTTIImpl> {
223223
std::optional<Instruction *> instCombineIntrinsic(InstCombiner &IC,
224224
IntrinsicInst &II) const;
225225
std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
226-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
227-
APInt &UndefElts2, APInt &UndefElts3,
226+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedElts,
227+
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
228228
std::function<void(Instruction *, unsigned, APInt, APInt &)>
229229
SimplifyAndSetOp) const;
230230

llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ ARMTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const {
253253
}
254254

255255
std::optional<Value *> ARMTTIImpl::simplifyDemandedVectorEltsIntrinsic(
256-
InstCombiner &IC, IntrinsicInst &II, APInt OrigDemandedElts,
256+
InstCombiner &IC, IntrinsicInst &II, const APInt &OrigDemandedElts,
257257
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
258258
std::function<void(Instruction *, unsigned, APInt, APInt &)>
259259
SimplifyAndSetOp) const {

llvm/lib/Target/ARM/ARMTargetTransformInfo.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ class ARMTTIImpl : public BasicTTIImplBase<ARMTTIImpl> {
122122
std::optional<Instruction *> instCombineIntrinsic(InstCombiner &IC,
123123
IntrinsicInst &II) const;
124124
std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
125-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
126-
APInt &UndefElts2, APInt &UndefElts3,
125+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedElts,
126+
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
127127
std::function<void(Instruction *, unsigned, APInt, APInt &)>
128128
SimplifyAndSetOp) const;
129129

llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2813,8 +2813,8 @@ X86TTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const {
28132813
}
28142814

28152815
std::optional<Value *> X86TTIImpl::simplifyDemandedUseBitsIntrinsic(
2816-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedMask, KnownBits &Known,
2817-
bool &KnownBitsComputed) const {
2816+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedMask,
2817+
KnownBits &Known, bool &KnownBitsComputed) const {
28182818
switch (II.getIntrinsicID()) {
28192819
default:
28202820
break;
@@ -2853,16 +2853,16 @@ std::optional<Value *> X86TTIImpl::simplifyDemandedUseBitsIntrinsic(
28532853
}
28542854

28552855
std::optional<Value *> X86TTIImpl::simplifyDemandedVectorEltsIntrinsic(
2856-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
2857-
APInt &UndefElts2, APInt &UndefElts3,
2856+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedElts,
2857+
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
28582858
std::function<void(Instruction *, unsigned, APInt, APInt &)>
28592859
simplifyAndSetOp) const {
28602860
unsigned VWidth = cast<FixedVectorType>(II.getType())->getNumElements();
28612861
switch (II.getIntrinsicID()) {
28622862
default:
28632863
break;
28642864
case Intrinsic::x86_xop_vfrcz_ss:
2865-
case Intrinsic::x86_xop_vfrcz_sd:
2865+
case Intrinsic::x86_xop_vfrcz_sd: {
28662866
// The instructions for these intrinsics are speced to zero upper bits not
28672867
// pass them through like other scalar intrinsics. So we shouldn't just
28682868
// use Arg0 if DemandedElts[0] is clear like we do for other intrinsics.
@@ -2873,13 +2873,13 @@ std::optional<Value *> X86TTIImpl::simplifyDemandedVectorEltsIntrinsic(
28732873
}
28742874

28752875
// Only the lower element is used.
2876-
DemandedElts = 1;
2877-
simplifyAndSetOp(&II, 0, DemandedElts, UndefElts);
2876+
APInt OpDemandedElts(DemandedElts.getBitWidth(), 1);
2877+
simplifyAndSetOp(&II, 0, OpDemandedElts, UndefElts);
28782878

28792879
// Only the lower element is undefined. The high elements are zero.
28802880
UndefElts = UndefElts[0];
28812881
break;
2882-
2882+
}
28832883
// Unary scalar-as-vector operations that work column-wise.
28842884
case Intrinsic::x86_sse_rcp_ss:
28852885
case Intrinsic::x86_sse_rsqrt_ss:
@@ -2912,8 +2912,8 @@ std::optional<Value *> X86TTIImpl::simplifyDemandedVectorEltsIntrinsic(
29122912
}
29132913

29142914
// Only lower element is used for operand 1.
2915-
DemandedElts = 1;
2916-
simplifyAndSetOp(&II, 1, DemandedElts, UndefElts2);
2915+
APInt OpDemandedElts(DemandedElts.getBitWidth(), 1);
2916+
simplifyAndSetOp(&II, 1, OpDemandedElts, UndefElts2);
29172917

29182918
// Lower element is undefined if both lower elements are undefined.
29192919
// Consider things like undef&0. The result is known zero, not undef.
@@ -2939,8 +2939,8 @@ std::optional<Value *> X86TTIImpl::simplifyDemandedVectorEltsIntrinsic(
29392939
}
29402940

29412941
// Only lower element is used for operand 1.
2942-
DemandedElts = 1;
2943-
simplifyAndSetOp(&II, 1, DemandedElts, UndefElts2);
2942+
APInt OpDemandedElts(DemandedElts.getBitWidth(), 1);
2943+
simplifyAndSetOp(&II, 1, OpDemandedElts, UndefElts2);
29442944

29452945
// Take the high undef elements from operand 0 and take the lower element
29462946
// from operand 1.
@@ -2963,7 +2963,7 @@ std::optional<Value *> X86TTIImpl::simplifyDemandedVectorEltsIntrinsic(
29632963
case Intrinsic::x86_avx512_mask_mul_sd_round:
29642964
case Intrinsic::x86_avx512_mask_sub_sd_round:
29652965
case Intrinsic::x86_avx512_mask_max_sd_round:
2966-
case Intrinsic::x86_avx512_mask_min_sd_round:
2966+
case Intrinsic::x86_avx512_mask_min_sd_round: {
29672967
simplifyAndSetOp(&II, 0, DemandedElts, UndefElts);
29682968

29692969
// If lowest element of a scalar op isn't used then use Arg0.
@@ -2973,16 +2973,16 @@ std::optional<Value *> X86TTIImpl::simplifyDemandedVectorEltsIntrinsic(
29732973
}
29742974

29752975
// Only lower element is used for operand 1 and 2.
2976-
DemandedElts = 1;
2977-
simplifyAndSetOp(&II, 1, DemandedElts, UndefElts2);
2978-
simplifyAndSetOp(&II, 2, DemandedElts, UndefElts3);
2976+
APInt OpDemandedElts(DemandedElts.getBitWidth(), 1);
2977+
simplifyAndSetOp(&II, 1, OpDemandedElts, UndefElts2);
2978+
simplifyAndSetOp(&II, 2, OpDemandedElts, UndefElts3);
29792979

29802980
// Lower element is undefined if all three lower elements are undefined.
29812981
// Consider things like undef&0. The result is known zero, not undef.
29822982
if (!UndefElts2[0] || !UndefElts3[0])
29832983
UndefElts.clearBit(0);
29842984
break;
2985-
2985+
}
29862986
// TODO: Add fmaddsub support?
29872987
case Intrinsic::x86_sse3_addsub_pd:
29882988
case Intrinsic::x86_sse3_addsub_ps:

llvm/lib/Target/X86/X86TargetTransformInfo.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,11 @@ class X86TTIImpl : public BasicTTIImplBase<X86TTIImpl> {
196196
IntrinsicInst &II) const;
197197
std::optional<Value *>
198198
simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II,
199-
APInt DemandedMask, KnownBits &Known,
199+
const APInt &DemandedMask, KnownBits &Known,
200200
bool &KnownBitsComputed) const;
201201
std::optional<Value *> simplifyDemandedVectorEltsIntrinsic(
202-
InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
203-
APInt &UndefElts2, APInt &UndefElts3,
202+
InstCombiner &IC, IntrinsicInst &II, const APInt &DemandedElts,
203+
APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3,
204204
std::function<void(Instruction *, unsigned, APInt, APInt &)>
205205
SimplifyAndSetOp) const;
206206

llvm/lib/Transforms/InstCombine/InstructionCombining.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ InstCombiner::targetInstCombineIntrinsic(IntrinsicInst &II) {
162162
}
163163

164164
std::optional<Value *> InstCombiner::targetSimplifyDemandedUseBitsIntrinsic(
165-
IntrinsicInst &II, APInt DemandedMask, KnownBits &Known,
165+
IntrinsicInst &II, const APInt &DemandedMask, KnownBits &Known,
166166
bool &KnownBitsComputed) {
167167
// Handle target specific intrinsics
168168
if (II.getCalledFunction()->isTargetIntrinsic()) {
@@ -173,7 +173,7 @@ std::optional<Value *> InstCombiner::targetSimplifyDemandedUseBitsIntrinsic(
173173
}
174174

175175
std::optional<Value *> InstCombiner::targetSimplifyDemandedVectorEltsIntrinsic(
176-
IntrinsicInst &II, APInt DemandedElts, APInt &PoisonElts,
176+
IntrinsicInst &II, const APInt &DemandedElts, APInt &PoisonElts,
177177
APInt &PoisonElts2, APInt &PoisonElts3,
178178
std::function<void(Instruction *, unsigned, APInt, APInt &)>
179179
SimplifyAndSetOp) {

0 commit comments

Comments
 (0)