From a2446f8d170c97f390d3c8416ba8a5bbac24ff8c Mon Sep 17 00:00:00 2001 From: JF Bastien Date: Wed, 28 Oct 2015 17:50:23 +0000 Subject: [PATCH] WebAssembly: disable some loop-idiom recognition memset/memcpy aren't fully supported yet. We should invert this test once they are supported. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251534 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/TargetLibraryInfo.cpp | 4 +- test/CodeGen/WebAssembly/loop-idiom.ll | 53 ++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/WebAssembly/loop-idiom.ll diff --git a/lib/Analysis/TargetLibraryInfo.cpp b/lib/Analysis/TargetLibraryInfo.cpp index 635c50ca6e5..39af09e70c2 100644 --- a/lib/Analysis/TargetLibraryInfo.cpp +++ b/lib/Analysis/TargetLibraryInfo.cpp @@ -64,7 +64,9 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, // There are no library implementations of mempcy and memset for AMD gpus and // these can be difficult to lower in the backend. if (T.getArch() == Triple::r600 || - T.getArch() == Triple::amdgcn) { + T.getArch() == Triple::amdgcn || + T.getArch() == Triple::wasm32 || + T.getArch() == Triple::wasm64) { TLI.setUnavailable(LibFunc::memcpy); TLI.setUnavailable(LibFunc::memset); TLI.setUnavailable(LibFunc::memset_pattern16); diff --git a/test/CodeGen/WebAssembly/loop-idiom.ll b/test/CodeGen/WebAssembly/loop-idiom.ll new file mode 100644 index 00000000000..2906df20a22 --- /dev/null +++ b/test/CodeGen/WebAssembly/loop-idiom.ll @@ -0,0 +1,53 @@ +; RUN: opt -loop-idiom -S < %s -march=wasm32 | FileCheck %s + +target datalayout = "e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + + +; Make sure loop-idiom doesn't create memcpy or memset. These aren't well +; supported in WebAssembly for now. +; +; TODO Check the patterns are recognized once memcpy / memset are supported. + +; CHECK-LABEL: @cpy( +; CHECK-NOT: llvm.memcpy +; CHECK: load +; CHECK: store +define void @cpy(i64 %Size) { +bb.nph: + %Base = alloca i8, i32 10000 + %Dest = alloca i8, i32 10000 + br label %for.body + +for.body: + %indvar = phi i64 [ 0, %bb.nph ], [ %indvar.next, %for.body ] + %I.0.014 = getelementptr i8, i8* %Base, i64 %indvar + %DestI = getelementptr i8, i8* %Dest, i64 %indvar + %V = load i8, i8* %I.0.014, align 1 + store i8 %V, i8* %DestI, align 1 + %indvar.next = add i64 %indvar, 1 + %exitcond = icmp eq i64 %indvar.next, %Size + br i1 %exitcond, label %for.end, label %for.body + +for.end: + ret void +} + +; CHECK-LABEL: @set( +; CHECK-NOT: llvm.memset +; CHECK: store +define void @set(i8* %Base, i64 %Size) { +bb.nph: + br label %for.body + +for.body: + %indvar = phi i64 [ 0, %bb.nph ], [ %indvar.next, %for.body ] + %I.0.014 = getelementptr i8, i8* %Base, i64 %indvar + store i8 0, i8* %I.0.014, align 1 + %indvar.next = add i64 %indvar, 1 + %exitcond = icmp eq i64 %indvar.next, %Size + br i1 %exitcond, label %for.end, label %for.body + +for.end: + ret void +} -- 2.34.1