[llvm-commits] [llvm] r51468 - in /llvm/trunk: include/llvm/Bitcode/LLVMBitCodes.h include/llvm/Type.h lib/AsmParser/LLLexer.cpp lib/AsmParser/llvmAsmParser.cpp.cvs lib/AsmParser/llvmAsmParser.h.cvs lib/AsmParser/llvmAsmParser.y lib/AsmParser/llvmAsmParser.y.cvs lib/Bitcode/Reader/BitcodeReader.cpp lib/Bitcode/Writer/BitcodeWriter.cpp lib/Bitcode/Writer/ValueEnumerator.cpp test/Assembler/insertextractvalue.ll test/Verifier/2006-07-11-StoreStruct.ll utils/llvm.grm
Chris Lattner
clattner at apple.com
Fri May 23 14:45:27 PDT 2008
On May 22, 2008, at 6:55 PM, Dan Gohman wrote:
> URL: http://llvm.org/viewvc/llvm-project?rev=51468&view=rev
> Log:
> Make structs and arrays first-class types, and add assembly
> and bitcode support for the extractvalue and insertvalue
> instructions and constant expressions.
Woo!
> +++ llvm/trunk/include/llvm/Type.h Thu May 22 20:55:30 2008
> @@ -216,8 +216,8 @@
> /// is a valid type for a Value.
> ///
> inline bool isFirstClassType() const {
> - // Coming soon: first-class struct and array types...
> - return isSingleValueType();
> + return isSingleValueType() ||
> + ID == StructTyID || ID == ArrayTyID;
> }
At this point, is it faster to just check that this *isn't* void and
functiontype?
> @@ -1966,6 +1967,48 @@
> GEN_ERROR("Invalid shufflevector operands");
> $$ = ConstantExpr::getShuffleVector($3, $5, $7);
> CHECK_FOR_ERROR
> + }
> + | EXTRACTVALUE '(' ConstVal IndexList ')' {
Does IndexList start with a comma? "extractvalue ( {i32} zeroinit
0 )" is strange, I think a comma is needed. Also, constantexprs
should not require types on the indices either. It should just take a
list of EUINT64VAL's, like getresult.
> +++ llvm/trunk/lib/Bitcode/Writer/ValueEnumerator.cpp Thu May 22
> 20:55:30 2008
> @@ -103,10 +103,10 @@
> // in the table (have low bit-width).
> std::stable_sort(Types.begin(), Types.end(), CompareByFrequency);
>
> - // Partition the Type ID's so that the first-class types occur
> before the
> + // Partition the Type ID's so that the single-value types occur
> before the
> // aggregate types. This allows the aggregate types to be dropped
> from the
> // type table after parsing the global variable initializers.
> - std::partition(Types.begin(), Types.end(), isFirstClassType);
> + std::partition(Types.begin(), Types.end(), isSingleValueType);
Is this required for correctness? This could cause a significant BC
file size increase for real world apps. I'd try kimwitu and 176.gcc
as examples.
Thanks for working on this Dan!
-Chris
More information about the llvm-commits
mailing list