diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp index 2db1b6493cc47..0aadc6aca228d 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp @@ -200,7 +200,8 @@ class CoalesceFeaturesAndStripAtomics final : public ModulePass { bool runOnModule(Module &M) override { FeatureBitset Features = coalesceFeatures(M); - std::string FeatureStr = getFeatureString(Features); + std::string FeatureStr = + getFeatureString(Features, WasmTM->getTargetFeatureString()); WasmTM->setTargetFeatureString(FeatureStr); for (auto &F : M) replaceFeatures(F, FeatureStr); @@ -238,12 +239,17 @@ class CoalesceFeaturesAndStripAtomics final : public ModulePass { return Features; } - std::string getFeatureString(const FeatureBitset &Features) { + static std::string getFeatureString(const FeatureBitset &Features, + StringRef TargetFS) { std::string Ret; for (const SubtargetFeatureKV &KV : WebAssemblyFeatureKV) { if (Features[KV.Value]) Ret += (StringRef("+") + KV.Key + ",").str(); } + SubtargetFeatures TF{TargetFS}; + for (std::string const &F : TF.getFeatures()) + if (!SubtargetFeatures::isEnabled(F)) + Ret += F; return Ret; } diff --git a/llvm/test/CodeGen/WebAssembly/disable-feature.ll b/llvm/test/CodeGen/WebAssembly/disable-feature.ll new file mode 100644 index 0000000000000..a9b07e2aaed5d --- /dev/null +++ b/llvm/test/CodeGen/WebAssembly/disable-feature.ll @@ -0,0 +1,22 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mattr=-sign-ext | FileCheck %s + +target triple = "wasm32-unknown-unknown" + +define i8 @ashr(i8 %v, i8 %x) { +; CHECK-LABEL: ashr: +; CHECK: .functype ashr (i32, i32) -> (i32) +; CHECK-NEXT: # %bb.0: +; CHECK-NEXT: local.get 0 +; CHECK-NEXT: i32.const 24 +; CHECK-NEXT: i32.shl +; CHECK-NEXT: i32.const 24 +; CHECK-NEXT: i32.shr_s +; CHECK-NEXT: local.get 1 +; CHECK-NEXT: i32.const 255 +; CHECK-NEXT: i32.and +; CHECK-NEXT: i32.shr_s +; CHECK-NEXT: # fallthrough-return + %a = ashr i8 %v, %x + ret i8 %a +}