[PATCH] D86816: [LoopDelete][Assume] Allow deleting loops with assumes

Tyker via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 28 14:17:18 PDT 2020


Tyker created this revision.
Tyker added a reviewer: jdoerfert.
Herald added subscribers: llvm-commits, danielkiss, hiraditya.
Herald added a project: LLVM.
Tyker requested review of this revision.

This pervent very poor optimization caused by a signle assume like https://godbolt.org/z/EK3oMh

baseline flags: -O3
patched flags: -O3 -mllvm --enable-knowledge-retention

Before the patch

  Metric: compile_time
  Program                                                      baseline patched diff
               test-suite :: CTMark/tramp3d-v4/tramp3d-v4.test  20.72    29.74  43.5%
                       test-suite :: CTMark/Bullet/bullet.test  24.39    24.91   2.2%
                 test-suite :: CTMark/7zip/7zip-benchmark.test  37.39    38.06   1.8%
                        test-suite :: CTMark/kimwitu++/kc.test  11.76    11.94   1.5%
                     test-suite :: CTMark/sqlite3/sqlite3.test  12.94    12.91  -0.3%
                         test-suite :: CTMark/SPASS/SPASS.test  11.72    11.70  -0.2%
                       test-suite :: CTMark/lencod/lencod.test  16.12    16.10  -0.1%
                     test-suite :: CTMark/ClamAV/clamscan.test  13.31    13.30  -0.1%
                test-suite :: CTMark/mafft/pairlocalalign.test   9.12     9.12  -0.1%
   test-suite :: CTMark/consumer-typeset/consumer-typeset.test   9.34     9.34  -0.1%
                                            Geomean difference                   4.2%
  
  Metric: compiler_Kinst_count
  Program                                                      baseline     patched      diff
               test-suite :: CTMark/tramp3d-v4/tramp3d-v4.test 107576069.87 172886418.90 60.7%
                       test-suite :: CTMark/Bullet/bullet.test 123291865.66 125457117.96  1.8%
                        test-suite :: CTMark/kimwitu++/kc.test  56347884.64  57298544.14  1.7%
                 test-suite :: CTMark/7zip/7zip-benchmark.test 180637699.58 183341656.57  1.5%
                     test-suite :: CTMark/sqlite3/sqlite3.test  66723788.85  66664692.80 -0.1%
                     test-suite :: CTMark/ClamAV/clamscan.test  69581500.56  69597863.92  0.0%
                       test-suite :: CTMark/lencod/lencod.test  94236501.48  94216545.32 -0.0%
                         test-suite :: CTMark/SPASS/SPASS.test  58516756.95  58505089.07 -0.0%
   test-suite :: CTMark/consumer-typeset/consumer-typeset.test  48832815.53  48841989.39  0.0%
                test-suite :: CTMark/mafft/pairlocalalign.test  49682720.53  49686324.34  0.0%
                                            Geomean difference                            5.4%

After the patch

  Metric: compile_time
  Program                                                      baseline patched diff
               test-suite :: CTMark/tramp3d-v4/tramp3d-v4.test  20.70    22.40   8.2%
                 test-suite :: CTMark/7zip/7zip-benchmark.test  37.13    38.05   2.5%
                       test-suite :: CTMark/Bullet/bullet.test  24.25    24.83   2.4%
                        test-suite :: CTMark/kimwitu++/kc.test  11.69    11.94   2.2%
                     test-suite :: CTMark/ClamAV/clamscan.test  13.19    13.36   1.3%
                       test-suite :: CTMark/lencod/lencod.test  16.02    16.19   1.1%
   test-suite :: CTMark/consumer-typeset/consumer-typeset.test   9.29     9.36   0.7%
                         test-suite :: CTMark/SPASS/SPASS.test  11.64    11.73   0.7%
                test-suite :: CTMark/mafft/pairlocalalign.test   9.10     9.15   0.5%
                     test-suite :: CTMark/sqlite3/sqlite3.test  12.95    12.96   0.0%
                                            Geomean difference                   1.9%
  
  Metric: compiler_Kinst_count
  Program                                                      baseline     patched      diff
               test-suite :: CTMark/tramp3d-v4/tramp3d-v4.test 107590933.61 114044834.72  6.0%
                        test-suite :: CTMark/kimwitu++/kc.test  56344526.77  57235806.29  1.6%
                       test-suite :: CTMark/Bullet/bullet.test 123291285.10 125128334.97  1.5%
                 test-suite :: CTMark/7zip/7zip-benchmark.test 180641540.10 183155706.39  1.4%
                     test-suite :: CTMark/sqlite3/sqlite3.test  66725619.22  66668713.92 -0.1%
                         test-suite :: CTMark/SPASS/SPASS.test  58509029.85  58478704.75 -0.1%
   test-suite :: CTMark/consumer-typeset/consumer-typeset.test  48843711.23  48826894.68 -0.0%
                       test-suite :: CTMark/lencod/lencod.test  94233305.79  94207544.23 -0.0%
                     test-suite :: CTMark/ClamAV/clamscan.test  69587887.66  69603549.90  0.0%
                test-suite :: CTMark/mafft/pairlocalalign.test  49686968.65  49689291.04  0.0%
                                            Geomean difference                            1.0%

