Skip to content

Commit 098d481

Browse files
[CGP] Fix matching of uadd overflow
This patch fixes the issue where uadd overflow intrinsic is matched for: `Add = add A,(uint64_t)-1; Cmp = icmp ne A, 0` instead of: `Add = add A,-1; Cmp = icmp ne A, 0` where -1 is represented in 256 bits. PR: #626 Signed-off-by: Vladimir Radosavljevic <[email protected]>
1 parent 25b4315 commit 098d481

File tree

2 files changed

+12
-10
lines changed

2 files changed

+12
-10
lines changed

llvm/lib/CodeGen/CodeGenPrepare.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1584,7 +1584,9 @@ static bool matchUAddWithOverflowConstantEdgeCases(CmpInst *Cmp,
15841584
if (Pred == ICmpInst::ICMP_EQ && match(B, m_AllOnes()))
15851585
B = ConstantInt::get(B->getType(), 1);
15861586
else if (Pred == ICmpInst::ICMP_NE && match(B, m_ZeroInt()))
1587-
B = ConstantInt::get(B->getType(), -1);
1587+
// EraVM local begin
1588+
B = ConstantInt::get(B->getType(), -1, true);
1589+
// EraVM local end
15881590
else
15891591
return false;
15901592

llvm/test/CodeGen/EraVM/cgp-uadd-overflow-wrong-match.ll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,13 @@ define i256 @dont_match(i256 %a) {
99
; CHECK-LABEL: define i256 @dont_match
1010
; CHECK-SAME: (i256 [[A:%.*]]) {
1111
; CHECK-NEXT: entry:
12-
; CHECK-NEXT: [[TMP0:%.*]] = call { i256, i1 } @llvm.uadd.with.overflow.i256(i256 [[A]], i256 18446744073709551615)
13-
; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i256, i1 } [[TMP0]], 0
14-
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i256, i1 } [[TMP0]], 1
15-
; CHECK-NEXT: br i1 [[OV]], label [[THEN:%.*]], label [[ELSE:%.*]]
12+
; CHECK-NEXT: [[ADD:%.*]] = add i256 [[A]], 18446744073709551615
13+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i256 [[A]], 0
14+
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
1615
; CHECK: then:
1716
; CHECK-NEXT: ret i256 0
1817
; CHECK: else:
19-
; CHECK-NEXT: ret i256 [[MATH]]
18+
; CHECK-NEXT: ret i256 [[ADD]]
2019
;
2120
entry:
2221
%add = add i256 %a, 18446744073709551615
@@ -34,13 +33,14 @@ define i256 @match(i256 %a) {
3433
; CHECK-LABEL: define i256 @match
3534
; CHECK-SAME: (i256 [[A:%.*]]) {
3635
; CHECK-NEXT: entry:
37-
; CHECK-NEXT: [[ADD:%.*]] = add i256 [[A]], -1
38-
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i256 [[A]], 0
39-
; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
36+
; CHECK-NEXT: [[TMP0:%.*]] = call { i256, i1 } @llvm.uadd.with.overflow.i256(i256 [[A]], i256 -1)
37+
; CHECK-NEXT: [[MATH:%.*]] = extractvalue { i256, i1 } [[TMP0]], 0
38+
; CHECK-NEXT: [[OV:%.*]] = extractvalue { i256, i1 } [[TMP0]], 1
39+
; CHECK-NEXT: br i1 [[OV]], label [[THEN:%.*]], label [[ELSE:%.*]]
4040
; CHECK: then:
4141
; CHECK-NEXT: ret i256 0
4242
; CHECK: else:
43-
; CHECK-NEXT: ret i256 [[ADD]]
43+
; CHECK-NEXT: ret i256 [[MATH]]
4444
;
4545
entry:
4646
%add = add i256 %a, -1

0 commit comments

Comments
 (0)