[llvm] r355111 - [Tests] Strengthen LICM test corpus to show alignment striping. (part 2)

Philip Reames via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 28 10:17:51 PST 2019


Author: reames
Date: Thu Feb 28 10:17:51 2019
New Revision: 355111

URL: http://llvm.org/viewvc/llvm-project?rev=355111&view=rev
Log:
[Tests] Strengthen LICM test corpus to show alignment striping. (part 2)

This should have been part of r355110, but my brain isn't quite awake yet, despite the coffee.  Per the original submit comment... Doing scalar promotion w/o being able to prove the alignment of the hoisted load or sunk store is a bug.  Update tests to actually show the alignment so that impact of the patch which fixes this can be seen.


Modified:
    llvm/trunk/test/Transforms/LICM/scalar-promote-unwind.ll

Modified: llvm/trunk/test/Transforms/LICM/scalar-promote-unwind.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LICM/scalar-promote-unwind.ll?rev=355111&r1=355110&r2=355111&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/LICM/scalar-promote-unwind.ll (original)
+++ llvm/trunk/test/Transforms/LICM/scalar-promote-unwind.ll Thu Feb 28 10:17:51 2019
@@ -67,6 +67,8 @@ for.cond.cleanup:
   ret void
 }
 
+;; We can promote if the load can be proven safe to speculate, and the
+;; store safe to sink, even if the the store *isn't* must execute.
 define void @test3(i1 zeroext %y) uwtable {
 ; CHECK-LABEL: @test3
 entry:
@@ -92,6 +94,35 @@ for.cond.cleanup:
 ; CHECK-NEXT: ret void
   ret void
 }
+
+;; Same as test3, but with unordered atomics
+;; FIXME: doing the transform w/o alignment here is wrong since we're
+;; creating an unaligned atomic which we may not be able to lower.
+define void @test3b(i1 zeroext %y) uwtable {
+; CHECK-LABEL: @test3
+entry:
+; CHECK-LABEL: entry:
+; CHECK-NEXT:  %a = alloca i32
+; CHECK-NEXT:  %a.promoted = load atomic i32, i32* %a unordered, align 1
+  %a = alloca i32
+  br label %for.body
+
+for.body:
+  %i.03 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
+  %0 = load atomic i32, i32* %a unordered, align 4
+  %add = add nsw i32 %0, 1
+  tail call void @f()
+  store atomic i32 %add, i32* %a unordered, align 4
+  %inc = add nuw nsw i32 %i.03, 1
+  %exitcond = icmp eq i32 %inc, 10000
+  br i1 %exitcond, label %for.cond.cleanup, label %for.body
+
+for.cond.cleanup:
+; CHECK-LABEL: for.cond.cleanup:
+; CHECK: store atomic i32 %add.lcssa, i32* %a unordered, align 1
+; CHECK-NEXT: ret void
+  ret void
+}
 
 @_ZTIi = external constant i8*
 




More information about the llvm-commits mailing list