[llvm] r304838 - [PowerPC] auto-generate full checks and increase test coverage

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 6 15:06:07 PDT 2017


Author: spatel
Date: Tue Jun  6 17:06:07 2017
New Revision: 304838

URL: http://llvm.org/viewvc/llvm-project?rev=304838&view=rev
Log:
[PowerPC] auto-generate full checks and increase test coverage

3 of the tests were testing exactly the same thing: memcmp(x, y, 16) != 0.
I changed that to test 4, 7, and 16 bytes, so we can see how those differ.

Modified:
    llvm/trunk/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll

Modified: llvm/trunk/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll?rev=304838&r1=304837&r2=304838&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll (original)
+++ llvm/trunk/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll Tue Jun  6 17:06:07 2017
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 ; RUN: llc -verify-machineinstrs -mcpu=pwr8 < %s | FileCheck %s
 target datalayout = "e-m:e-i64:64-n32:64"
 target triple = "powerpc64le-unknown-linux-gnu"
@@ -11,111 +12,193 @@ target triple = "powerpc64le-unknown-lin
 @zeroEqualityTest04.buffer1 = private unnamed_addr constant [15 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14], align 4
 @zeroEqualityTest04.buffer2 = private unnamed_addr constant [15 x i32] [i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 13], align 4
 
-; Function Attrs: nounwind readonly
 declare signext i32 @memcmp(i8* nocapture, i8* nocapture, i64) local_unnamed_addr #1
 
-; Validate with if(memcmp())
-; Function Attrs: nounwind readonly
-define signext i32 @zeroEqualityTest01() local_unnamed_addr #0 {
-entry:
-  %call = tail call signext i32 @memcmp(i8* bitcast ([3 x i32]* @zeroEqualityTest01.buffer1 to i8*), i8* bitcast ([3 x i32]* @zeroEqualityTest01.buffer2 to i8*), i64 16)
-  %not.tobool = icmp ne i32 %call, 0
-  %. = zext i1 %not.tobool to i32
+; Check 4 bytes - requires 1 load for each param.
+define signext i32 @zeroEqualityTest02(i8* %x, i8* %y) {
+; CHECK-LABEL: zeroEqualityTest02:
+; CHECK:       # BB#0: # %loadbb
+; CHECK-NEXT:    lwz 3, 0(3)
+; CHECK-NEXT:    lwz 4, 0(4)
+; CHECK-NEXT:    li 5, 1
+; CHECK-NEXT:    xor 3, 3, 4
+; CHECK-NEXT:    cmplwi 3, 0
+; CHECK-NEXT:    isel 3, 0, 5, 2
+; CHECK-NEXT:    clrldi 3, 3, 32
+; CHECK-NEXT:    blr
+  %call = tail call signext i32 @memcmp(i8* %x, i8* %y, i64 4)
+  %not.cmp = icmp ne i32 %call, 0
+  %. = zext i1 %not.cmp to i32
   ret i32 %.
-
-  ; CHECK-LABEL: @zeroEqualityTest01
-  ; CHECK-LABEL: %res_block
-  ; CHECK: li 3, 1
-  ; CHECK-NEXT: clrldi
-  ; CHECK-NEXT: blr
-  ; CHECK: li 3, 0
-  ; CHECK-NEXT: clrldi
-  ; CHECK-NEXT: blr
 }
 
-; Validate with if(memcmp() == 0)
-; Function Attrs: nounwind readonly
-define signext i32 @zeroEqualityTest02() local_unnamed_addr #0 {
-entry:
-  %call = tail call signext i32 @memcmp(i8* bitcast ([4 x i32]* @zeroEqualityTest02.buffer1 to i8*), i8* bitcast ([4 x i32]* @zeroEqualityTest02.buffer2 to i8*), i64 16)
-  %not.cmp = icmp ne i32 %call, 0
-  %. = zext i1 %not.cmp to i32
+; Check 16 bytes - requires 2 loads for each param (or use vectors?).
+define signext i32 @zeroEqualityTest01(i8* %x, i8* %y) {
+; CHECK-LABEL: zeroEqualityTest01:
+; CHECK:       # BB#0: # %loadbb
+; CHECK-NEXT:    ld 5, 0(3)
+; CHECK-NEXT:    ld 6, 0(4)
+; CHECK-NEXT:    xor. 5, 5, 6
+; CHECK-NEXT:    bne 0, .LBB1_2
+; CHECK-NEXT:  # BB#1: # %loadbb1
+; CHECK-NEXT:    ld 3, 8(3)
+; CHECK-NEXT:    ld 4, 8(4)
+; CHECK-NEXT:    xor. 3, 3, 4
+; CHECK-NEXT:    beq 0, .LBB1_3
+; CHECK-NEXT:  .LBB1_2: # %res_block
+; CHECK-NEXT:    li 3, 1
+; CHECK-NEXT:    clrldi 3, 3, 32
+; CHECK-NEXT:    blr
+; CHECK-NEXT:  .LBB1_3:
+; CHECK-NEXT:    li 3, 0
+; CHECK-NEXT:    clrldi 3, 3, 32
+; CHECK-NEXT:    blr
+  %call = tail call signext i32 @memcmp(i8* %x, i8* %y, i64 16)
+  %not.tobool = icmp ne i32 %call, 0
+  %. = zext i1 %not.tobool to i32
   ret i32 %.
+}
 
