diff options
author | Fangrui Song <i@maskray.me> | 2024-06-19 15:36:46 -0700 |
---|---|---|
committer | Fangrui Song <i@maskray.me> | 2024-06-19 15:36:46 -0700 |
commit | 89e8e63f47ffc355bf5c55cea8f43a806174cce8 (patch) | |
tree | 38788e1f034eea1c8073a44ced250af6270d40b6 | |
parent | cae6d458a0a528a037f6a43f308a9d92048f8ef1 (diff) | |
download | llvm-89e8e63f47ffc355bf5c55cea8f43a806174cce8.zip llvm-89e8e63f47ffc355bf5c55cea8f43a806174cce8.tar.gz llvm-89e8e63f47ffc355bf5c55cea8f43a806174cce8.tar.bz2 |
[Attributor] Stabilize llvm.assume output
Don't rely on the iteration order of DenseSet<StringRef>, which is not
guaranteed to be deterministic.
-rw-r--r-- | llvm/lib/Transforms/IPO/AttributorAttributes.cpp | 27 | ||||
-rw-r--r-- | llvm/test/Transforms/Attributor/assumes_info.ll | 8 | ||||
-rw-r--r-- | llvm/test/Transforms/OpenMP/spmdization_guarding.ll | 8 |
3 files changed, 24 insertions, 19 deletions
diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp index 57579bb..c4b9375 100644 --- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp +++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp @@ -11739,11 +11739,14 @@ struct AAAssumptionInfoImpl : public AAAssumptionInfo { return ChangeStatus::UNCHANGED; const IRPosition &IRP = getIRPosition(); - return A.manifestAttrs( - IRP, - Attribute::get(IRP.getAnchorValue().getContext(), AssumptionAttrKey, - llvm::join(getAssumed().getSet(), ",")), - /* ForceReplace */ true); + SmallVector<StringRef, 0> Set(getAssumed().getSet().begin(), + getAssumed().getSet().end()); + llvm::sort(Set); + return A.manifestAttrs(IRP, + Attribute::get(IRP.getAnchorValue().getContext(), + AssumptionAttrKey, + llvm::join(Set, ",")), + /*ForceReplace=*/true); } bool hasAssumption(const StringRef Assumption) const override { @@ -11755,13 +11758,15 @@ struct AAAssumptionInfoImpl : public AAAssumptionInfo { const SetContents &Known = getKnown(); const SetContents &Assumed = getAssumed(); - const std::string KnownStr = - llvm::join(Known.getSet().begin(), Known.getSet().end(), ","); - const std::string AssumedStr = - (Assumed.isUniversal()) - ? "Universal" - : llvm::join(Assumed.getSet().begin(), Assumed.getSet().end(), ","); + SmallVector<StringRef, 0> Set(Known.getSet().begin(), Known.getSet().end()); + llvm::sort(Set); + const std::string KnownStr = llvm::join(Set, ","); + std::string AssumedStr = "Universal"; + if (!Assumed.isUniversal()) { + Set.assign(Assumed.getSet().begin(), Assumed.getSet().end()); + AssumedStr = llvm::join(Set, ","); + } return "Known [" + KnownStr + "]," + " Assumed [" + AssumedStr + "]"; } }; diff --git a/llvm/test/Transforms/Attributor/assumes_info.ll b/llvm/test/Transforms/Attributor/assumes_info.ll index 51b6a0e..df7d7dd 100644 --- a/llvm/test/Transforms/Attributor/assumes_info.ll +++ b/llvm/test/Transforms/Attributor/assumes_info.ll @@ -117,11 +117,11 @@ attributes #2 = { "llvm.assume"="B,C" } attributes #3 = { "llvm.assume"="B,C,A" } ;. ; TUNIT: attributes #[[ATTR0]] = { "llvm.assume"="A" } -; TUNIT: attributes #[[ATTR1]] = { "llvm.assume"="B,A" } -; TUNIT: attributes #[[ATTR2]] = { "llvm.assume"="B,C,A" } +; TUNIT: attributes #[[ATTR1]] = { "llvm.assume"="A,B" } +; TUNIT: attributes #[[ATTR2]] = { "llvm.assume"="A,B,C" } ;. ; CGSCC: attributes #[[ATTR0]] = { "llvm.assume"="A" } -; CGSCC: attributes #[[ATTR1]] = { "llvm.assume"="B,A" } -; CGSCC: attributes #[[ATTR2]] = { "llvm.assume"="B,C,A" } +; CGSCC: attributes #[[ATTR1]] = { "llvm.assume"="A,B" } +; CGSCC: attributes #[[ATTR2]] = { "llvm.assume"="A,B,C" } ; CGSCC: attributes #[[ATTR3]] = { "llvm.assume"="B" } ;. diff --git a/llvm/test/Transforms/OpenMP/spmdization_guarding.ll b/llvm/test/Transforms/OpenMP/spmdization_guarding.ll index bd128b7..229a49d 100644 --- a/llvm/test/Transforms/OpenMP/spmdization_guarding.ll +++ b/llvm/test/Transforms/OpenMP/spmdization_guarding.ll @@ -431,8 +431,8 @@ attributes #5 = { convergent nounwind "llvm.assume"="omp_no_openmp,ompx_spmd_ame ; CHECK: attributes #[[ATTR6]] = { nounwind } ; CHECK: attributes #[[ATTR7:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } ; CHECK: attributes #[[ATTR8:[0-9]+]] = { convergent nounwind } -; CHECK: attributes #[[ATTR9]] = { nounwind willreturn "llvm.assume"="ompx_spmd_amenable,omp_no_openmp" } -; CHECK: attributes #[[ATTR10]] = { convergent nounwind "llvm.assume"="ompx_spmd_amenable,omp_no_openmp" } +; CHECK: attributes #[[ATTR9]] = { nounwind willreturn "llvm.assume"="omp_no_openmp,ompx_spmd_amenable" } +; CHECK: attributes #[[ATTR10]] = { convergent nounwind "llvm.assume"="omp_no_openmp,ompx_spmd_amenable" } ;. ; CHECK-DISABLED: attributes #[[ATTR0]] = { convergent norecurse nounwind "frame-pointer"="all" "kernel" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="sm_53" "target-features"="+ptx32,+sm_53" } ; CHECK-DISABLED: attributes #[[ATTR1:[0-9]+]] = { alwaysinline } @@ -443,8 +443,8 @@ attributes #5 = { convergent nounwind "llvm.assume"="omp_no_openmp,ompx_spmd_ame ; CHECK-DISABLED: attributes #[[ATTR6]] = { nounwind } ; CHECK-DISABLED: attributes #[[ATTR7:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } ; CHECK-DISABLED: attributes #[[ATTR8:[0-9]+]] = { convergent nounwind } -; CHECK-DISABLED: attributes #[[ATTR9]] = { nounwind willreturn "llvm.assume"="ompx_spmd_amenable,omp_no_openmp" } -; CHECK-DISABLED: attributes #[[ATTR10]] = { convergent nounwind "llvm.assume"="ompx_spmd_amenable,omp_no_openmp" } +; CHECK-DISABLED: attributes #[[ATTR9]] = { nounwind willreturn "llvm.assume"="omp_no_openmp,ompx_spmd_amenable" } +; CHECK-DISABLED: attributes #[[ATTR10]] = { convergent nounwind "llvm.assume"="omp_no_openmp,ompx_spmd_amenable" } ;. ; CHECK: [[META0:![0-9]+]] = !{i32 0, i32 42, i32 16513658, !"sequential_loop", i32 6, i32 0} ; CHECK: [[META1:![0-9]+]] = !{ptr @__omp_offloading_2a_fbfa7a_sequential_loop_l6, !"kernel", i32 1} |