I am not sure this fix is the best way to fix the issue. I think the issue is more general,
assume are considered as modifying memory because they are control-flow sensitive
but they dont't affect memory. because of this mayHaveSideEffects returns true for assumes when it souldn't.

any thought ?


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D86816

Files:
  llvm/lib/Transforms/Scalar/LoopDeletion.cpp
  llvm/test/Transforms/LoopDeletion/assume.ll


Index: llvm/test/Transforms/LoopDeletion/assume.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/LoopDeletion/assume.ll
@@ -0,0 +1,40 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt %s -passes=loop-deletion -S | FileCheck %s --check-prefixes=CHECK
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+%class.Loc.95 = type { %class.Domain.96 }
+%class.Domain.96 = type { %class.DomainBase.97 }
+%class.DomainBase.97 = type { [3 x %struct.WrapNoInit] }
+%struct.WrapNoInit = type { %class.Loc }
+%class.Loc = type { %class.Domain.67 }
+%class.Domain.67 = type { %class.DomainBase.68 }
+%class.DomainBase.68 = type { i32 }
+
+define dso_local void @_ZSt8_DestroyIP3LocILi3EES1_EvT_S3_RSaIT0_E(%class.Loc.95* %0) #0 {
+; CHECK-LABEL: @_ZSt8_DestroyIP3LocILi3EES1_EvT_S3_RSaIT0_E(
+; CHECK-NEXT:    br label [[_ZST8_DESTROYIP3LOCILI3EEEVT_S3__EXIT:%.*]]
+; CHECK:       _ZSt8_DestroyIP3LocILi3EEEvT_S3_.exit:
+; CHECK-NEXT:    ret void
+;
+  br label %2
+
+2:                                                ; preds = %4, %1
+  %.0.i.i = phi %class.Loc.95* [ undef, %1 ], [ %5, %4 ]
+  %3 = icmp ne %class.Loc.95* %.0.i.i, %0
+  br i1 %3, label %4, label %_ZSt8_DestroyIP3LocILi3EEEvT_S3_.exit
+
+4:                                                ; preds = %2
+  call void @llvm.assume(i1 true) [ "align"(%class.Loc.95* %.0.i.i, i64 4) ]
+  %5 = getelementptr inbounds %class.Loc.95, %class.Loc.95* %.0.i.i, i32 1
+  br label %2
+
+_ZSt8_DestroyIP3LocILi3EEEvT_S3_.exit:            ; preds = %2
+  ret void
+}
+
+declare void @llvm.assume(i1) #1
+
+attributes #0 = { "target-cpu"="x86-64" }
+attributes #1 = { willreturn readnone norecurse nocapture nofree }
Index: llvm/lib/Transforms/Scalar/LoopDeletion.cpp
===================================================================
--- llvm/lib/Transforms/Scalar/LoopDeletion.cpp
+++ llvm/lib/Transforms/Scalar/LoopDeletion.cpp
@@ -85,7 +85,9 @@
   // This includes instructions that could write to memory, and loads that are
   // marked volatile.
   for (auto &I : L->blocks())
-    if (any_of(*I, [](Instruction &I) { return I.mayHaveSideEffects(); }))
+    if (any_of(*I, [](Instruction &I) {
+          return I.mayHaveSideEffects() && !I.isDroppable();
+        }))
       return false;
   return true;
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D86816.288704.patch
Type: text/x-patch
Size: 2445 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200828/346241f3/attachment.bin>


More information about the llvm-commits mailing list