Fix a FIXME about the format and add a test.
[oota-llvm.git] / test / Transforms / Sink / basic.ll
index 81782e9d42c860d9edfa6adc4307855cd4a23db3..1d0b6b529d56c5a9c4d8b9ed5af6024081a5dfc4 100644 (file)
@@ -21,14 +21,14 @@ false:
   ret i32 0
 }
 
-; But don't sink volatile loads...
+; But don't sink load volatiles...
 
 ;      CHECK: @foo2
-;      CHECK: volatile load
+;      CHECK: load volatile
 ; CHECK-NEXT: store i32
 
 define i32 @foo2(i1 %z) {
-  %l = volatile load i32* @A
+  %l = load volatile i32* @A
   store i32 0, i32* @B
   br i1 %z, label %true, label %false
 true:
@@ -36,3 +36,29 @@ true:
 false:
   ret i32 0
 }
+
+; Sink to the nearest post-dominator
+
+;      CHECK: @diamond
+;      CHECK: X:
+; CHECK-NEXT: phi
+; CHECK-NEXT: mul nsw
+; CHECK-NEXT: sub
+
+define i32 @diamond(i32 %a, i32 %b, i32 %c) {
+  %1 = mul nsw i32 %c, %b
+  %2 = icmp sgt i32 %a, 0
+  br i1 %2, label %B0, label %B1
+
+B0:                                       ; preds = %0
+  br label %X
+
+B1:                                      ; preds = %0
+  br label %X
+
+X:                                     ; preds = %5, %3
+  %.01 = phi i32 [ %c, %B0 ], [ %a, %B1 ]
+  %R = sub i32 %1, %.01
+  ret i32 %R
+}
+