From 2a534473663668015fab21505f72d73fa8f7f1f6 Mon Sep 17 00:00:00 2001 From: Philipp van Kempen Date: Tue, 8 Apr 2025 10:55:09 +0200 Subject: [PATCH 1/3] pattern-gen: ignore TargetOpcode::G_CONSTANT_FOLD_BARRIER --- llvm/lib/CodeGen/GlobalISel/PatternGen.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/llvm/lib/CodeGen/GlobalISel/PatternGen.cpp b/llvm/lib/CodeGen/GlobalISel/PatternGen.cpp index 8b4981e33ed9..34440d636ae6 100644 --- a/llvm/lib/CodeGen/GlobalISel/PatternGen.cpp +++ b/llvm/lib/CodeGen/GlobalISel/PatternGen.cpp @@ -579,7 +579,7 @@ struct UnopNode : public PatternNode { std::string TypeStr = lltToString(Type); // ignore bitcast ops for now - if (Op == TargetOpcode::G_BITCAST) + if ((Op == TargetOpcode::G_BITCAST) || (Op == TargetOpcode::G_CONSTANT_FOLD_BARRIER)) return Operand->patternString(); return "(" + TypeStr + " (" + std::string(UnopStr.at(Op)) + " " + @@ -587,7 +587,7 @@ struct UnopNode : public PatternNode { } LLT getRegisterTy(int OperandId) const override { - if (OperandId == -1 && Op != TargetOpcode::G_BITCAST) + if (OperandId == -1 && Op != TargetOpcode::G_BITCAST && Op != TargetOpcode::G_CONSTANT_FOLD_BARRIER) return Type; return Operand->getRegisterTy(OperandId); } @@ -1040,6 +1040,7 @@ static PatternOrError traverse(MachineRegisterInfo &MRI, MachineInstr &Cur) { return std::make_pair(SUCCESS, std::move(Node)); } + case TargetOpcode::G_CONSTANT_FOLD_BARRIER: case TargetOpcode::G_ANYEXT: case TargetOpcode::G_SEXT: case TargetOpcode::G_ZEXT: From 9f02feec43f6d3ef6cc7f9d99b025f3ed4e6dff0 Mon Sep 17 00:00:00 2001 From: Philipp van Kempen Date: Tue, 8 Apr 2025 12:28:29 +0200 Subject: [PATCH 2/3] pattern-gen: do not print invalid patterns --- llvm/lib/CodeGen/GlobalISel/PatternGen.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/llvm/lib/CodeGen/GlobalISel/PatternGen.cpp b/llvm/lib/CodeGen/GlobalISel/PatternGen.cpp index 34440d636ae6..97402b87b6af 100644 --- a/llvm/lib/CodeGen/GlobalISel/PatternGen.cpp +++ b/llvm/lib/CodeGen/GlobalISel/PatternGen.cpp @@ -1363,10 +1363,6 @@ bool PatternGen::runOnMachineFunction(MachineFunction &MF) { return true; } - llvm::outs() << "Pattern for " << InstName << ": " << Node->patternString() - << '\n'; - ++PatternGenNumPatternsGenerated; - LLT OutType = LLT(); std::string OutsString; std::string InsString; @@ -1410,6 +1406,11 @@ bool PatternGen::runOnMachineFunction(MachineFunction &MF) { } } + llvm::outs() << "Pattern for " << InstName << ": " << Node->patternString() + << '\n'; + ++PatternGenNumPatternsGenerated; + + InsString = InsString.substr(0, InsString.size() - 2); OutsString = OutsString.substr(0, OutsString.size() - 2); From 331da4d9880eb5f62fa586b663dcb5de63e43377 Mon Sep 17 00:00:00 2001 From: Philipp van Kempen Date: Mon, 20 Oct 2025 10:34:50 +0200 Subject: [PATCH 3/3] [pattern-gen] Parser: fix poison mask in gen_subscript --- llvm/tools/pattern-gen/lib/Parser.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/llvm/tools/pattern-gen/lib/Parser.cpp b/llvm/tools/pattern-gen/lib/Parser.cpp index b7e4a9eac0bc..f1237ab98c8b 100644 --- a/llvm/tools/pattern-gen/lib/Parser.cpp +++ b/llvm/tools/pattern-gen/lib/Parser.cpp @@ -268,10 +268,12 @@ Value gen_subscript(TokenStream &ts, llvm::Function *func, llvm::Value *mask = (len == llLen) ? llvm::ConstantInt::get(upper.ll->getType(), 0) - : build.CreateShl(llvm::ConstantInt::get(upper.ll->getType(), 1), + : build.CreateShl( + llvm::ConstantInt::get(llvm::Type::getIntNTy(ctx, len + 1), 1), len); - mask = - build.CreateSub(mask, llvm::ConstantInt::get(upper.ll->getType(), 1)); + mask = build.CreateSub(mask, llvm::ConstantInt::get(mask->getType(), 1)); + mask = (len < left.ll->getType()->getIntegerBitWidth()) ? build.CreateZExt(mask, left.ll->getType()) : ((build.CreateTrunc(mask, left.ll->getType())) ? : mask); + left.ll = build.CreateAnd(left.ll, mask); left.bitWidth = len;