[llvm] [X86] Implement CRC32 const folding (PR #219452)

Shreesh Adiga via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 3 03:22:32 PDT 2026


https://github.com/tantei3 updated https://github.com/llvm/llvm-project/pull/219452

>From c14c07b78fe31edcc1bc2d4f2618b639475f17e9 Mon Sep 17 00:00:00 2001
From: Shreesh Adiga <16567adigashreesh at gmail.com>
Date: Fri, 28 Aug 2026 15:05:54 +0530
Subject: [PATCH 1/2] [X86] Add pre-commit test for CRC32 constant folding

Add a regression test to verify that InstCombine pass constant folds
the x86 CRC32 intrinsics when all operands are constants.
---
 .../InstCombine/X86/crc32-const-fold.ll       | 207 ++++++++++++++++++
 1 file changed, 207 insertions(+)
 create mode 100644 llvm/test/Transforms/InstCombine/X86/crc32-const-fold.ll

diff --git a/llvm/test/Transforms/InstCombine/X86/crc32-const-fold.ll b/llvm/test/Transforms/InstCombine/X86/crc32-const-fold.ll
new file mode 100644
index 00000000000000..64615019a2b138
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/X86/crc32-const-fold.ll
@@ -0,0 +1,207 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt < %s -mtriple=x86_64 -mattr=+crc32 -passes=instcombine -S | FileCheck %s
+
+define i32 @crc32_i8_1() {
+; CHECK-LABEL: define i32 @crc32_i8_1(
+; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.8(i32 -1, i8 -1)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.8(i32 -1, i8 -1)
+  ret i32 %crc
+}
+
+define i32 @crc32_i8_2() {
+; CHECK-LABEL: define i32 @crc32_i8_2(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.8(i32 44190712, i8 -70)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.8(i32 44190712, i8 186)
+  ret i32 %crc
+}
+
+define i32 @crc32_i8_3() {
+; CHECK-LABEL: define i32 @crc32_i8_3(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.8(i32 215343375, i8 -25)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.8(i32 215343375, i8 231)
+  ret i32 %crc
+}
+
+define i32 @crc32_i8_4() {
+; CHECK-LABEL: define i32 @crc32_i8_4(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.8(i32 1357330872, i8 46)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.8(i32 1357330872, i8 46)
+  ret i32 %crc
+}
+
+define i32 @crc32_i8_5() {
+; CHECK-LABEL: define i32 @crc32_i8_5(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.8(i32 1009627414, i8 61)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.8(i32 1009627414, i8 61)
+  ret i32 %crc
+}
+
+define i32 @crc32_i16_1() {
+; CHECK-LABEL: define i32 @crc32_i16_1(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.16(i32 -1, i16 -1)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.16(i32 -1, i16 -1)
+  ret i32 %crc
+}
+
+define i32 @crc32_i16_2() {
+; CHECK-LABEL: define i32 @crc32_i16_2(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.16(i32 44190712, i16 -11078)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.16(i32 44190712, i16 54458)
+  ret i32 %crc
+}
+
+define i32 @crc32_i16_3() {
+; CHECK-LABEL: define i32 @crc32_i16_3(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.16(i32 215343375, i16 17127)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.16(i32 215343375, i16 17127)
+  ret i32 %crc
+}
+
+define i32 @crc32_i16_4() {
+; CHECK-LABEL: define i32 @crc32_i16_4(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.16(i32 1357330872, i16 14382)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.16(i32 1357330872, i16 14382)
+  ret i32 %crc
+}
+
+define i32 @crc32_i16_5() {
+; CHECK-LABEL: define i32 @crc32_i16_5(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.16(i32 1009627414, i16 32573)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.16(i32 1009627414, i16 32573)
+  ret i32 %crc
+}
+
+define i32 @crc32_i32_1() {
+; CHECK-LABEL: define i32 @crc32_i32_1(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.32(i32 -1, i32 -1)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.32(i32 -1, i32 -1)
+  ret i32 %crc
+}
+
+define i32 @crc32_i32_2() {
+; CHECK-LABEL: define i32 @crc32_i32_2(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.32(i32 44190712, i32 -209857350)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.32(i32 44190712, i32 -209857350)
+  ret i32 %crc
+}
+
+define i32 @crc32_i32_3() {
+; CHECK-LABEL: define i32 @crc32_i32_3(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.32(i32 215343375, i32 -2094316825)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.32(i32 215343375, i32 -2094316825)
+  ret i32 %crc
+}
+
+define i32 @crc32_i32_4() {
+; CHECK-LABEL: define i32 @crc32_i32_4(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.32(i32 1357330872, i32 -822396882)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.32(i32 1357330872, i32 -822396882)
+  ret i32 %crc
+}
+
+define i32 @crc32_i32_5() {
+; CHECK-LABEL: define i32 @crc32_i32_5(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.32(i32 1009627414, i32 -745242819)
+; CHECK-NEXT:    ret i32 [[CRC]]
+;
+  %crc = call i32 @llvm.x86.sse42.crc32.32.32(i32 1009627414, i32 -745242819)
+  ret i32 %crc
+}
+
+define i64 @crc32_i64_1() {
+; CHECK-LABEL: define i64 @crc32_i64_1(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i64 @llvm.x86.sse42.crc32.64.64(i64 -1, i64 -1)
+; CHECK-NEXT:    ret i64 [[CRC]]
+;
+  %crc = call i64 @llvm.x86.sse42.crc32.64.64(i64 -1, i64 -1)
+  ret i64 %crc
+}
+
+define i64 @crc32_i64_2() {
+; CHECK-LABEL: define i64 @crc32_i64_2(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i64 @llvm.x86.sse42.crc32.64.64(i64 -6961118521834976264, i64 -8553926960789728070)
+; CHECK-NEXT:    ret i64 [[CRC]]
+;
+  %crc = call i64 @llvm.x86.sse42.crc32.64.64(i64 -6961118521834976264, i64 -8553926960789728070)
+  ret i64 %crc
+}
+
+define i64 @crc32_i64_3() {
+; CHECK-LABEL: define i64 @crc32_i64_3(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i64 @llvm.x86.sse42.crc32.64.64(i64 499784758672613647, i64 2608514570853761767)
+; CHECK-NEXT:    ret i64 [[CRC]]
+;
+  %crc = call i64 @llvm.x86.sse42.crc32.64.64(i64 499784758672613647, i64 2608514570853761767)
+  ret i64 %crc
+}
+
+define i64 @crc32_i64_4() {
+; CHECK-LABEL: define i64 @crc32_i64_4(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i64 @llvm.x86.sse42.crc32.64.64(i64 5774921304237357496, i64 2927024987405236270)
+; CHECK-NEXT:    ret i64 [[CRC]]
+;
+  %crc = call i64 @llvm.x86.sse42.crc32.64.64(i64 5774921304237357496, i64 2927024987405236270)
+  ret i64 %crc
+}
+
+define i64 @crc32_i64_5() {
+; CHECK-LABEL: define i64 @crc32_i64_5(
+; CHECK-SAME: ) #[[ATTR0]] {
+; CHECK-NEXT:    [[CRC:%.*]] = call i64 @llvm.x86.sse42.crc32.64.64(i64 -3762583644562149098, i64 -6300179796582957251)
+; CHECK-NEXT:    ret i64 [[CRC]]
+;
+  %crc = call i64 @llvm.x86.sse42.crc32.64.64(i64 -3762583644562149098, i64 -6300179796582957251)
+  ret i64 %crc
+}
+
+declare i32 @llvm.x86.sse42.crc32.32.8(i32, i8)
+declare i32 @llvm.x86.sse42.crc32.32.16(i32, i16)
+declare i32 @llvm.x86.sse42.crc32.32.32(i32, i32)
+declare i64 @llvm.x86.sse42.crc32.64.64(i64, i64)

>From ec23b270ff182525ae0c92a9c16cd5a60bca4fb6 Mon Sep 17 00:00:00 2001
From: Shreesh Adiga <16567adigashreesh at gmail.com>
Date: Fri, 28 Aug 2026 17:27:59 +0530
Subject: [PATCH 2/2] [X86] Add support for CRC32 const folding in InstCombine

When both operands are constants, CRC32 can be computed at compile
time and avoid runtime usage of crc32 instruction.
---
 .../Target/X86/X86InstCombineIntrinsic.cpp    | 20 +++++++
 .../InstCombine/X86/crc32-const-fold.ll       | 60 +++++++------------
 2 files changed, 40 insertions(+), 40 deletions(-)

diff --git a/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp b/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
index 07fa36594c37ec..cf5a6acad4f38f 100644
--- a/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
+++ b/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp
@@ -16,6 +16,7 @@
 #include "X86TargetTransformInfo.h"
 #include "llvm/IR/IntrinsicInst.h"
 #include "llvm/IR/IntrinsicsX86.h"
+#include "llvm/Support/CRC.h"
 #include "llvm/Support/KnownBits.h"
 #include "llvm/Transforms/InstCombine/InstCombiner.h"
 #include <optional>
@@ -2240,6 +2241,25 @@ X86TTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const {
     }
     break;
 
+  case Intrinsic::x86_sse42_crc32_32_8:
+  case Intrinsic::x86_sse42_crc32_32_16:
+  case Intrinsic::x86_sse42_crc32_32_32:
+  case Intrinsic::x86_sse42_crc32_64_64: {
+    auto *CrcArg = dyn_cast<ConstantInt>(II.getArgOperand(0));
+    auto *DataArg = dyn_cast<ConstantInt>(II.getArgOperand(1));
+    if (!CrcArg || !DataArg)
+      break;
+
+    // If both operands are constant, we can completely constant fold this.
+    uint32_t Crc = static_cast<uint32_t>(CrcArg->getZExtValue());
+    uint64_t Data = DataArg->getZExtValue();
+    unsigned DataBytes = DataArg->getBitWidth() / 8;
+    // CRC32C polynomial (iSCSI polynomial, bit-reversed)
+    const uint32_t Poly = 0x82F63B78;
+    uint32_t Result = calculateReflectedCRC32(Crc, Data, DataBytes, Poly);
+    return IC.replaceInstUsesWith(II, ConstantInt::get(II.getType(), Result));
+  }
+
   case Intrinsic::x86_sse_cvtss2si:
   case Intrinsic::x86_sse_cvtss2si64:
   case Intrinsic::x86_sse_cvttss2si:
diff --git a/llvm/test/Transforms/InstCombine/X86/crc32-const-fold.ll b/llvm/test/Transforms/InstCombine/X86/crc32-const-fold.ll
index 64615019a2b138..d370988005338e 100644
--- a/llvm/test/Transforms/InstCombine/X86/crc32-const-fold.ll
+++ b/llvm/test/Transforms/InstCombine/X86/crc32-const-fold.ll
@@ -4,8 +4,7 @@
 define i32 @crc32_i8_1() {
 ; CHECK-LABEL: define i32 @crc32_i8_1(
 ; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.8(i32 -1, i8 -1)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 16777215
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.8(i32 -1, i8 -1)
   ret i32 %crc
@@ -14,8 +13,7 @@ define i32 @crc32_i8_1() {
 define i32 @crc32_i8_2() {
 ; CHECK-LABEL: define i32 @crc32_i8_2(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.8(i32 44190712, i8 -70)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 -1606234368
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.8(i32 44190712, i8 186)
   ret i32 %crc
@@ -24,8 +22,7 @@ define i32 @crc32_i8_2() {
 define i32 @crc32_i8_3() {
 ; CHECK-LABEL: define i32 @crc32_i8_3(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.8(i32 215343375, i8 -25)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 1776624948
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.8(i32 215343375, i8 231)
   ret i32 %crc
@@ -34,8 +31,7 @@ define i32 @crc32_i8_3() {
 define i32 @crc32_i8_4() {
 ; CHECK-LABEL: define i32 @crc32_i8_4(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.8(i32 1357330872, i8 46)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 -1269171002
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.8(i32 1357330872, i8 46)
   ret i32 %crc
@@ -44,8 +40,7 @@ define i32 @crc32_i8_4() {
 define i32 @crc32_i8_5() {
 ; CHECK-LABEL: define i32 @crc32_i8_5(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.8(i32 1009627414, i8 61)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 -1190655916
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.8(i32 1009627414, i8 61)
   ret i32 %crc
@@ -54,8 +49,7 @@ define i32 @crc32_i8_5() {
 define i32 @crc32_i16_1() {
 ; CHECK-LABEL: define i32 @crc32_i16_1(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.16(i32 -1, i16 -1)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 65535
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.16(i32 -1, i16 -1)
   ret i32 %crc
@@ -64,8 +58,7 @@ define i32 @crc32_i16_1() {
 define i32 @crc32_i16_2() {
 ; CHECK-LABEL: define i32 @crc32_i16_2(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.16(i32 44190712, i16 -11078)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 350827643
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.16(i32 44190712, i16 54458)
   ret i32 %crc
@@ -74,8 +67,7 @@ define i32 @crc32_i16_2() {
 define i32 @crc32_i16_3() {
 ; CHECK-LABEL: define i32 @crc32_i16_3(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.16(i32 215343375, i16 17127)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 1464882880
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.16(i32 215343375, i16 17127)
   ret i32 %crc
@@ -84,8 +76,7 @@ define i32 @crc32_i16_3() {
 define i32 @crc32_i16_4() {
 ; CHECK-LABEL: define i32 @crc32_i16_4(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.16(i32 1357330872, i16 14382)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 1604487598
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.16(i32 1357330872, i16 14382)
   ret i32 %crc
@@ -94,8 +85,7 @@ define i32 @crc32_i16_4() {
 define i32 @crc32_i16_5() {
 ; CHECK-LABEL: define i32 @crc32_i16_5(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.16(i32 1009627414, i16 32573)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 -1181930003
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.16(i32 1009627414, i16 32573)
   ret i32 %crc
@@ -104,8 +94,7 @@ define i32 @crc32_i16_5() {
 define i32 @crc32_i32_1() {
 ; CHECK-LABEL: define i32 @crc32_i32_1(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.32(i32 -1, i32 -1)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 0
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.32(i32 -1, i32 -1)
   ret i32 %crc
@@ -114,8 +103,7 @@ define i32 @crc32_i32_1() {
 define i32 @crc32_i32_2() {
 ; CHECK-LABEL: define i32 @crc32_i32_2(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.32(i32 44190712, i32 -209857350)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 2122844148
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.32(i32 44190712, i32 -209857350)
   ret i32 %crc
@@ -124,8 +112,7 @@ define i32 @crc32_i32_2() {
 define i32 @crc32_i32_3() {
 ; CHECK-LABEL: define i32 @crc32_i32_3(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.32(i32 215343375, i32 -2094316825)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 881727033
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.32(i32 215343375, i32 -2094316825)
   ret i32 %crc
@@ -134,8 +121,7 @@ define i32 @crc32_i32_3() {
 define i32 @crc32_i32_4() {
 ; CHECK-LABEL: define i32 @crc32_i32_4(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.32(i32 1357330872, i32 -822396882)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 139192539
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.32(i32 1357330872, i32 -822396882)
   ret i32 %crc
@@ -144,8 +130,7 @@ define i32 @crc32_i32_4() {
 define i32 @crc32_i32_5() {
 ; CHECK-LABEL: define i32 @crc32_i32_5(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i32 @llvm.x86.sse42.crc32.32.32(i32 1009627414, i32 -745242819)
-; CHECK-NEXT:    ret i32 [[CRC]]
+; CHECK-NEXT:    ret i32 1861871255
 ;
   %crc = call i32 @llvm.x86.sse42.crc32.32.32(i32 1009627414, i32 -745242819)
   ret i32 %crc
@@ -154,8 +139,7 @@ define i32 @crc32_i32_5() {
 define i64 @crc32_i64_1() {
 ; CHECK-LABEL: define i64 @crc32_i64_1(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i64 @llvm.x86.sse42.crc32.64.64(i64 -1, i64 -1)
-; CHECK-NEXT:    ret i64 [[CRC]]
+; CHECK-NEXT:    ret i64 3080238136
 ;
   %crc = call i64 @llvm.x86.sse42.crc32.64.64(i64 -1, i64 -1)
   ret i64 %crc
@@ -164,8 +148,7 @@ define i64 @crc32_i64_1() {
 define i64 @crc32_i64_2() {
 ; CHECK-LABEL: define i64 @crc32_i64_2(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i64 @llvm.x86.sse42.crc32.64.64(i64 -6961118521834976264, i64 -8553926960789728070)
-; CHECK-NEXT:    ret i64 [[CRC]]
+; CHECK-NEXT:    ret i64 3230864714
 ;
   %crc = call i64 @llvm.x86.sse42.crc32.64.64(i64 -6961118521834976264, i64 -8553926960789728070)
   ret i64 %crc
@@ -174,8 +157,7 @@ define i64 @crc32_i64_2() {
 define i64 @crc32_i64_3() {
 ; CHECK-LABEL: define i64 @crc32_i64_3(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i64 @llvm.x86.sse42.crc32.64.64(i64 499784758672613647, i64 2608514570853761767)
-; CHECK-NEXT:    ret i64 [[CRC]]
+; CHECK-NEXT:    ret i64 337502055
 ;
   %crc = call i64 @llvm.x86.sse42.crc32.64.64(i64 499784758672613647, i64 2608514570853761767)
   ret i64 %crc
@@ -184,8 +166,7 @@ define i64 @crc32_i64_3() {
 define i64 @crc32_i64_4() {
 ; CHECK-LABEL: define i64 @crc32_i64_4(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i64 @llvm.x86.sse42.crc32.64.64(i64 5774921304237357496, i64 2927024987405236270)
-; CHECK-NEXT:    ret i64 [[CRC]]
+; CHECK-NEXT:    ret i64 712052683
 ;
   %crc = call i64 @llvm.x86.sse42.crc32.64.64(i64 5774921304237357496, i64 2927024987405236270)
   ret i64 %crc
@@ -194,8 +175,7 @@ define i64 @crc32_i64_4() {
 define i64 @crc32_i64_5() {
 ; CHECK-LABEL: define i64 @crc32_i64_5(
 ; CHECK-SAME: ) #[[ATTR0]] {
-; CHECK-NEXT:    [[CRC:%.*]] = call i64 @llvm.x86.sse42.crc32.64.64(i64 -3762583644562149098, i64 -6300179796582957251)
-; CHECK-NEXT:    ret i64 [[CRC]]
+; CHECK-NEXT:    ret i64 1390230251
 ;
   %crc = call i64 @llvm.x86.sse42.crc32.64.64(i64 -3762583644562149098, i64 -6300179796582957251)
   ret i64 %crc



More information about the llvm-commits mailing list