Skip to content

Commit

Permalink
Fix atomic handling in "[LICM] Make promotion faster"
Browse files Browse the repository at this point in the history
This is a combined cherry-pick of
2948242 and
403da6a to fix handling of atomics.
  • Loading branch information
nikic committed Jul 10, 2021
1 parent 45df96b commit fc47770
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 11 deletions.
1 change: 0 additions & 1 deletion llvm/include/llvm/Analysis/AliasSetTracker.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
#include "llvm/ADT/DenseMapInfo.h"
#include "llvm/ADT/ilist.h"
#include "llvm/ADT/ilist_node.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/MemoryLocation.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Metadata.h"
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Analysis/AliasSetTracker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
//===----------------------------------------------------------------------===//

#include "llvm/Analysis/AliasSetTracker.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/GuardUtils.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/MemoryLocation.h"
Expand Down
13 changes: 3 additions & 10 deletions llvm/lib/Transforms/Scalar/LICM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2286,16 +2286,9 @@ collectPromotionCandidates(MemorySSA *MSSA, AliasAnalysis *AA, Loop *L,
if (AttemptingPromotion.contains(I))
return;

if (Optional<MemoryLocation> Loc = MemoryLocation::getOrNone(I)) {
llvm::erase_if(Sets, [&](const AliasSet *AS) {
return AS->aliasesPointer(Loc->Ptr, Loc->Size, Loc->AATags, *AA)
!= NoAlias;
});
} else {
llvm::erase_if(Sets, [&](const AliasSet *AS) {
return AS->aliasesUnknownInst(I, *AA);
});
}
llvm::erase_if(Sets, [&](const AliasSet *AS) {
return AS->aliasesUnknownInst(I, *AA);
});
});

SmallVector<SmallSetVector<Value *, 8>, 0> Result;
Expand Down
34 changes: 34 additions & 0 deletions llvm/test/Transforms/LICM/promote-atomic.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S -licm < %s | FileCheck %s

%class.LiveThread = type { i64, %class.LiveThread* }

@globallive = external dso_local global i64, align 8

; The store should not be sunk (via scalar promotion) past the cmpxchg.

define void @test(%class.LiveThread* %live_thread) {
; CHECK-LABEL: @test(
; CHECK-NEXT: [[NEXT_UNPROCESSED_:%.*]] = getelementptr inbounds [[CLASS_LIVETHREAD:%.*]], %class.LiveThread* [[LIVE_THREAD:%.*]], i64 0, i32 1
; CHECK-NEXT: br label [[LOOP:%.*]]
; CHECK: loop:
; CHECK-NEXT: store %class.LiveThread* undef, %class.LiveThread** [[NEXT_UNPROCESSED_]], align 8
; CHECK-NEXT: [[XCHG:%.*]] = cmpxchg weak i64* @globallive, i64 undef, i64 undef release monotonic, align 8
; CHECK-NEXT: [[DONE:%.*]] = extractvalue { i64, i1 } [[XCHG]], 1
; CHECK-NEXT: br i1 [[DONE]], label [[EXIT:%.*]], label [[LOOP]]
; CHECK: exit:
; CHECK-NEXT: ret void
;
%next_unprocessed_ = getelementptr inbounds %class.LiveThread, %class.LiveThread* %live_thread, i64 0, i32 1
br label %loop

loop:
store %class.LiveThread* undef, %class.LiveThread** %next_unprocessed_, align 8
%xchg = cmpxchg weak i64* @globallive, i64 undef, i64 undef release monotonic, align 8
%done = extractvalue { i64, i1 } %xchg, 1
br i1 %done, label %exit, label %loop

exit:
ret void
}

0 comments on commit fc47770

Please sign in to comment.