Fix a broadcast related regression on the vector shuffle lowering.
[oota-llvm.git] / test / CodeGen / X86 / peep-test-4.ll
index bc090c176b01ca22b5b4fe91c1496389e9124908..1ae621fb1f5886beb0d1a7553aefb7f13e4bb921 100644 (file)
@@ -1,7 +1,9 @@
-; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+bmi,+bmi2,+popcnt | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+bmi,+bmi2,+popcnt,+lzcnt | FileCheck %s
 declare void @foo(i32)
+declare void @foo32(i32)
+declare void @foo64(i64)
 
-; CHECK: neg:
+; CHECK-LABEL: neg:
 ; CHECK: negl %edi
 ; CHECK-NEXT: je
 ; CHECK: jmp foo
@@ -19,7 +21,7 @@ return:
   ret void
 }
 
-; CHECK: sar:
+; CHECK-LABEL: sar:
 ; CHECK: sarl %edi
 ; CHECK-NEXT: je
 ; CHECK: jmp foo
@@ -37,7 +39,7 @@ return:
   ret void
 }
 
-; CHECK: shr:
+; CHECK-LABEL: shr:
 ; CHECK: shrl %edi
 ; CHECK-NEXT: je
 ; CHECK: jmp foo
@@ -55,7 +57,25 @@ return:
   ret void
 }
 
-; CHECK: shl:
+; CHECK-LABEL: shri:
+; CHECK: shrl $3, %edi
+; CHECK-NEXT: je
+; CHECK: jmp foo
+; CHECK: ret
+define void @shri(i32 %x) nounwind {
+  %ashr = lshr i32 %x, 3
+  %cmp = icmp eq i32 %ashr, 0
+  br i1 %cmp, label %return, label %bb
+
+bb:
+  tail call void @foo(i32 %ashr)
+  br label %return
+
+return:
+  ret void
+}
+
+; CHECK-LABEL: shl:
 ; CHECK: addl %edi, %edi
 ; CHECK-NEXT: je
 ; CHECK: jmp foo
@@ -73,30 +93,48 @@ return:
   ret void
 }
 
-; CHECK: adc:
+; CHECK-LABEL: shli:
+; CHECK: shll $4, %edi
+; CHECK-NEXT: je
+; CHECK: jmp foo
+; CHECK: ret
+define void @shli(i32 %x) nounwind {
+  %shl = shl i32 %x, 4
+  %cmp = icmp eq i32 %shl, 0
+  br i1 %cmp, label %return, label %bb
+
+bb:
+  tail call void @foo(i32 %shl)
+  br label %return
+
+return:
+  ret void
+}
+
+; CHECK-LABEL: adc:
 ; CHECK: movabsq $-9223372036854775808, %rax
 ; CHECK-NEXT: addq  %rdi, %rax
 ; CHECK-NEXT: adcq  $0, %rsi
 ; CHECK-NEXT: sete  %al
-; CHECK-NEXT: ret
+; CHECK: ret
 define zeroext i1 @adc(i128 %x) nounwind {
   %add = add i128 %x, 9223372036854775808
   %cmp = icmp ult i128 %add, 18446744073709551616
   ret i1 %cmp
 }
 
-; CHECK: sbb:
+; CHECK-LABEL: sbb:
 ; CHECK: cmpq  %rdx, %rdi
 ; CHECK-NEXT: sbbq  %rcx, %rsi
 ; CHECK-NEXT: setns %al
-; CHECK-NEXT: ret
+; CHECK: ret
 define zeroext i1 @sbb(i128 %x, i128 %y) nounwind {
   %sub = sub i128 %x, %y
   %cmp = icmp sge i128 %sub, 0
   ret i1 %cmp
 }
 
-; CHECK: andn:
+; CHECK-LABEL: andn:
 ; CHECK: andnl   %esi, %edi, %edi
 ; CHECK-NEXT: je
 ; CHECK: jmp foo
@@ -115,7 +153,7 @@ return:
   ret void
 }
 
-; CHECK: bextr:
+; CHECK-LABEL: bextr:
 ; CHECK: bextrl   %esi, %edi, %edi
 ; CHECK-NEXT: je
 ; CHECK: jmp foo
@@ -134,7 +172,7 @@ return:
   ret void
 }
 
-; CHECK: popcnt:
+; CHECK-LABEL: popcnt:
 ; CHECK: popcntl
 ; CHECK-NEXT: je
 ; CHECK: jmp foo
@@ -152,3 +190,76 @@ bb:
 return:
   ret void
 }
+
+; CHECK-LABEL: testCTZ
+; CHECK: tzcntq
+; CHECK-NOT: test
+; CHECK: cmovaeq
+declare i64 @llvm.cttz.i64(i64, i1)
+define i64 @testCTZ(i64 %v) nounwind {
+  %cnt = tail call i64 @llvm.cttz.i64(i64 %v, i1 true)
+  %tobool = icmp eq i64 %v, 0
+  %cond = select i1 %tobool, i64 255, i64 %cnt
+  ret i64 %cond
+}
+
+; CHECK-LABEL: testCTZ2
+; CHECK: tzcntl
+; CHECK-NEXT: jb
+; CHECK: jmp foo
+declare i32 @llvm.cttz.i32(i32, i1)
+define void @testCTZ2(i32 %v) nounwind {
+  %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true)
+  %cmp = icmp eq i32 %v, 0
+  br i1 %cmp, label %return, label %bb
+
+bb:
+  tail call void @foo(i32 %cnt)
+  br label %return
+
+return:
+  tail call void @foo32(i32 %cnt)
+  ret void
+}
+
+; CHECK-LABEL: testCTZ3
+; CHECK: tzcntl
+; CHECK-NEXT: jae
+; CHECK: jmp foo
+define void @testCTZ3(i32 %v) nounwind {
+  %cnt = tail call i32 @llvm.cttz.i32(i32 %v, i1 true)
+  %cmp = icmp ne i32 %v, 0
+  br i1 %cmp, label %return, label %bb
+
+bb:
+  tail call void @foo(i32 %cnt)
+  br label %return
+
+return:
+  tail call void @foo32(i32 %cnt)
+  ret void
+}
+
+; CHECK-LABEL: testCLZ
+; CHECK: lzcntq
+; CHECK-NOT: test
+; CHECK: cmovaeq
+declare i64 @llvm.ctlz.i64(i64, i1)
+define i64 @testCLZ(i64 %v) nounwind {
+  %cnt = tail call i64 @llvm.ctlz.i64(i64 %v, i1 true)
+  %tobool = icmp ne i64 %v, 0
+  %cond = select i1 %tobool, i64 %cnt, i64 255
+  ret i64 %cond
+}
+
+; CHECK-LABEL: testPOPCNT
+; CHECK: popcntq
+; CHECK-NOT: test
+; CHECK: cmovneq
+declare i64 @llvm.ctpop.i64(i64)
+define i64 @testPOPCNT(i64 %v) nounwind {
+  %cnt = tail call i64 @llvm.ctpop.i64(i64 %v)
+  %tobool = icmp ne i64 %v, 0
+  %cond = select i1 %tobool, i64 %cnt, i64 255
+  ret i64 %cond
+}