diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp index b2e99ecfb48c..92749b204c35 100644 --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -1584,7 +1584,9 @@ static bool matchUAddWithOverflowConstantEdgeCases(CmpInst *Cmp, if (Pred == ICmpInst::ICMP_EQ && match(B, m_AllOnes())) B = ConstantInt::get(B->getType(), 1); else if (Pred == ICmpInst::ICMP_NE && match(B, m_ZeroInt())) - B = ConstantInt::get(B->getType(), -1); + // EraVM local begin + B = ConstantInt::get(B->getType(), -1, true); + // EraVM local end else return false; diff --git a/llvm/test/CodeGen/EraVM/cgp-uadd-overflow-wrong-match.ll b/llvm/test/CodeGen/EraVM/cgp-uadd-overflow-wrong-match.ll new file mode 100644 index 000000000000..919038d95932 --- /dev/null +++ b/llvm/test/CodeGen/EraVM/cgp-uadd-overflow-wrong-match.ll @@ -0,0 +1,55 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 +; RUN: opt -codegenprepare --cgp-verify-bfi-updates=false -S < %s | FileCheck %s +; Verification of BFI updates is disabled because of https://github.com/llvm/llvm-project/issues/64197 + +target datalayout = "E-p:256:256-i256:256:256-S32-a:256:256" +target triple = "eravm" + +define i256 @dont_match(i256 %a) { +; CHECK-LABEL: define i256 @dont_match +; CHECK-SAME: (i256 [[A:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[ADD:%.*]] = add i256 [[A]], 18446744073709551615 +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i256 [[A]], 0 +; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]] +; CHECK: then: +; CHECK-NEXT: ret i256 0 +; CHECK: else: +; CHECK-NEXT: ret i256 [[ADD]] +; +entry: + %add = add i256 %a, 18446744073709551615 + %cmp = icmp ne i256 %a, 0 + br i1 %cmp, label %then, label %else + +then: + ret i256 0 + +else: + ret i256 %add +} + +define i256 @match(i256 %a) { +; CHECK-LABEL: define i256 @match +; CHECK-SAME: (i256 [[A:%.*]]) { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = call { i256, i1 } @llvm.uadd.with.overflow.i256(i256 [[A]], i256 -1) +; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i256, i1 } [[TMP0]], 0 +; CHECK-NEXT: [[OV:%.*]] = extractvalue { i256, i1 } [[TMP0]], 1 +; CHECK-NEXT: br i1 [[OV]], label [[THEN:%.*]], label [[ELSE:%.*]] +; CHECK: then: +; CHECK-NEXT: ret i256 0 +; CHECK: else: +; CHECK-NEXT: ret i256 [[MATH]] +; +entry: + %add = add i256 %a, -1 + %cmp = icmp ne i256 %a, 0 + br i1 %cmp, label %then, label %else + +then: + ret i256 0 + +else: + ret i256 %add +}