@@ -71,40 +71,32 @@ static LogicalResult convertCtlzOp(math::CountLeadingZerosOp op,
71
71
SmallVector<Type> types = {elementTy, elementTy, elementTy};
72
72
SmallVector<Location> locations = {loc, loc, loc};
73
73
74
- auto whileOp = rewriter.create <scf::WhileOp>(loc, types, operands);
75
- Block *before =
76
- rewriter.createBlock (&whileOp.getBefore (), {}, types, locations);
77
- Block *after =
78
- rewriter.createBlock (&whileOp.getAfter (), {}, types, locations);
79
-
80
- // The conditional block of the while loop.
81
- {
82
- rewriter.setInsertionPointToStart (&whileOp.getBefore ().front ());
83
- Value input = before->getArgument (0 );
84
- Value zero = before->getArgument (2 );
85
-
86
- Value inputNotZero = rewriter.create <arith::CmpIOp>(
87
- loc, arith::CmpIPredicate::ne, input, zero);
88
- rewriter.create <scf::ConditionOp>(loc, inputNotZero,
89
- before->getArguments ());
90
- }
91
-
92
- // The body of the while loop: shift right until reaching a value of 0.
93
- {
94
- rewriter.setInsertionPointToStart (&whileOp.getAfter ().front ());
95
- Value input = after->getArgument (0 );
96
- Value leadingZeros = after->getArgument (1 );
97
-
98
- auto one =
99
- rewriter.create <arith::ConstantOp>(loc, IntegerAttr::get (elementTy, 1 ));
100
- auto shifted = rewriter.create <arith::ShRUIOp>(loc, resultTy, input, one);
101
- auto leadingZerosMinusOne =
102
- rewriter.create <arith::SubIOp>(loc, resultTy, leadingZeros, one);
103
-
104
- rewriter.create <scf::YieldOp>(
105
- loc,
106
- ValueRange ({shifted, leadingZerosMinusOne, after->getArgument (2 )}));
107
- }
74
+ auto whileOp = rewriter.create <scf::WhileOp>(
75
+ loc, types, operands,
76
+ [&](OpBuilder &beforeBuilder, Location beforeLoc, ValueRange args) {
77
+ // The conditional block of the while loop.
78
+ Value input = args[0 ];
79
+ Value zero = args[2 ];
80
+
81
+ Value inputNotZero = beforeBuilder.create <arith::CmpIOp>(
82
+ loc, arith::CmpIPredicate::ne, input, zero);
83
+ beforeBuilder.create <scf::ConditionOp>(loc, inputNotZero, args);
84
+ },
85
+ [&](OpBuilder &afterBuilder, Location afterLoc, ValueRange args) {
86
+ // The body of the while loop: shift right until reaching a value of 0.
87
+ Value input = args[0 ];
88
+ Value leadingZeros = args[1 ];
89
+
90
+ auto one = afterBuilder.create <arith::ConstantOp>(
91
+ loc, IntegerAttr::get (elementTy, 1 ));
92
+ auto shifted =
93
+ afterBuilder.create <arith::ShRUIOp>(loc, resultTy, input, one);
94
+ auto leadingZerosMinusOne = afterBuilder.create <arith::SubIOp>(
95
+ loc, resultTy, leadingZeros, one);
96
+
97
+ afterBuilder.create <scf::YieldOp>(
98
+ loc, ValueRange ({shifted, leadingZerosMinusOne, args[2 ]}));
99
+ });
108
100
109
101
rewriter.setInsertionPointAfter (whileOp);
110
102
rewriter.replaceOp (op, whileOp->getResult (1 ));
0 commit comments