-  ; CHECK-LABEL: @zeroEqualityTest02
-  ; CHECK-LABEL: %res_block
-  ; CHECK: li 3, 1
-  ; CHECK-NEXT: clrldi
-  ; CHECK-NEXT: blr
-  ; CHECK: li 3, 0
-  ; CHECK-NEXT: clrldi
-  ; CHECK-NEXT: blr
+; Check 7 bytes - requires 3 loads for each param.
+define signext i32 @zeroEqualityTest03(i8* %x, i8* %y) {
+; CHECK-LABEL: zeroEqualityTest03:
+; CHECK:       # BB#0: # %loadbb
+; CHECK-NEXT:    lwz 5, 0(3)
+; CHECK-NEXT:    lwz 6, 0(4)
+; CHECK-NEXT:    xor 5, 5, 6
+; CHECK-NEXT:    cmplwi 5, 0
+; CHECK-NEXT:    bne 0, .LBB2_3
+; CHECK-NEXT:  # BB#1: # %loadbb1
+; CHECK-NEXT:    lhz 5, 4(3)
+; CHECK-NEXT:    lhz 6, 4(4)
+; CHECK-NEXT:    xor 5, 5, 6
+; CHECK-NEXT:    rlwinm. 5, 5, 0, 16, 31
+; CHECK-NEXT:    bne 0, .LBB2_3
+; CHECK-NEXT:  # BB#2: # %loadbb2
+; CHECK-NEXT:    lbz 3, 6(3)
+; CHECK-NEXT:    lbz 4, 6(4)
+; CHECK-NEXT:    xor 3, 3, 4
+; CHECK-NEXT:    rlwinm. 3, 3, 0, 24, 31
+; CHECK-NEXT:    beq 0, .LBB2_4
+; CHECK-NEXT:  .LBB2_3: # %res_block
+; CHECK-NEXT:    li 3, 1
+; CHECK-NEXT:    clrldi 3, 3, 32
+; CHECK-NEXT:    blr
+; CHECK-NEXT:  .LBB2_4:
+; CHECK-NEXT:    li 3, 0
+; CHECK-NEXT:    clrldi 3, 3, 32
+; CHECK-NEXT:    blr
+  %call = tail call signext i32 @memcmp(i8* %x, i8* %y, i64 7)
+  %not.lnot = icmp ne i32 %call, 0
+  %cond = zext i1 %not.lnot to i32
+  ret i32 %cond
 }
 
 ; Validate with > 0
