Skip to content

Commit 5115f34

Browse files
Merge branch 'main' into mapsatconvtopublicintrinsic
2 parents 2a5149b + 2529a8d commit 5115f34

File tree

8 files changed

+5479
-2241
lines changed

8 files changed

+5479
-2241
lines changed

clang/include/clang/Basic/BuiltinsBase.td

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,15 @@ class Builtin {
8888
// On some platforms, some functions are actually macros. In that case we need
8989
// to #undef them.
9090
bit RequiresUndef = 0;
91+
// Enables builtins to generate `long long` outside of OpenCL and `long` inside.
92+
bit EnableOpenCLLong = 0;
9193
}
9294

9395
class CustomEntry {
9496
string Entry;
9597
}
9698

9799
class AtomicBuiltin : Builtin;
98-
class TargetBuiltin : Builtin {
99-
string Features = "";
100-
}
101100

102101
class LibBuiltin<string header, string languages = "ALL_LANGUAGES"> : Builtin {
103102
string Header = header;
@@ -122,6 +121,14 @@ class OCL_DSELangBuiltin : LangBuiltin<"OCL_DSE">;
122121
class OCL_GASLangBuiltin : LangBuiltin<"OCL_GAS">;
123122
class OCLLangBuiltin : LangBuiltin<"ALL_OCL_LANGUAGES">;
124123

124+
class TargetBuiltin : Builtin {
125+
string Features = "";
126+
}
127+
class TargetLibBuiltin : TargetBuiltin {
128+
string Header;
129+
string Languages = "ALL_LANGUAGES";
130+
}
131+
125132
class Template<list<string> substitutions,
126133
list<string> affixes,
127134
bit as_prefix = 0> {

clang/include/clang/Basic/BuiltinsX86.def

Lines changed: 0 additions & 2225 deletions
This file was deleted.

clang/include/clang/Basic/BuiltinsX86.td

Lines changed: 5390 additions & 0 deletions
Large diffs are not rendered by default.

clang/include/clang/Basic/TargetBuiltins.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,6 @@ namespace clang {
124124
enum {
125125
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
126126
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
127-
#include "clang/Basic/BuiltinsX86.def"
128-
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
129127
#include "clang/Basic/BuiltinsX86.inc"
130128
FirstX86_64Builtin,
131129
LastX86CommonBuiltin = FirstX86_64Builtin - 1,

clang/lib/Basic/Targets/X86.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,6 @@ namespace clang {
2424
namespace targets {
2525

2626
static constexpr Builtin::Info BuiltinInfoX86[] = {
27-
#define BUILTIN(ID, TYPE, ATTRS) \
28-
{#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
29-
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
30-
{#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
31-
#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
32-
{#ID, TYPE, ATTRS, FEATURE, HeaderDesc::HEADER, LANGS},
33-
#include "clang/Basic/BuiltinsX86.def"
34-
3527
#define BUILTIN(ID, TYPE, ATTRS) \
3628
{#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
3729
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \

clang/utils/TableGen/ClangBuiltinsEmitter.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,14 @@ enum class BuiltinType {
2525
LibBuiltin,
2626
LangBuiltin,
2727
TargetBuiltin,
28+
TargetLibBuiltin,
2829
};
2930

3031
class PrototypeParser {
3132
public:
3233
PrototypeParser(StringRef Substitution, const Record *Builtin)
33-
: Loc(Builtin->getFieldLoc("Prototype")), Substitution(Substitution) {
34+
: Loc(Builtin->getFieldLoc("Prototype")), Substitution(Substitution),
35+
EnableOpenCLLong(Builtin->getValueAsBit("EnableOpenCLLong")) {
3436
ParsePrototype(Builtin->getValueAsString("Prototype"));
3537
}
3638

@@ -108,9 +110,15 @@ class PrototypeParser {
108110
} else if (T.consume_back("&")) {
109111
ParseType(T);
110112
Type += "&";
113+
} else if (EnableOpenCLLong && T.consume_front("long long")) {
114+
Type += "O";
115+
ParseType(T);
111116
} else if (T.consume_front("long")) {
112117
Type += "L";
113118
ParseType(T);
119+
} else if (T.consume_front("signed")) {
120+
Type += "S";
121+
ParseType(T);
114122
} else if (T.consume_front("unsigned")) {
115123
Type += "U";
116124
ParseType(T);
@@ -155,6 +163,7 @@ class PrototypeParser {
155163
.Case("__fp16", "h")
156164
.Case("__int128_t", "LLLi")
157165
.Case("_Float16", "x")
166+
.Case("__bf16", "y")
158167
.Case("bool", "b")
159168
.Case("char", "c")
160169
.Case("constant_CFString", "F")
@@ -194,6 +203,7 @@ class PrototypeParser {
194203
private:
195204
SMLoc Loc;
196205
StringRef Substitution;
206+
bool EnableOpenCLLong;
197207
std::string Type;
198208
};
199209

@@ -262,6 +272,9 @@ void EmitBuiltinDef(raw_ostream &OS, StringRef Substitution,
262272
case BuiltinType::TargetBuiltin:
263273
OS << "TARGET_BUILTIN";
264274
break;
275+
case BuiltinType::TargetLibBuiltin:
276+
OS << "TARGET_HEADER_BUILTIN";
277+
break;
265278
}
266279

267280
OS << "(" << Spelling;
@@ -279,6 +292,12 @@ void EmitBuiltinDef(raw_ostream &OS, StringRef Substitution,
279292
OS << ", " << Builtin->getValueAsString("Languages");
280293
break;
281294
}
295+
case BuiltinType::TargetLibBuiltin: {
296+
OS << ", ";
297+
HeaderNameParser{Builtin}.Print(OS);
298+
OS << ", " << Builtin->getValueAsString("Languages");
299+
[[fallthrough]];
300+
}
282301
case BuiltinType::TargetBuiltin:
283302
OS << ", \"" << Builtin->getValueAsString("Features") << "\"";
284303
break;
@@ -331,6 +350,8 @@ void EmitBuiltin(raw_ostream &OS, const Record *Builtin) {
331350
BT = BuiltinType::AtomicBuiltin;
332351
} else if (Builtin->isSubClassOf("LangBuiltin")) {
333352
BT = BuiltinType::LangBuiltin;
353+
} else if (Builtin->isSubClassOf("TargetLibBuiltin")) {
354+
BT = BuiltinType::TargetLibBuiltin;
334355
} else if (Builtin->isSubClassOf("TargetBuiltin")) {
335356
BT = BuiltinType::TargetBuiltin;
336357
} else if (Builtin->isSubClassOf("LibBuiltin")) {
@@ -367,6 +388,10 @@ void clang::EmitClangBuiltins(const RecordKeeper &Records, raw_ostream &OS) {
367388
#if defined(BUILTIN) && !defined(TARGET_BUILTIN)
368389
# define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BUILTIN(ID, TYPE, ATTRS)
369390
#endif
391+
392+
#if defined(BUILTIN) && !defined(TARGET_HEADER_BUILTIN)
393+
# define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANG, FEATURE) BUILTIN(ID, TYPE, ATTRS)
394+
#endif
370395
)c++";
371396

372397
// AtomicBuiltins are order dependent
@@ -390,5 +415,6 @@ void clang::EmitClangBuiltins(const RecordKeeper &Records, raw_ostream &OS) {
390415
#undef LIBBUILTIN
391416
#undef LANGBUILTIN
392417
#undef TARGET_BUILTIN
418+
#undef TARGET_HEADER_BUILTIN
393419
)c++";
394420
}

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -747,6 +747,8 @@ Instruction *InstCombinerImpl::foldGEPICmp(GEPOperator *GEPLHS, Value *RHS,
747747
ConstantExpr::getPointerBitCastOrAddrSpaceCast(
748748
cast<Constant>(RHS), Base->getType()));
749749
} else if (GEPOperator *GEPRHS = dyn_cast<GEPOperator>(RHS)) {
750+
GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags() & GEPRHS->getNoWrapFlags();
751+
750752
// If the base pointers are different, but the indices are the same, just
751753
// compare the base pointer.
752754
if (PtrBase != GEPRHS->getOperand(0)) {
@@ -764,7 +766,8 @@ Instruction *InstCombinerImpl::foldGEPICmp(GEPOperator *GEPLHS, Value *RHS,
764766

765767
// If all indices are the same, just compare the base pointers.
766768
Type *BaseType = GEPLHS->getOperand(0)->getType();
767-
if (IndicesTheSame && CmpInst::makeCmpResultType(BaseType) == I.getType())
769+
if (IndicesTheSame &&
770+
CmpInst::makeCmpResultType(BaseType) == I.getType() && CanFold(NW))
768771
return new ICmpInst(Cond, GEPLHS->getOperand(0), GEPRHS->getOperand(0));
769772

770773
// If we're comparing GEPs with two base pointers that only differ in type
@@ -804,7 +807,6 @@ Instruction *InstCombinerImpl::foldGEPICmp(GEPOperator *GEPLHS, Value *RHS,
804807
return transformToIndexedCompare(GEPLHS, RHS, Cond, DL, *this);
805808
}
806809

807-
GEPNoWrapFlags NW = GEPLHS->getNoWrapFlags() & GEPRHS->getNoWrapFlags();
808810
if (GEPLHS->getNumOperands() == GEPRHS->getNumOperands() &&
809811
GEPLHS->getSourceElementType() == GEPRHS->getSourceElementType()) {
810812
// If the GEPs only differ by one index, compare it.

llvm/test/Transforms/InstCombine/icmp-gep.ll

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,3 +709,51 @@ define i1 @pointer_icmp_aligned_with_offset_negative(ptr align 8 %a, ptr align 8
709709
%cmp = icmp eq ptr %gep, %a2
710710
ret i1 %cmp
711711
}
712+
713+
define i1 @gep_diff_base_same_indices(ptr %x, ptr %y, i64 %z) {
714+
; CHECK-LABEL: @gep_diff_base_same_indices(
715+
; CHECK-NEXT: [[X:%.*]] = getelementptr i8, ptr [[X1:%.*]], i64 [[Z:%.*]]
716+
; CHECK-NEXT: [[Y:%.*]] = getelementptr i8, ptr [[Y1:%.*]], i64 [[Z]]
717+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[X]], [[Y]]
718+
; CHECK-NEXT: ret i1 [[CMP]]
719+
;
720+
%gep1 = getelementptr i8, ptr %x, i64 %z
721+
%gep2 = getelementptr i8, ptr %y, i64 %z
722+
%cmp = icmp ult ptr %gep1, %gep2
723+
ret i1 %cmp
724+
}
725+
726+
define i1 @gep_diff_base_same_indices_nuw(ptr %x, ptr %y, i64 %z) {
727+
; CHECK-LABEL: @gep_diff_base_same_indices_nuw(
728+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[X:%.*]], [[Y:%.*]]
729+
; CHECK-NEXT: ret i1 [[CMP]]
730+
;
731+
%gep1 = getelementptr nuw i8, ptr %x, i64 %z
732+
%gep2 = getelementptr nuw i8, ptr %y, i64 %z
733+
%cmp = icmp ult ptr %gep1, %gep2
734+
ret i1 %cmp
735+
}
736+
737+
define i1 @gep_diff_base_same_indices_nusw(ptr %x, ptr %y, i64 %z) {
738+
; CHECK-LABEL: @gep_diff_base_same_indices_nusw(
739+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[X:%.*]], [[Y:%.*]]
740+
; CHECK-NEXT: ret i1 [[CMP]]
741+
;
742+
%gep1 = getelementptr nusw i8, ptr %x, i64 %z
743+
%gep2 = getelementptr nusw i8, ptr %y, i64 %z
744+
%cmp = icmp ult ptr %gep1, %gep2
745+
ret i1 %cmp
746+
}
747+
748+
define i1 @gep_diff_base_same_indices_nuw_nusw(ptr %x, ptr %y, i64 %z) {
749+
; CHECK-LABEL: @gep_diff_base_same_indices_nuw_nusw(
750+
; CHECK-NEXT: [[X:%.*]] = getelementptr nuw i8, ptr [[X1:%.*]], i64 [[Z:%.*]]
751+
; CHECK-NEXT: [[Y:%.*]] = getelementptr nusw i8, ptr [[Y1:%.*]], i64 [[Z]]
752+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult ptr [[X]], [[Y]]
753+
; CHECK-NEXT: ret i1 [[CMP]]
754+
;
755+
%gep1 = getelementptr nuw i8, ptr %x, i64 %z
756+
%gep2 = getelementptr nusw i8, ptr %y, i64 %z
757+
%cmp = icmp ult ptr %gep1, %gep2
758+
ret i1 %cmp
759+
}

0 commit comments

Comments
 (0)