@@ -3308,31 +3308,27 @@ bool llvm::removeUnreachableBlocks(Function &F, DomTreeUpdater *DTU,
3308
3308
return Changed;
3309
3309
}
3310
3310
3311
- // FIXME: https://github.com/llvm/llvm-project/issues/121495
3312
- // Once external callers of this function are removed, either inline into
3313
- // combineMetadataForCSE, or internalize and remove KnownIDs parameter.
3314
- void llvm::combineMetadata (Instruction *K, const Instruction *J,
3315
- ArrayRef<unsigned > KnownIDs, bool DoesKMove) {
3311
+ // / If AAOnly is set, only intersect alias analysis metadata and preserve other
3312
+ // / known metadata. Unknown metadata is always dropped.
3313
+ static void combineMetadata (Instruction *K, const Instruction *J,
3314
+ bool DoesKMove, bool AAOnly = false ) {
3316
3315
SmallVector<std::pair<unsigned , MDNode *>, 4 > Metadata;
3317
- K->dropUnknownNonDebugMetadata (KnownIDs);
3318
3316
K->getAllMetadataOtherThanDebugLoc (Metadata);
3319
3317
for (const auto &MD : Metadata) {
3320
3318
unsigned Kind = MD.first ;
3321
3319
MDNode *JMD = J->getMetadata (Kind);
3322
3320
MDNode *KMD = MD.second ;
3323
3321
3322
+ // TODO: Assert that this switch is exhaustive for fixed MD kinds.
3324
3323
switch (Kind) {
3325
3324
default :
3326
- // FIXME: https://github.com/llvm/llvm-project/issues/121495
3327
- // Change to removing only explicitly listed other metadata, and assert
3328
- // on unknown metadata, to avoid inadvertently dropping newly added
3329
- // metadata types.
3330
3325
K->setMetadata (Kind, nullptr ); // Remove unknown metadata
3331
3326
break ;
3332
3327
case LLVMContext::MD_dbg:
3333
3328
llvm_unreachable (" getAllMetadataOtherThanDebugLoc returned a MD_dbg" );
3334
3329
case LLVMContext::MD_DIAssignID:
3335
- K->mergeDIAssignID (J);
3330
+ if (!AAOnly)
3331
+ K->mergeDIAssignID (J);
3336
3332
break ;
3337
3333
case LLVMContext::MD_tbaa:
3338
3334
if (DoesKMove)
@@ -3353,11 +3349,12 @@ void llvm::combineMetadata(Instruction *K, const Instruction *J,
3353
3349
intersectAccessGroups (K, J));
3354
3350
break ;
3355
3351
case LLVMContext::MD_range:
3356
- if (DoesKMove || !K->hasMetadata (LLVMContext::MD_noundef))
3352
+ if (!AAOnly && ( DoesKMove || !K->hasMetadata (LLVMContext::MD_noundef) ))
3357
3353
K->setMetadata (Kind, MDNode::getMostGenericRange (JMD, KMD));
3358
3354
break ;
3359
3355
case LLVMContext::MD_fpmath:
3360
- K->setMetadata (Kind, MDNode::getMostGenericFPMath (JMD, KMD));
3356
+ if (!AAOnly)
3357
+ K->setMetadata (Kind, MDNode::getMostGenericFPMath (JMD, KMD));
3361
3358
break ;
3362
3359
case LLVMContext::MD_invariant_load:
3363
3360
// If K moves, only set the !invariant.load if it is present in both
@@ -3366,7 +3363,7 @@ void llvm::combineMetadata(Instruction *K, const Instruction *J,
3366
3363
K->setMetadata (Kind, JMD);
3367
3364
break ;
3368
3365
case LLVMContext::MD_nonnull:
3369
- if (DoesKMove || !K->hasMetadata (LLVMContext::MD_noundef))
3366
+ if (!AAOnly && ( DoesKMove || !K->hasMetadata (LLVMContext::MD_noundef) ))
3370
3367
K->setMetadata (Kind, JMD);
3371
3368
break ;
3372
3369
case LLVMContext::MD_invariant_group:
@@ -3376,36 +3373,39 @@ void llvm::combineMetadata(Instruction *K, const Instruction *J,
3376
3373
// Combine MMRAs
3377
3374
break ;
3378
3375
case LLVMContext::MD_align:
3379
- if (DoesKMove || !K->hasMetadata (LLVMContext::MD_noundef))
3376
+ if (!AAOnly && ( DoesKMove || !K->hasMetadata (LLVMContext::MD_noundef) ))
3380
3377
K->setMetadata (
3381
3378
Kind, MDNode::getMostGenericAlignmentOrDereferenceable (JMD, KMD));
3382
3379
break ;
3383
3380
case LLVMContext::MD_dereferenceable:
3384
3381
case LLVMContext::MD_dereferenceable_or_null:
3385
- if (DoesKMove)
3382
+ if (!AAOnly && DoesKMove)
3386
3383
K->setMetadata (Kind,
3387
3384
MDNode::getMostGenericAlignmentOrDereferenceable (JMD, KMD));
3388
3385
break ;
3389
3386
case LLVMContext::MD_memprof:
3390
- K->setMetadata (Kind, MDNode::getMergedMemProfMetadata (KMD, JMD));
3387
+ if (!AAOnly)
3388
+ K->setMetadata (Kind, MDNode::getMergedMemProfMetadata (KMD, JMD));
3391
3389
break ;
3392
3390
case LLVMContext::MD_callsite:
3393
- K->setMetadata (Kind, MDNode::getMergedCallsiteMetadata (KMD, JMD));
3391
+ if (!AAOnly)
3392
+ K->setMetadata (Kind, MDNode::getMergedCallsiteMetadata (KMD, JMD));
3394
3393
break ;
3395
3394
case LLVMContext::MD_preserve_access_index:
3396
3395
// Preserve !preserve.access.index in K.
3397
3396
break ;
3398
3397
case LLVMContext::MD_noundef:
3399
3398
// If K does move, keep noundef if it is present in both instructions.
3400
- if (DoesKMove)
3399
+ if (!AAOnly && DoesKMove)
3401
3400
K->setMetadata (Kind, JMD);
3402
3401
break ;
3403
3402
case LLVMContext::MD_nontemporal:
3404
3403
// Preserve !nontemporal if it is present on both instructions.
3405
- K->setMetadata (Kind, JMD);
3404
+ if (!AAOnly)
3405
+ K->setMetadata (Kind, JMD);
3406
3406
break ;
3407
3407
case LLVMContext::MD_prof:
3408
- if (DoesKMove)
3408
+ if (!AAOnly && DoesKMove)
3409
3409
K->setMetadata (Kind, MDNode::getMergedProfMetadata (KMD, JMD, K, J));
3410
3410
break ;
3411
3411
case LLVMContext::MD_noalias_addrspace:
@@ -3437,28 +3437,12 @@ void llvm::combineMetadata(Instruction *K, const Instruction *J,
3437
3437
}
3438
3438
3439
3439
void llvm::combineMetadataForCSE (Instruction *K, const Instruction *J,
3440
- bool KDominatesJ) {
3441
- unsigned KnownIDs[] = {LLVMContext::MD_tbaa,
3442
- LLVMContext::MD_alias_scope,
3443
- LLVMContext::MD_noalias,
3444
- LLVMContext::MD_range,
3445
- LLVMContext::MD_fpmath,
3446
- LLVMContext::MD_invariant_load,
3447
- LLVMContext::MD_nonnull,
3448
- LLVMContext::MD_invariant_group,
3449
- LLVMContext::MD_align,
3450
- LLVMContext::MD_dereferenceable,
3451
- LLVMContext::MD_dereferenceable_or_null,
3452
- LLVMContext::MD_access_group,
3453
- LLVMContext::MD_preserve_access_index,
3454
- LLVMContext::MD_prof,
3455
- LLVMContext::MD_nontemporal,
3456
- LLVMContext::MD_noundef,
3457
- LLVMContext::MD_mmra,
3458
- LLVMContext::MD_noalias_addrspace,
3459
- LLVMContext::MD_memprof,
3460
- LLVMContext::MD_callsite};
3461
- combineMetadata (K, J, KnownIDs, KDominatesJ);
3440
+ bool DoesKMove) {
3441
+ combineMetadata (K, J, DoesKMove);
3442
+ }
3443
+
3444
+ void llvm::combineAAMetadata (Instruction *K, const Instruction *J) {
3445
+ combineMetadata (K, J, /* DoesKMove=*/ true , /* AAOnly=*/ true );
3462
3446
}
3463
3447
3464
3448
void llvm::copyMetadataForLoad (LoadInst &Dest, const LoadInst &Source) {
0 commit comments