Skip to content

Commit fc47770

Browse files
committed
Fix atomic handling in "[LICM] Make promotion faster"
This is a combined cherry-pick of 2948242 and 403da6a to fix handling of atomics.
1 parent 45df96b commit fc47770

File tree

4 files changed

+38
-11
lines changed

4 files changed

+38
-11
lines changed

llvm/include/llvm/Analysis/AliasSetTracker.h

-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
#include "llvm/ADT/DenseMapInfo.h"
2121
#include "llvm/ADT/ilist.h"
2222
#include "llvm/ADT/ilist_node.h"
23-
#include "llvm/Analysis/AliasAnalysis.h"
2423
#include "llvm/Analysis/MemoryLocation.h"
2524
#include "llvm/IR/Instruction.h"
2625
#include "llvm/IR/Metadata.h"

llvm/lib/Analysis/AliasSetTracker.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "llvm/Analysis/AliasSetTracker.h"
14+
#include "llvm/Analysis/AliasAnalysis.h"
1415
#include "llvm/Analysis/GuardUtils.h"
1516
#include "llvm/Analysis/LoopInfo.h"
1617
#include "llvm/Analysis/MemoryLocation.h"

llvm/lib/Transforms/Scalar/LICM.cpp

+3-10
Original file line numberDiff line numberDiff line change
@@ -2286,16 +2286,9 @@ collectPromotionCandidates(MemorySSA *MSSA, AliasAnalysis *AA, Loop *L,
22862286
if (AttemptingPromotion.contains(I))
22872287
return;
22882288

2289-
if (Optional<MemoryLocation> Loc = MemoryLocation::getOrNone(I)) {
2290-
llvm::erase_if(Sets, [&](const AliasSet *AS) {
2291-
return AS->aliasesPointer(Loc->Ptr, Loc->Size, Loc->AATags, *AA)
2292-
!= NoAlias;
2293-
});
2294-
} else {
2295-
llvm::erase_if(Sets, [&](const AliasSet *AS) {
2296-
return AS->aliasesUnknownInst(I, *AA);
2297-
});
2298-
}
2289+
llvm::erase_if(Sets, [&](const AliasSet *AS) {
2290+
return AS->aliasesUnknownInst(I, *AA);
2291+
});
22992292
});
23002293

23012294
SmallVector<SmallSetVector<Value *, 8>, 0> Result;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -S -licm < %s | FileCheck %s
3+
4+
%class.LiveThread = type { i64, %class.LiveThread* }
5+
6+
@globallive = external dso_local global i64, align 8
7+
8+
; The store should not be sunk (via scalar promotion) past the cmpxchg.
9+
10+
define void @test(%class.LiveThread* %live_thread) {
11+
; CHECK-LABEL: @test(
12+
; CHECK-NEXT: [[NEXT_UNPROCESSED_:%.*]] = getelementptr inbounds [[CLASS_LIVETHREAD:%.*]], %class.LiveThread* [[LIVE_THREAD:%.*]], i64 0, i32 1
13+
; CHECK-NEXT: br label [[LOOP:%.*]]
14+
; CHECK: loop:
15+
; CHECK-NEXT: store %class.LiveThread* undef, %class.LiveThread** [[NEXT_UNPROCESSED_]], align 8
16+
; CHECK-NEXT: [[XCHG:%.*]] = cmpxchg weak i64* @globallive, i64 undef, i64 undef release monotonic, align 8
17+
; CHECK-NEXT: [[DONE:%.*]] = extractvalue { i64, i1 } [[XCHG]], 1
18+
; CHECK-NEXT: br i1 [[DONE]], label [[EXIT:%.*]], label [[LOOP]]
19+
; CHECK: exit:
20+
; CHECK-NEXT: ret void
21+
;
22+
%next_unprocessed_ = getelementptr inbounds %class.LiveThread, %class.LiveThread* %live_thread, i64 0, i32 1
23+
br label %loop
24+
25+
loop:
26+
store %class.LiveThread* undef, %class.LiveThread** %next_unprocessed_, align 8
27+
%xchg = cmpxchg weak i64* @globallive, i64 undef, i64 undef release monotonic, align 8
28+
%done = extractvalue { i64, i1 } %xchg, 1
29+
br i1 %done, label %exit, label %loop
30+
31+
exit:
32+
ret void
33+
}
34+

0 commit comments

Comments
 (0)