142 lines · plain
1; RUN: llc -o - -mtriple=powerpc64le-unknown-gnu-linux -stop-after codegenprepare %s | FileCheck %s2; RUN: llc -o - -mtriple=powerpc64-unknown-gnu-linux -stop-after codegenprepare %s | FileCheck %s --check-prefix=CHECK-BE3 4define signext i32 @test1(ptr nocapture readonly %buffer1, ptr nocapture readonly %buffer2) {5entry:6 ; CHECK-LABEL: @test1(7 ; CHECK: [[LOAD0:%[0-9]+]] = load i128, ptr %buffer1, align 18 ; CHECK-NEXT: [[LOAD1:%[0-9]+]] = load i128, ptr %buffer2, align 19 ; CHECK-NEXT: [[CALL1:%[0-9]+]] = call i128 @llvm.bswap.i128(i128 [[LOAD0]])10 ; CHECK-NEXT: [[CALL2:%[0-9]+]] = call i128 @llvm.bswap.i128(i128 [[LOAD1]])11 ; CHECK-NEXT: [[CALL3:%[0-9]+]] = call i32 @llvm.ucmp.i32.i128(i128 [[CALL1]], i128 [[CALL2]])12 ; CHECK-NEXT: ret i32 [[CALL3]]13 14 15 ; CHECK-BE-LABEL: @test1(16 ; CHECK-BE: [[LOAD0:%[0-9]+]] = load i128, ptr %buffer1, align 117 ; CHECK-BE-NEXT: [[LOAD1:%[0-9]+]] = load i128, ptr %buffer2, align 118 ; CHECK-BE-NEXT: [[CALL0:%[0-9]+]] = call i32 @llvm.ucmp.i32.i128(i128 [[LOAD0]], i128 [[LOAD1]])19 ; CHECK-BE-NEXT: ret i32 [[CALL0]]20 21 %call = tail call signext i32 @memcmp(ptr %buffer1, ptr %buffer2, i64 16)22 ret i32 %call23}24 25declare signext i32 @memcmp(ptr nocapture, ptr nocapture, i64) local_unnamed_addr #126 27define signext i32 @test2(ptr nocapture readonly %buffer1, ptr nocapture readonly %buffer2) {28 ; CHECK-LABEL: @test2(29 ; CHECK: [[LOAD1:%[0-9]+]] = load i32, ptr30 ; CHECK-NEXT: [[LOAD2:%[0-9]+]] = load i32, ptr31 ; CHECK-NEXT: [[BSWAP1:%[0-9]+]] = call i32 @llvm.bswap.i32(i32 [[LOAD1]])32 ; CHECK-NEXT: [[BSWAP2:%[0-9]+]] = call i32 @llvm.bswap.i32(i32 [[LOAD2]])33 ; CHECK-NEXT: [[UCMP:%[0-9]+]] = call i32 @llvm.ucmp.i32.i32(i32 [[BSWAP1]], i32 [[BSWAP2]])34 ; CHECK-NEXT: ret i32 [[UCMP]]35 36 ; CHECK-BE-LABEL: @test2(37 ; CHECK-BE: [[LOAD1:%[0-9]+]] = load i32, ptr38 ; CHECK-BE-NEXT: [[LOAD2:%[0-9]+]] = load i32, ptr39 ; CHECK-BE-NEXT: [[UCMP:%[0-9]+]] = call i32 @llvm.ucmp.i32.i32(i32 [[LOAD1]], i32 [[LOAD2]])40 ; CHECK-BE-NEXT: ret i32 [[UCMP]]41 42entry:43 %call = tail call signext i32 @memcmp(ptr %buffer1, ptr %buffer2, i64 4)44 ret i32 %call45}46 47define signext i32 @test3(ptr nocapture readonly %buffer1, ptr nocapture readonly %buffer2) {48 ; CHECK-LABEL: res_block:{{.*}}49 ; CHECK: [[ICMP2:%[0-9]+]] = icmp ult i6450 ; CHECK-NEXT: [[SELECT:%[0-9]+]] = select i1 [[ICMP2]], i32 -1, i32 151 ; CHECK-NEXT: br label %endblock52 53 ; CHECK-LABEL: loadbb:{{.*}}54 ; CHECK: [[LOAD1:%[0-9]+]] = load i64, ptr55 ; CHECK-NEXT: [[LOAD2:%[0-9]+]] = load i64, ptr56 ; CHECK-NEXT: [[BSWAP1:%[0-9]+]] = call i64 @llvm.bswap.i64(i64 [[LOAD1]])57 ; CHECK-NEXT: [[BSWAP2:%[0-9]+]] = call i64 @llvm.bswap.i64(i64 [[LOAD2]])58 ; CHECK-NEXT: [[ICMP:%[0-9]+]] = icmp eq i64 [[BSWAP1]], [[BSWAP2]]59 ; CHECK-NEXT: br i1 [[ICMP]], label %loadbb1, label %res_block60 61 ; CHECK-LABEL: loadbb1:{{.*}}62 ; CHECK: [[LOAD1:%[0-9]+]] = load i32, ptr63 ; CHECK-NEXT: [[LOAD2:%[0-9]+]] = load i32, ptr64 ; CHECK-NEXT: [[BSWAP1:%[0-9]+]] = call i32 @llvm.bswap.i32(i32 [[LOAD1]])65 ; CHECK-NEXT: [[BSWAP2:%[0-9]+]] = call i32 @llvm.bswap.i32(i32 [[LOAD2]])66 ; CHECK-NEXT: [[ZEXT1:%[0-9]+]] = zext i32 [[BSWAP1]] to i6467 ; CHECK-NEXT: [[ZEXT2:%[0-9]+]] = zext i32 [[BSWAP2]] to i6468 ; CHECK-NEXT: [[ICMP:%[0-9]+]] = icmp eq i64 [[ZEXT1]], [[ZEXT2]]69 ; CHECK-NEXT: br i1 [[ICMP]], label %loadbb2, label %res_block70 71 ; CHECK-LABEL: loadbb2:{{.*}}72 ; CHECK: [[LOAD1:%[0-9]+]] = load i16, ptr73 ; CHECK-NEXT: [[LOAD2:%[0-9]+]] = load i16, ptr74 ; CHECK-NEXT: [[BSWAP1:%[0-9]+]] = call i16 @llvm.bswap.i16(i16 [[LOAD1]])75 ; CHECK-NEXT: [[BSWAP2:%[0-9]+]] = call i16 @llvm.bswap.i16(i16 [[LOAD2]])76 ; CHECK-NEXT: [[ZEXT1:%[0-9]+]] = zext i16 [[BSWAP1]] to i6477 ; CHECK-NEXT: [[ZEXT2:%[0-9]+]] = zext i16 [[BSWAP2]] to i6478 ; CHECK-NEXT: [[ICMP:%[0-9]+]] = icmp eq i64 [[ZEXT1]], [[ZEXT2]]79 ; CHECK-NEXT: br i1 [[ICMP]], label %loadbb3, label %res_block80 81 ; CHECK-LABEL: loadbb3:{{.*}}82 ; CHECK: [[LOAD1:%[0-9]+]] = load i8, ptr83 ; CHECK-NEXT: [[LOAD2:%[0-9]+]] = load i8, ptr84 ; CHECK-NEXT: [[ZEXT1:%[0-9]+]] = zext i8 [[LOAD1]] to i3285 ; CHECK-NEXT: [[ZEXT2:%[0-9]+]] = zext i8 [[LOAD2]] to i3286 ; CHECK-NEXT: [[SUB:%[0-9]+]] = sub i32 [[ZEXT1]], [[ZEXT2]]87 ; CHECK-NEXT: br label %endblock88 89 ; CHECK-BE-LABEL: res_block:{{.*}}90 ; CHECK-BE: [[ICMP2:%[0-9]+]] = icmp ult i6491 ; CHECK-BE-NEXT: [[SELECT:%[0-9]+]] = select i1 [[ICMP2]], i32 -1, i32 192 ; CHECK-BE-NEXT: br label %endblock93 94 ; CHECK-BE-LABEL: loadbb:{{.*}}95 ; CHECK-BE: [[LOAD1:%[0-9]+]] = load i64, ptr96 ; CHECK-BE-NEXT: [[LOAD2:%[0-9]+]] = load i64, ptr97 ; CHECK-BE-NEXT: [[ICMP:%[0-9]+]] = icmp eq i64 [[LOAD1]], [[LOAD2]]98 ; CHECK-BE-NEXT: br i1 [[ICMP]], label %loadbb1, label %res_block99 100 ; CHECK-BE: [[LOAD1:%[0-9]+]] = load i32, ptr101 ; CHECK-BE-NEXT: [[LOAD2:%[0-9]+]] = load i32, ptr102 ; CHECK-BE-NEXT: [[ZEXT1:%[0-9]+]] = zext i32 [[LOAD1]] to i64103 ; CHECK-BE-NEXT: [[ZEXT2:%[0-9]+]] = zext i32 [[LOAD2]] to i64104 ; CHECK-BE-NEXT: [[ICMP:%[0-9]+]] = icmp eq i64 [[ZEXT1]], [[ZEXT2]]105 ; CHECK-BE-NEXT: br i1 [[ICMP]], label %loadbb2, label %res_block106 107 ; CHECK-BE: [[LOAD1:%[0-9]+]] = load i16, ptr108 ; CHECK-BE-NEXT: [[LOAD2:%[0-9]+]] = load i16, ptr109 ; CHECK-BE-NEXT: [[ZEXT1:%[0-9]+]] = zext i16 [[LOAD1]] to i64110 ; CHECK-BE-NEXT: [[ZEXT2:%[0-9]+]] = zext i16 [[LOAD2]] to i64111 ; CHECK-BE-NEXT: [[ICMP:%[0-9]+]] = icmp eq i64 [[ZEXT1]], [[ZEXT2]]112 ; CHECK-BE-NEXT: br i1 [[ICMP]], label %loadbb3, label %res_block113 114 ; CHECK-BE: [[LOAD1:%[0-9]+]] = load i8, ptr115 ; CHECK-BE-NEXT: [[LOAD2:%[0-9]+]] = load i8, ptr116 ; CHECK-BE-NEXT: [[ZEXT1:%[0-9]+]] = zext i8 [[LOAD1]] to i32117 ; CHECK-BE-NEXT: [[ZEXT2:%[0-9]+]] = zext i8 [[LOAD2]] to i32118 ; CHECK-BE-NEXT: [[SUB:%[0-9]+]] = sub i32 [[ZEXT1]], [[ZEXT2]]119 ; CHECK-BE-NEXT: br label %endblock120 121entry:122 %call = tail call signext i32 @memcmp(ptr %buffer1, ptr %buffer2, i64 15)123 ret i32 %call124}125 ; CHECK: call = tail call signext i32 @memcmp126 ; CHECK-BE: call = tail call signext i32 @memcmp127define signext i32 @test4(ptr nocapture readonly %buffer1, ptr nocapture readonly %buffer2) {128 129entry:130 %call = tail call signext i32 @memcmp(ptr %buffer1, ptr %buffer2, i64 129)131 ret i32 %call132}133 134define signext i32 @test5(ptr nocapture readonly %buffer1, ptr nocapture readonly %buffer2, i32 signext %SIZE) {135 ; CHECK: call = tail call signext i32 @memcmp136 ; CHECK-BE: call = tail call signext i32 @memcmp137entry:138 %conv = sext i32 %SIZE to i64139 %call = tail call signext i32 @memcmp(ptr %buffer1, ptr %buffer2, i64 %conv)140 ret i32 %call141}142