Skip to content

Commit 6fc670e

Browse files
committed
[WebAssembly] Add auto-upgrade for renamed intrinsics
D138249 renamed a number of wasm intrinsics without implementing auto-upgrade support. Differential Revision: https://reviews.llvm.org/D146424
1 parent 3e79dfa commit 6fc670e

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

llvm/lib/IR/AutoUpgrade.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "llvm/IR/Intrinsics.h"
2828
#include "llvm/IR/IntrinsicsAArch64.h"
2929
#include "llvm/IR/IntrinsicsARM.h"
30+
#include "llvm/IR/IntrinsicsWebAssembly.h"
3031
#include "llvm/IR/IntrinsicsX86.h"
3132
#include "llvm/IR/LLVMContext.h"
3233
#include "llvm/IR/Metadata.h"
@@ -1143,6 +1144,40 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) {
11431144
break;
11441145
}
11451146

1147+
case 'w':
1148+
if (Name.startswith("wasm.fma.")) {
1149+
rename(F);
1150+
NewFn = Intrinsic::getDeclaration(
1151+
F->getParent(), Intrinsic::wasm_relaxed_madd, F->getReturnType());
1152+
return true;
1153+
}
1154+
if (Name.startswith("wasm.fms.")) {
1155+
rename(F);
1156+
NewFn = Intrinsic::getDeclaration(
1157+
F->getParent(), Intrinsic::wasm_relaxed_nmadd, F->getReturnType());
1158+
return true;
1159+
}
1160+
if (Name.startswith("wasm.laneselect.")) {
1161+
rename(F);
1162+
NewFn = Intrinsic::getDeclaration(
1163+
F->getParent(), Intrinsic::wasm_relaxed_laneselect,
1164+
F->getReturnType());
1165+
return true;
1166+
}
1167+
if (Name == "wasm.dot.i8x16.i7x16.signed") {
1168+
rename(F);
1169+
NewFn = Intrinsic::getDeclaration(
1170+
F->getParent(), Intrinsic::wasm_relaxed_dot_i8x16_i7x16_signed);
1171+
return true;
1172+
}
1173+
if (Name == "wasm.dot.i8x16.i7x16.add.signed") {
1174+
rename(F);
1175+
NewFn = Intrinsic::getDeclaration(
1176+
F->getParent(), Intrinsic::wasm_relaxed_dot_i8x16_i7x16_add_signed);
1177+
return true;
1178+
}
1179+
break;
1180+
11461181
case 'x':
11471182
if (UpgradeX86IntrinsicFunction(F, Name, NewFn))
11481183
return true;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -S < %s | FileCheck %s
3+
4+
define <16 x i8> @test_laneselect(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c) {
5+
; CHECK-LABEL: @test_laneselect(
6+
; CHECK-NEXT: [[RES:%.*]] = call <16 x i8> @llvm.wasm.relaxed.laneselect.v16i8(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], <16 x i8> [[C:%.*]])
7+
; CHECK-NEXT: ret <16 x i8> [[RES]]
8+
;
9+
%res = call <16 x i8> @llvm.wasm.laneselect.v16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %c)
10+
ret <16 x i8> %res
11+
}
12+
13+
define <8 x i16> @test_dot(<16 x i8> %a, <16 x i8> %b) {
14+
; CHECK-LABEL: @test_dot(
15+
; CHECK-NEXT: [[RES:%.*]] = call <8 x i16> @llvm.wasm.relaxed.dot.i8x16.i7x16.signed(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]])
16+
; CHECK-NEXT: ret <8 x i16> [[RES]]
17+
;
18+
%res = call <8 x i16> @llvm.wasm.dot.i8x16.i7x16.signed(<16 x i8> %a, <16 x i8> %b)
19+
ret <8 x i16> %res
20+
}
21+
22+
define <4 x i32> @test_dot_add(<16 x i8> %a, <16 x i8> %b, <4 x i32> %c) {
23+
; CHECK-LABEL: @test_dot_add(
24+
; CHECK-NEXT: [[RES:%.*]] = call <4 x i32> @llvm.wasm.relaxed.dot.i8x16.i7x16.add.signed(<16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], <4 x i32> [[C:%.*]])
25+
; CHECK-NEXT: ret <4 x i32> [[RES]]
26+
;
27+
%res = call <4 x i32> @llvm.wasm.dot.i8x16.i7x16.add.signed(<16 x i8> %a, <16 x i8> %b, <4 x i32> %c)
28+
ret <4 x i32> %res
29+
}
30+
31+
define <4 x float> @test_fma(<4 x float> %a, <4 x float> %b, <4 x float> %c) {
32+
; CHECK-LABEL: @test_fma(
33+
; CHECK-NEXT: [[RES:%.*]] = call <4 x float> @llvm.wasm.relaxed.madd.v4f32(<4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x float> [[C:%.*]])
34+
; CHECK-NEXT: ret <4 x float> [[RES]]
35+
;
36+
%res = call <4 x float> @llvm.wasm.fma.v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c)
37+
ret <4 x float> %res
38+
}
39+
40+
define <4 x float> @test_fms(<4 x float> %a, <4 x float> %b, <4 x float> %c) {
41+
; CHECK-LABEL: @test_fms(
42+
; CHECK-NEXT: [[RES:%.*]] = call <4 x float> @llvm.wasm.relaxed.nmadd.v4f32(<4 x float> [[A:%.*]], <4 x float> [[B:%.*]], <4 x float> [[C:%.*]])
43+
; CHECK-NEXT: ret <4 x float> [[RES]]
44+
;
45+
%res = call <4 x float> @llvm.wasm.fms.v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c)
46+
ret <4 x float> %res
47+
}
48+
49+
declare <16 x i8> @llvm.wasm.laneselect.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)
50+
declare <8 x i16> @llvm.wasm.dot.i8x16.i7x16.signed(<16 x i8>, <16 x i8>)
51+
declare <4 x i32> @llvm.wasm.dot.i8x16.i7x16.add.signed(<16 x i8>, <16 x i8>, <4 x i32>)
52+
declare <4 x float> @llvm.wasm.fma.v4f32(<4 x float>, <4 x float>, <4 x float>)
53+
declare <4 x float> @llvm.wasm.fms.v4f32(<4 x float>, <4 x float>, <4 x float>)

0 commit comments

Comments
 (0)