-; Function Attrs: nounwind readonly
-define signext i32 @zeroEqualityTest03() local_unnamed_addr #0 {
-entry:
+define signext i32 @zeroEqualityTest04() {
+; CHECK-LABEL: zeroEqualityTest04:
+; CHECK:       # BB#0: # %loadbb
+; CHECK-NEXT:    addis 3, 2, .LzeroEqualityTest02.buffer1 at toc@ha
+; CHECK-NEXT:    addis 4, 2, .LzeroEqualityTest02.buffer2 at toc@ha
+; CHECK-NEXT:    addi 6, 3, .LzeroEqualityTest02.buffer1 at toc@l
+; CHECK-NEXT:    addi 5, 4, .LzeroEqualityTest02.buffer2 at toc@l
+; CHECK-NEXT:    ldbrx 3, 0, 6
+; CHECK-NEXT:    ldbrx 4, 0, 5
+; CHECK-NEXT:    subf. 7, 4, 3
+; CHECK-NEXT:    bne 0, .LBB3_2
+; CHECK-NEXT:  # BB#1: # %loadbb1
+; CHECK-NEXT:    li 4, 8
+; CHECK-NEXT:    ldbrx 3, 6, 4
+; CHECK-NEXT:    ldbrx 4, 5, 4
+; CHECK-NEXT:    subf. 5, 4, 3
+; CHECK-NEXT:    beq 0, .LBB3_4
+; CHECK-NEXT:  .LBB3_2: # %res_block
+; CHECK-NEXT:    cmpld 3, 4
+; CHECK-NEXT:    li 3, 1
+; CHECK-NEXT:    li 12, -1
+; CHECK-NEXT:    isel 3, 12, 3, 0
+; CHECK-NEXT:  .LBB3_3: # %endblock
+; CHECK-NEXT:    cmpwi 3, 1
+; CHECK-NEXT:    li 3, 0
+; CHECK-NEXT:    li 4, 1
+; CHECK-NEXT:    isel 3, 4, 3, 0
+; CHECK-NEXT:    blr
+; CHECK-NEXT:  .LBB3_4:
+; CHECK-NEXT:    li 3, 0
+; CHECK-NEXT:    b .LBB3_3
   %call = tail call signext i32 @memcmp(i8* bitcast ([4 x i32]* @zeroEqualityTest02.buffer1 to i8*), i8* bitcast ([4 x i32]* @zeroEqualityTest02.buffer2 to i8*), i64 16)
   %not.cmp = icmp slt i32 %call, 1
   %. = zext i1 %not.cmp to i32
   ret i32 %.
-
-  ; CHECK-LABEL: @zeroEqualityTest03
-  ; CHECK-LABEL: %res_block
-  ; CHECK: cmpld
-  ; CHECK-NEXT: li [[LI:[0-9]+]], 1
-  ; CHECK-NEXT: li [[LI2:[0-9]+]], -1
-  ; CHECK-NEXT: isel [[ISEL:[0-9]+]], [[LI2]], [[LI]], 0
 }
 
 ; Validate with < 0
-; Function Attrs: nounwind readonly
-define signext i32 @zeroEqualityTest04() local_unnamed_addr #0 {
-entry:
+define signext i32 @zeroEqualityTest05() {
+; CHECK-LABEL: zeroEqualityTest05:
+; CHECK:       # BB#0: # %loadbb
+; CHECK-NEXT:    addis 3, 2, .LzeroEqualityTest03.buffer1 at toc@ha
+; CHECK-NEXT:    addis 4, 2, .LzeroEqualityTest03.buffer2 at toc@ha
+; CHECK-NEXT:    addi 6, 3, .LzeroEqualityTest03.buffer1 at toc@l
+; CHECK-NEXT:    addi 5, 4, .LzeroEqualityTest03.buffer2 at toc@l
+; CHECK-NEXT:    ldbrx 3, 0, 6
+; CHECK-NEXT:    ldbrx 4, 0, 5
+; CHECK-NEXT:    subf. 7, 4, 3
+; CHECK-NEXT:    bne 0, .LBB4_2
+; CHECK-NEXT:  # BB#1: # %loadbb1
+; CHECK-NEXT:    li 4, 8
+; CHECK-NEXT:    ldbrx 3, 6, 4
+; CHECK-NEXT:    ldbrx 4, 5, 4
+; CHECK-NEXT:    subf. 5, 4, 3
+; CHECK-NEXT:    beq 0, .LBB4_4
+; CHECK-NEXT:  .LBB4_2: # %res_block
+; CHECK-NEXT:    cmpld 3, 4
+; CHECK-NEXT:    li 3, 1
+; CHECK-NEXT:    li 12, -1
+; CHECK-NEXT:    isel 3, 12, 3, 0
+; CHECK-NEXT:  .LBB4_3: # %endblock
+; CHECK-NEXT:    srwi 3, 3, 31
+; CHECK-NEXT:    xori 3, 3, 1
+; CHECK-NEXT:    clrldi 3, 3, 32
+; CHECK-NEXT:    blr
+; CHECK-NEXT:  .LBB4_4:
+; CHECK-NEXT:    li 3, 0
+; CHECK-NEXT:    b .LBB4_3
   %call = tail call signext i32 @memcmp(i8* bitcast ([4 x i32]* @zeroEqualityTest03.buffer1 to i8*), i8* bitcast ([4 x i32]* @zeroEqualityTest03.buffer2 to i8*), i64 16)
   %call.lobit = lshr i32 %call, 31
   %call.lobit.not = xor i32 %call.lobit, 1
   ret i32 %call.lobit.not
-
-  ; CHECK-LABEL: @zeroEqualityTest04
-  ; CHECK-LABEL: %res_block
-  ; CHECK: cmpld
-  ; CHECK-NEXT: li [[LI:[0-9]+]], 1
-  ; CHECK-NEXT: li [[LI2:[0-9]+]], -1
-  ; CHECK-NEXT: isel [[ISEL:[0-9]+]], [[LI2]], [[LI]], 0
 }
 
 ; Validate with memcmp()?:
 ; Function Attrs: nounwind readonly
