| Index: src/IceTypes.cpp | 
| diff --git a/src/IceTypes.cpp b/src/IceTypes.cpp | 
| index 3a5b80a50083e303b8d2e2b4b6cbac1e07843409..a3e19ae07c001c3685c65da1700b21faa9c59782 100644 | 
| --- a/src/IceTypes.cpp | 
| +++ b/src/IceTypes.cpp | 
| @@ -33,8 +33,8 @@ void __attribute__((unused)) xIceTypeMacroIntegrityCheck() { | 
| }; | 
| // Define a temporary set of enum values based on ICETYPE_PROPS_TABLE | 
| enum { | 
| -#define X(tag, IsVec, IsInt, IsFloat, IsIntArith, CompareResult)               \ | 
| -    _props_table_tag_##tag, | 
| +#define X(tag, IsVec, IsInt, IsFloat, IsIntArith, IsLoadStore, CompareResult)  \ | 
| +  _props_table_tag_##tag, | 
| ICETYPE_PROPS_TABLE | 
| #undef X | 
| _enum_props_table_tag_Names | 
| @@ -45,9 +45,9 @@ void __attribute__((unused)) xIceTypeMacroIntegrityCheck() { | 
| ICETYPE_TABLE; | 
| #undef X | 
| // Assert that tags in ICETYPE_PROPS_TABLE is in ICETYPE_TABLE. | 
| -#define X(tag, IsVec, IsInt, IsFloat, IsIntArith, CompareResult)               \ | 
| +#define X(tag, IsVec, IsInt, IsFloat, IsIntArith, IsLoadStore, CompareResult)  \ | 
| STATIC_ASSERT((unsigned)_table_tag_##tag == (unsigned)_props_table_tag_##tag); | 
| -  ICETYPE_PROPS_TABLE; | 
| +  ICETYPE_PROPS_TABLE | 
| #undef X | 
|  | 
| // Show vector definitions match in ICETYPE_TABLE and | 
| @@ -62,13 +62,13 @@ void __attribute__((unused)) xIceTypeMacroIntegrityCheck() { | 
| }; | 
| // Define constants for boolean flag if vector in ICETYPE_PROPS_TABLE. | 
| enum { | 
| -#define X(tag, IsVec, IsInt, IsFloat, IsIntArith, CompareResult)               \ | 
| -    _props_table_IsVec_##tag = IsVec, | 
| +#define X(tag, IsVec, IsInt, IsFloat, IsIntArith, IsLoadStore, CompareResult)  \ | 
| +  _props_table_IsVec_##tag = IsVec, | 
| ICETYPE_PROPS_TABLE | 
| #undef X | 
| }; | 
| // Verify that the number of vector elements is consistent with IsVec. | 
| -#define X(tag, IsVec, IsInt, IsFloat, IsIntArith, CompareResult)               \ | 
| +#define X(tag, IsVec, IsInt, IsFloat, IsIntArith, IsLoadStore, CompareResult)  \ | 
| STATIC_ASSERT((_table_elts_##tag > 1) == _props_table_IsVec_##tag); | 
| ICETYPE_PROPS_TABLE; | 
| #undef X | 
| @@ -99,14 +99,15 @@ struct TypePropertyFields { | 
| bool TypeIsFloatingType; | 
| bool TypeIsScalarFloatingType; | 
| bool TypeIsVectorFloatingType; | 
| +  bool TypeIsLoadStoreType; | 
| Type CompareResultType; | 
| }; | 
|  | 
| const TypePropertyFields TypePropertiesTable[] = { | 
| -#define X(tag, IsVec, IsInt, IsFloat, IsIntArith, CompareResult)               \ | 
| +#define X(tag, IsVec, IsInt, IsFloat, IsIntArith, IsLoadStore, CompareResult)  \ | 
| {                                                                            \ | 
| IsVec, IsInt, IsInt && !IsVec, IsInt && IsVec, IsIntArith, IsFloat,        \ | 
| -    IsFloat && !IsVec, IsFloat && IsVec, CompareResult                         \ | 
| +        IsFloat && !IsVec, IsFloat && IsVec, IsLoadStore, CompareResult        \ | 
| }                                                                            \ | 
| , | 
| ICETYPE_PROPS_TABLE | 
| @@ -211,6 +212,14 @@ bool isVectorFloatingType(Type Ty) { | 
| return false; | 
| } | 
|  | 
| +bool isLoadStoreType(Type Ty) { | 
| +  size_t Index = static_cast<size_t>(Ty); | 
| +  if (Index < IceType_NUM) | 
| +    return TypePropertiesTable[Index].TypeIsLoadStoreType; | 
| +  llvm_unreachable("Invalid type for isLoadStoreType()"); | 
| +  return false; | 
| +} | 
| + | 
| Type getCompareResultType(Type Ty) { | 
| size_t Index = static_cast<size_t>(Ty); | 
| if (Index < IceType_NUM) | 
|  |