@@ -125,22 +125,33 @@ static FailureOr<Block *> getConvertedBlock(ConversionPatternRewriter &rewriter,
125125 return rewriter.applySignatureConversion (block, *conversion, converter);
126126}
127127
128+ // / Flatten the given value ranges into a single vector of values.
129+ static SmallVector<Value> flattenValues (ArrayRef<ValueRange> values) {
130+ SmallVector<Value> result;
131+ for (const ValueRange &vals : values)
132+ llvm::append_range (result, vals);
133+ return result;
134+ }
135+
128136// / Convert the destination block signature (if necessary) and lower the branch
129137// / op to llvm.br.
130138struct BranchOpLowering : public ConvertOpToLLVMPattern <cf::BranchOp> {
131139 using ConvertOpToLLVMPattern<cf::BranchOp>::ConvertOpToLLVMPattern;
140+ using Adaptor =
141+ typename ConvertOpToLLVMPattern<cf::BranchOp>::OneToNOpAdaptor;
132142
133143 LogicalResult
134- matchAndRewrite (cf::BranchOp op, typename cf::BranchOp:: Adaptor adaptor,
144+ matchAndRewrite (cf::BranchOp op, Adaptor adaptor,
135145 ConversionPatternRewriter &rewriter) const override {
146+ SmallVector<Value> flattenedAdaptor = flattenValues (adaptor.getOperands ());
136147 FailureOr<Block *> convertedBlock =
137148 getConvertedBlock (rewriter, getTypeConverter (), op, op.getSuccessor (),
138- TypeRange (adaptor. getOperands () ));
149+ TypeRange (flattenedAdaptor ));
139150 if (failed (convertedBlock))
140151 return failure ();
141152 DictionaryAttr attrs = op->getAttrDictionary ();
142153 Operation *newOp = rewriter.replaceOpWithNewOp <LLVM::BrOp>(
143- op, adaptor. getOperands () , *convertedBlock);
154+ op, flattenedAdaptor , *convertedBlock);
144155 // TODO: We should not just forward all attributes like that. But there are
145156 // existing Flang tests that depend on this behavior.
146157 newOp->setAttrs (attrs);
@@ -152,29 +163,37 @@ struct BranchOpLowering : public ConvertOpToLLVMPattern<cf::BranchOp> {
152163// / branch op to llvm.cond_br.
153164struct CondBranchOpLowering : public ConvertOpToLLVMPattern <cf::CondBranchOp> {
154165 using ConvertOpToLLVMPattern<cf::CondBranchOp>::ConvertOpToLLVMPattern;
166+ using Adaptor =
167+ typename ConvertOpToLLVMPattern<cf::CondBranchOp>::OneToNOpAdaptor;
155168
156169 LogicalResult
157- matchAndRewrite (cf::CondBranchOp op,
158- typename cf::CondBranchOp::Adaptor adaptor,
170+ matchAndRewrite (cf::CondBranchOp op, Adaptor adaptor,
159171 ConversionPatternRewriter &rewriter) const override {
172+ SmallVector<Value> flattenedAdaptorTrue =
173+ flattenValues (adaptor.getTrueDestOperands ());
174+ SmallVector<Value> flattenedAdaptorFalse =
175+ flattenValues (adaptor.getFalseDestOperands ());
176+ if (!llvm::hasSingleElement (adaptor.getCondition ()))
177+ return rewriter.notifyMatchFailure (op,
178+ " expected single element condition" );
160179 FailureOr<Block *> convertedTrueBlock =
161180 getConvertedBlock (rewriter, getTypeConverter (), op, op.getTrueDest (),
162- TypeRange (adaptor. getTrueDestOperands () ));
181+ TypeRange (flattenedAdaptorTrue ));
163182 if (failed (convertedTrueBlock))
164183 return failure ();
165184 FailureOr<Block *> convertedFalseBlock =
166185 getConvertedBlock (rewriter, getTypeConverter (), op, op.getFalseDest (),
167- TypeRange (adaptor. getFalseDestOperands () ));
186+ TypeRange (flattenedAdaptorFalse ));
168187 if (failed (convertedFalseBlock))
169188 return failure ();
170- DictionaryAttr attrs = op->getAttrDictionary ();
189+ DictionaryAttr attrs = op->getDiscardableAttrDictionary ();
171190 auto newOp = rewriter.replaceOpWithNewOp <LLVM::CondBrOp>(
172- op, adaptor.getCondition (), adaptor. getTrueDestOperands ( ),
173- adaptor. getFalseDestOperands () , op.getBranchWeightsAttr (),
191+ op, llvm::getSingleElement ( adaptor.getCondition ()),
192+ flattenedAdaptorTrue, flattenedAdaptorFalse , op.getBranchWeightsAttr (),
174193 *convertedTrueBlock, *convertedFalseBlock);
175194 // TODO: We should not just forward all attributes like that. But there are
176195 // existing Flang tests that depend on this behavior.
177- newOp->setAttrs (attrs);
196+ newOp->setDiscardableAttrs (attrs);
178197 return success ();
179198 }
180199};
0 commit comments