Skip to content

Commit 8ad10b4

Browse files
committed
Fix mem2reg bug
1 parent 1fd0b83 commit 8ad10b4

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

lib/polygeist/Passes/Mem2Reg.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ class ValueOrPlaceholder {
511511
llvm::zip(ifOp.getResults(), getThenYield(ifOp).getOperands(),
512512
getElseYield(ifOp).getOperands()))) {
513513
if (std::get<1>(tup) == thenVal && std::get<2>(tup) == elseVal) {
514-
return thenVal;
514+
return std::get<0>(tup);
515515
}
516516
}
517517
}
@@ -571,7 +571,7 @@ static inline llvm::raw_ostream &operator<<(llvm::raw_ostream &os,
571571
;
572572
}
573573
if (PH.ifOp)
574-
return os << "ifOp:" << PH.ifOp;
574+
return os << "ifOp:" << *PH.ifOp;
575575
if (PH.exOp)
576576
return os << "exOp:" << PH.exOp;
577577
return os;

test/polygeist-opt/mem2regIf2.mlir

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,58 @@ module {
3737
// CHECK-NEXT: }
3838
// CHECK-NEXT: return %2 : f32
3939
// CHECK-NEXT: }
40+
41+
// ----
42+
43+
module {
44+
func private @gen() -> (!llvm.ptr<i8>)
45+
46+
func @_Z3runiPPc(%arg2: i1) -> !llvm.ptr<i8> {
47+
%c1_i64 = arith.constant 1 : i64
48+
%0 = llvm.alloca %c1_i64 x !llvm.ptr<i8> : (i64) -> !llvm.ptr<ptr<i8>>
49+
%2 = llvm.mlir.null : !llvm.ptr<i8>
50+
scf.if %arg2 {
51+
%5 = llvm.load %0 : !llvm.ptr<ptr<i8>>
52+
%6 = llvm.icmp "eq" %5, %2 : !llvm.ptr<i8>
53+
%7 = scf.if %6 -> (!llvm.ptr<i8>) {
54+
%8 = scf.if %arg2 -> (!llvm.ptr<i8>) {
55+
%9 = call @gen() : () -> !llvm.ptr<i8>
56+
llvm.store %9, %0 : !llvm.ptr<ptr<i8>>
57+
scf.yield %9 : !llvm.ptr<i8>
58+
} else {
59+
scf.yield %5 : !llvm.ptr<i8>
60+
}
61+
scf.yield %8 : !llvm.ptr<i8>
62+
} else {
63+
scf.yield %5 : !llvm.ptr<i8>
64+
}
65+
}
66+
%4 = llvm.load %0 : !llvm.ptr<ptr<i8>>
67+
return %4 : !llvm.ptr<i8>
68+
}
69+
70+
}
71+
72+
// CHECK: func @_Z3runiPPc(%arg0: i1) -> !llvm.ptr<i8> {
73+
// CHECK-NEXT: %c1_i64 = arith.constant 1 : i64
74+
// CHECK-NEXT: %0 = llvm.alloca %c1_i64 x !llvm.ptr<i8> : (i64) -> !llvm.ptr<ptr<i8>>
75+
// CHECK-NEXT: %1 = llvm.mlir.null : !llvm.ptr<i8>
76+
// CHECK-NEXT: scf.if %arg0 {
77+
// CHECK-NEXT: %3 = llvm.load %0 : !llvm.ptr<ptr<i8>>
78+
// CHECK-NEXT: %4 = llvm.icmp "eq" %3, %1 : !llvm.ptr<i8>
79+
// CHECK-NEXT: %5 = scf.if %4 -> (!llvm.ptr<i8>) {
80+
// CHECK-NEXT: %6 = scf.if %arg0 -> (!llvm.ptr<i8>) {
81+
// CHECK-NEXT: %7 = call @gen() : () -> !llvm.ptr<i8>
82+
// CHECK-NEXT: llvm.store %7, %0 : !llvm.ptr<ptr<i8>>
83+
// CHECK-NEXT: scf.yield %7 : !llvm.ptr<i8>
84+
// CHECK-NEXT: } else {
85+
// CHECK-NEXT: scf.yield %3 : !llvm.ptr<i8>
86+
// CHECK-NEXT: }
87+
// CHECK-NEXT: scf.yield %6 : !llvm.ptr<i8>
88+
// CHECK-NEXT: } else {
89+
// CHECK-NEXT: scf.yield %3 : !llvm.ptr<i8>
90+
// CHECK-NEXT: }
91+
// CHECK-NEXT: }
92+
// CHECK-NEXT: %2 = llvm.load %0 : !llvm.ptr<ptr<i8>>
93+
// CHECK-NEXT: return %2 : !llvm.ptr<i8>
94+

0 commit comments

Comments
 (0)