brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.2 KiB · 0548966 Raw
140 lines · plain
1; Test that the memcmp library call simplifier works correctly.2;3; RUN: opt < %s -passes=instcombine -S | FileCheck --check-prefix=CHECK --check-prefix=NOBCMP %s4; RUN: opt < %s -passes=instcombine -mtriple=x86_64-unknown-linux-gnu -S | FileCheck --check-prefix=CHECK --check-prefix=BCMP %s5 6target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32:64"7 8@foo = constant [4 x i8] c"foo\00"9@hel = constant [4 x i8] c"hel\00"10@hello_u = constant [8 x i8] c"hello_u\00"11 12declare i32 @memcmp(ptr, ptr, i32)13 14; Check memcmp(mem, mem, size) -> 0.15 16define i32 @test_simplify1(ptr %mem, i32 %size) {17; CHECK-LABEL: @test_simplify1(18; CHECK-NEXT:    ret i32 019;20  %ret = call i32 @memcmp(ptr %mem, ptr %mem, i32 %size)21  ret i32 %ret22}23 24; Check memcmp(mem1, mem2, 0) -> 0.25 26define i32 @test_simplify2(ptr %mem1, ptr %mem2) {27; CHECK-LABEL: @test_simplify2(28; CHECK-NEXT:    ret i32 029;30  %ret = call i32 @memcmp(ptr %mem1, ptr %mem2, i32 0)31  ret i32 %ret32}33 34;; Check memcmp(mem1, mem2, 1) -> *(unsigned char*)mem1 - *(unsigned char*)mem2.35 36define i32 @test_simplify3(ptr %mem1, ptr %mem2) {37; CHECK-LABEL: @test_simplify3(38; CHECK-NEXT:    [[LHSC:%.*]] = load i8, ptr %mem1, align 139; CHECK-NEXT:    [[LHSV:%.*]] = zext i8 [[LHSC]] to i3240; CHECK-NEXT:    [[RHSC:%.*]] = load i8, ptr %mem2, align 141; CHECK-NEXT:    [[RHSV:%.*]] = zext i8 [[RHSC]] to i3242; CHECK-NEXT:    [[CHARDIFF:%.*]] = sub nsw i32 [[LHSV]], [[RHSV]]43; CHECK-NEXT:    ret i32 [[CHARDIFF]]44;45  %ret = call i32 @memcmp(ptr %mem1, ptr %mem2, i32 1)46  ret i32 %ret47}48 49; Check memcmp(mem1, mem2, size) -> cnst, where all arguments are constants.50 51define i32 @test_simplify4() {52; CHECK-LABEL: @test_simplify4(53; CHECK-NEXT:    ret i32 054;55  %ret = call i32 @memcmp(ptr @hel, ptr @hello_u, i32 3)56  ret i32 %ret57}58 59define i32 @test_simplify5() {60; CHECK-LABEL: @test_simplify5(61; CHECK-NEXT:    ret i32 162;63  %ret = call i32 @memcmp(ptr @hel, ptr @foo, i32 3)64  ret i32 %ret65}66 67define i32 @test_simplify6() {68; CHECK-LABEL: @test_simplify6(69; CHECK-NEXT:    ret i32 -170;71  %ret = call i32 @memcmp(ptr @foo, ptr @hel, i32 3)72  ret i32 %ret73}74 75; Check memcmp(mem1, mem2, 8)==0 -> *(int64_t*)mem1 == *(int64_t*)mem276 77define i1 @test_simplify7(i64 %x, i64 %y) {78; CHECK-LABEL: @test_simplify7(79; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i64 %x, %y80; CHECK-NEXT:    ret i1 [[CMP]]81;82  %x.addr = alloca i64, align 883  %y.addr = alloca i64, align 884  store i64 %x, ptr %x.addr, align 885  store i64 %y, ptr %y.addr, align 886  %call = call i32 @memcmp(ptr %x.addr, ptr %y.addr, i32 8)87  %cmp = icmp eq i32 %call, 088  ret i1 %cmp89}90 91; Check memcmp(mem1, mem2, 4)==0 -> *(int32_t*)mem1 == *(int32_t*)mem292 93define i1 @test_simplify8(i32 %x, i32 %y) {94; CHECK-LABEL: @test_simplify8(95; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 %x, %y96; CHECK-NEXT:    ret i1 [[CMP]]97;98  %x.addr = alloca i32, align 499  %y.addr = alloca i32, align 4100  store i32 %x, ptr %x.addr, align 4101  store i32 %y, ptr %y.addr, align 4102  %call = call i32 @memcmp(ptr %x.addr, ptr %y.addr, i32 4)103  %cmp = icmp eq i32 %call, 0104  ret i1 %cmp105}106 107; Check memcmp(mem1, mem2, 2)==0 -> *(int16_t*)mem1 == *(int16_t*)mem2108 109define i1 @test_simplify9(i16 %x, i16 %y) {110; CHECK-LABEL: @test_simplify9(111; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i16 %x, %y112; CHECK-NEXT:    ret i1 [[CMP]]113;114  %x.addr = alloca i16, align 2115  %y.addr = alloca i16, align 2116  store i16 %x, ptr %x.addr, align 2117  store i16 %y, ptr %y.addr, align 2118  %call = call i32 @memcmp(ptr %x.addr, ptr %y.addr, i32 2)119  %cmp = icmp eq i32 %call, 0120  ret i1 %cmp121}122 123; Check memcmp(mem1, mem2, size)==0 -> bcmp(mem1, mem2, size)==0124 125define i1 @test_simplify10(ptr %mem1, ptr %mem2, i32 %size) {126; NOBCMP-LABEL: @test_simplify10(127; NOBCMP-NEXT:    [[CALL:%.*]] = call i32 @memcmp(ptr %mem1, ptr %mem2, i32 %size)128; NOBCMP-NEXT:    [[CMP:%.*]] = icmp eq i32 [[CALL]], 0129; NOBCMP-NEXT:    ret i1 [[CMP]]130;131; BCMP-LABEL: @test_simplify10(132; BCMP-NEXT:    [[CALL:%.*]] = call i32 @bcmp(ptr %mem1, ptr %mem2, i32 %size)133; BCMP-NEXT:    [[CMP:%.*]] = icmp eq i32 [[CALL]], 0134; BCMP-NEXT:    ret i1 [[CMP]]135;136  %call = call i32 @memcmp(ptr %mem1, ptr %mem2, i32 %size)137  %cmp = icmp eq i32 %call, 0138  ret i1 %cmp139}140