-define signext i32 @zeroEqualityTest05() local_unnamed_addr #0 {
-entry:
+define signext i32 @zeroEqualityTest06() {
+; CHECK-LABEL: zeroEqualityTest06:
+; CHECK:       # BB#0: # %loadbb
+; CHECK-NEXT:    addis 3, 2, .LzeroEqualityTest04.buffer1 at toc@ha
+; CHECK-NEXT:    addis 4, 2, .LzeroEqualityTest04.buffer2 at toc@ha
+; CHECK-NEXT:    ld 3, .LzeroEqualityTest04.buffer1 at toc@l(3)
+; CHECK-NEXT:    ld 4, .LzeroEqualityTest04.buffer2 at toc@l(4)
+; CHECK-NEXT:    xor. 3, 3, 4
+; CHECK-NEXT:    bne 0, .LBB5_2
+; CHECK-NEXT:  # BB#1: # %loadbb1
+; CHECK-NEXT:    addis 3, 2, .LzeroEqualityTest04.buffer1 at toc@ha+8
+; CHECK-NEXT:    addis 4, 2, .LzeroEqualityTest04.buffer2 at toc@ha+8
+; CHECK-NEXT:    ld 3, .LzeroEqualityTest04.buffer1 at toc@l+8(3)
+; CHECK-NEXT:    ld 4, .LzeroEqualityTest04.buffer2 at toc@l+8(4)
+; CHECK-NEXT:    xor. 3, 3, 4
+; CHECK-NEXT:    beq 0, .LBB5_4
+; CHECK-NEXT:  .LBB5_2: # %res_block
+; CHECK-NEXT:    li 3, 1
+; CHECK-NEXT:  .LBB5_3: # %endblock
+; CHECK-NEXT:    cntlzw 3, 3
+; CHECK-NEXT:    srwi 3, 3, 5
+; CHECK-NEXT:    blr
+; CHECK-NEXT:  .LBB5_4:
+; CHECK-NEXT:    li 3, 0
+; CHECK-NEXT:    b .LBB5_3
   %call = tail call signext i32 @memcmp(i8* bitcast ([15 x i32]* @zeroEqualityTest04.buffer1 to i8*), i8* bitcast ([15 x i32]* @zeroEqualityTest04.buffer2 to i8*), i64 16)
   %not.tobool = icmp eq i32 %call, 0
   %cond = zext i1 %not.tobool to i32
   ret i32 %cond
-
-  ; CHECK-LABEL: @zeroEqualityTest05
-  ; CHECK-LABEL: %res_block
-  ; CHECK: li 3, 1
-  ; CHECK: li 3, 0
 }
 
-; Validate with !memcmp()?:
-; Function Attrs: nounwind readonly
-define signext i32 @zeroEqualityTest06() local_unnamed_addr #0 {
-entry:
-  %call = tail call signext i32 @memcmp(i8* bitcast ([15 x i32]* @zeroEqualityTest04.buffer1 to i8*), i8* bitcast ([15 x i32]* @zeroEqualityTest04.buffer2 to i8*), i64 16)
-  %not.lnot = icmp ne i32 %call, 0
-  %cond = zext i1 %not.lnot to i32
-  ret i32 %cond
-
-  ; CHECK-LABEL: @zeroEqualityTest06
-  ; CHECK-LABEL: %res_block
-  ; CHECK: li 3, 1
-  ; CHECK-NEXT: clrldi
-  ; CHECK-NEXT: blr
-  ; CHECK: li 3, 0
-  ; CHECK-NEXT: clrldi
-  ; CHECK-NEXT: blr
-}




More information about the llvm-commits mailing list