[clang] [CIR] Upstream CIR codegen for `lzcnt` and `tzcnt` x86 builtins (PR #168479)

Haocong Lu via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 18 19:52:13 PST 2025


================
@@ -86,13 +86,30 @@ mlir::Value CIRGenFunction::emitX86BuiltinExpr(unsigned builtinID,
     return emitIntrinsicCallOp(*this, e, "x86.sse.sfence", voidTy);
   case X86::BI_mm_prefetch:
   case X86::BI__rdtsc:
-  case X86::BI__builtin_ia32_rdtscp:
+  case X86::BI__builtin_ia32_rdtscp: {
+    cgm.errorNYI(e->getSourceRange(),
+                 std::string("unimplemented X86 builtin call: ") +
+                     getContext().BuiltinInfo.getName(builtinID));
+    return {};
+  }
   case X86::BI__builtin_ia32_lzcnt_u16:
   case X86::BI__builtin_ia32_lzcnt_u32:
-  case X86::BI__builtin_ia32_lzcnt_u64:
+  case X86::BI__builtin_ia32_lzcnt_u64: {
+    mlir::Value isZeroPoison =
+        cir::ConstantOp::create(builder, getLoc(e->getExprLoc()),
+                                cir::BoolAttr::get(&getMLIRContext(), false));
+    return emitIntrinsicCallOp(*this, e, "ctlz", ops[0].getType(),
+                               mlir::ValueRange{ops[0], isZeroPoison});
+  }
   case X86::BI__builtin_ia32_tzcnt_u16:
   case X86::BI__builtin_ia32_tzcnt_u32:
-  case X86::BI__builtin_ia32_tzcnt_u64:
+  case X86::BI__builtin_ia32_tzcnt_u64: {
+    mlir::Value isZeroPoison =
+        cir::ConstantOp::create(builder, getLoc(e->getExprLoc()),
+                                cir::BoolAttr::get(&getMLIRContext(), false));
----------------
Luhaocong wrote:

done

https://github.com/llvm/llvm-project/pull/168479


More information about the cfe-commits mailing list