-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[LICM] Only set AA metadata on hoisted load if it executes. #117204
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-llvm-transforms Author: Florian Hahn (fhahn) Changes#116220 clarified that violations of aliasing metadata are UB. Only set the AA metadata after hoisting a log, if it is guaranteed to execute in the original loop. Full diff: https://github.com/llvm/llvm-project/pull/117204.diff 3 Files Affected:
diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp
index 94bfe44a847a37..0d2fb6e81b211b 100644
--- a/llvm/lib/Transforms/Scalar/LICM.cpp
+++ b/llvm/lib/Transforms/Scalar/LICM.cpp
@@ -2030,7 +2030,9 @@ bool llvm::promoteLoopAccessesToScalars(
bool DereferenceableInPH = false;
bool StoreIsGuanteedToExecute = false;
+ bool LoadIsGuanteedToExecute = false;
bool FoundLoadToPromote = false;
+
// Goes from Unknown to either Safe or Unsafe, but can't switch between them.
enum {
StoreSafe,
@@ -2088,11 +2090,15 @@ bool llvm::promoteLoopAccessesToScalars(
FoundLoadToPromote = true;
Align InstAlignment = Load->getAlign();
+ bool GuaranteedToExecute =
+ SafetyInfo->isGuaranteedToExecute(*UI, DT, CurLoop);
+ LoadIsGuanteedToExecute |= GuaranteedToExecute;
// Note that proving a load safe to speculate requires proving
// sufficient alignment at the target location. Proving it guaranteed
// to execute does as well. Thus we can increase our guaranteed
// alignment as well.
+
if (!DereferenceableInPH || (InstAlignment > Alignment))
if (isSafeToExecuteUnconditionally(
*Load, DT, TLI, CurLoop, SafetyInfo, ORE,
@@ -2247,7 +2253,7 @@ bool llvm::promoteLoopAccessesToScalars(
PreheaderLoad->setOrdering(AtomicOrdering::Unordered);
PreheaderLoad->setAlignment(Alignment);
PreheaderLoad->setDebugLoc(DebugLoc());
- if (AATags)
+ if (AATags && LoadIsGuanteedToExecute)
PreheaderLoad->setAAMetadata(AATags);
MemoryAccess *PreheaderLoadMemoryAccess = MSSAU.createMemoryAccessInBB(
diff --git a/llvm/test/Transforms/LICM/hoist-metadata.ll b/llvm/test/Transforms/LICM/hoist-metadata.ll
index 60b61944b33ae0..fc66d98725b524 100644
--- a/llvm/test/Transforms/LICM/hoist-metadata.ll
+++ b/llvm/test/Transforms/LICM/hoist-metadata.ll
@@ -77,7 +77,7 @@ define void @noalias_metadata_load_may_not_execute() {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 16
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[A]]
-; CHECK-NEXT: [[GEP_PROMOTED:%.*]] = load i32, ptr [[GEP]], align 4, !tbaa [[TBAA3:![0-9]+]], !noalias [[META7:![0-9]+]]
+; CHECK-NEXT: [[GEP_PROMOTED:%.*]] = load i32, ptr [[GEP]], align 4
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
; CHECK: loop.header:
; CHECK-NEXT: [[ADD1:%.*]] = phi i32 [ [[GEP_PROMOTED]], [[ENTRY:%.*]] ], [ [[ADD:%.*]], [[LOOP_LATCH:%.*]] ]
@@ -92,7 +92,7 @@ define void @noalias_metadata_load_may_not_execute() {
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_HEADER]], label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: [[ADD2:%.*]] = phi i32 [ [[ADD]], [[LOOP_LATCH]] ], [ [[ADD1]], [[LOOP_HEADER]] ]
-; CHECK-NEXT: store i32 [[ADD2]], ptr [[GEP]], align 4, !tbaa [[TBAA3]], !noalias [[META7]]
+; CHECK-NEXT: store i32 [[ADD2]], ptr [[GEP]], align 4, !tbaa [[TBAA3:![0-9]+]], !noalias [[META7:![0-9]+]]
; CHECK-NEXT: ret void
;
entry:
diff --git a/llvm/test/Transforms/LICM/hoisting-preheader-debugloc.ll b/llvm/test/Transforms/LICM/hoisting-preheader-debugloc.ll
index 570f4230c1a90d..61f0eb19a9bd1b 100644
--- a/llvm/test/Transforms/LICM/hoisting-preheader-debugloc.ll
+++ b/llvm/test/Transforms/LICM/hoisting-preheader-debugloc.ll
@@ -1,6 +1,8 @@
; RUN: opt -passes=licm %s -S | FileCheck %s
-; CHECK: %arrayidx4.promoted = load i32, ptr %arrayidx4, align 4, !tbaa !{{[0-9]+$}}
+; CHECK: %arrayidx4.promoted = load i32, ptr %arrayidx4, align 4
+; CHECK-NOT: !dbg
+; CHECK: br label %for.body
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
llvm/lib/Transforms/Scalar/LICM.cpp
Outdated
@@ -2030,7 +2030,9 @@ bool llvm::promoteLoopAccessesToScalars( | |||
|
|||
bool DereferenceableInPH = false; | |||
bool StoreIsGuanteedToExecute = false; | |||
bool LoadIsGuanteedToExecute = false; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
bool LoadIsGuanteedToExecute = false; | |
bool LoadIsGuaranteedToExecute = false; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done. thanks!
llvm/lib/Transforms/Scalar/LICM.cpp
Outdated
@@ -2247,7 +2253,7 @@ bool llvm::promoteLoopAccessesToScalars( | |||
PreheaderLoad->setOrdering(AtomicOrdering::Unordered); | |||
PreheaderLoad->setAlignment(Alignment); | |||
PreheaderLoad->setDebugLoc(DebugLoc()); | |||
if (AATags) | |||
if (AATags && LoadIsGuanteedToExecute) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we also need to check StoreIsGuaranteedToExecute for the LoopPromoter use above. Should only copy AATags if it's a non-speculative store.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated, thanks.
llvm/lib/Transforms/Scalar/LICM.cpp
Outdated
@@ -2088,11 +2090,15 @@ bool llvm::promoteLoopAccessesToScalars( | |||
FoundLoadToPromote = true; | |||
|
|||
Align InstAlignment = Load->getAlign(); | |||
bool GuaranteedToExecute = | |||
SafetyInfo->isGuaranteedToExecute(*UI, DT, CurLoop); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unnecessary intermediate variable?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
removed, thanks
b5e6565
to
bd15339
Compare
llvm/lib/Transforms/Scalar/LICM.cpp
Outdated
@@ -2234,7 +2241,7 @@ bool llvm::promoteLoopAccessesToScalars( | |||
LoopPromoter Promoter(SomePtr, LoopUses, SSA, ExitBlocks, InsertPts, | |||
MSSAInsertPts, PIC, MSSAU, *LI, DL, Alignment, | |||
SawUnorderedAtomic, AATags, *SafetyInfo, | |||
StoreSafety == StoreSafe); | |||
StoreSafety == StoreSafe, StoreIsGuanteedToExecute); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rather than passing down the variable, can we pass empty AATags here if !guaranteed?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done, thanks!
llvm/lib/Transforms/Scalar/LICM.cpp
Outdated
@@ -2088,6 +2093,8 @@ bool llvm::promoteLoopAccessesToScalars( | |||
FoundLoadToPromote = true; | |||
|
|||
Align InstAlignment = Load->getAlign(); | |||
LoadIsGuaranteedToExecute |= |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe wrap this in if (!LoadIsGuaranteedToExecute)
to save unnecessary queries.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done, thanks!
llvm#116220 clarified that violations of aliasing metadata are UB. Only set the AA metadata after hoisting a log, if it is guaranteed to execute in the original loop.
bd15339
to
67c9047
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
#116220 clarified that violations of aliasing metadata are UB.
Only set the AA metadata after hoisting a log, if it is guaranteed to execute in the original loop.