From 7a52296f1f71d2491ed5738f9552036fa3372fd1 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Tue, 6 Jun 2017 22:06:07 +0000 Subject: [PATCH] [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. llvm-svn: 304838 --- .../memCmpUsedInZeroEqualityComparison.ll | 239 ++++++++++++------ 1 file changed, 161 insertions(+), 78 deletions(-) diff --git a/llvm/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll b/llvm/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll index 3095429758f6..584c9ea40f53 100644 --- a/llvm/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll +++ b/llvm/test/CodeGen/PowerPC/memCmpUsedInZeroEqualityComparison.ll @@ -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-linux-gnu" @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 - 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) +; 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: @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 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 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@toc@ha +; CHECK-NEXT: addis 4, 2, .LzeroEqualityTest02.buffer2@toc@ha +; CHECK-NEXT: addi 6, 3, .LzeroEqualityTest02.buffer1@toc@l +; CHECK-NEXT: addi 5, 4, .LzeroEqualityTest02.buffer2@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@toc@ha +; CHECK-NEXT: addis 4, 2, .LzeroEqualityTest03.buffer2@toc@ha +; CHECK-NEXT: addi 6, 3, .LzeroEqualityTest03.buffer1@toc@l +; CHECK-NEXT: addi 5, 4, .LzeroEqualityTest03.buffer2@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@toc@ha +; CHECK-NEXT: addis 4, 2, .LzeroEqualityTest04.buffer2@toc@ha +; CHECK-NEXT: ld 3, .LzeroEqualityTest04.buffer1@toc@l(3) +; CHECK-NEXT: ld 4, .LzeroEqualityTest04.buffer2@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@toc@ha+8 +; CHECK-NEXT: addis 4, 2, .LzeroEqualityTest04.buffer2@toc@ha+8 +; CHECK-NEXT: ld 3, .LzeroEqualityTest04.buffer1@toc@l+8(3) +; CHECK-NEXT: ld 4, .LzeroEqualityTest04.buffer2@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 -}