emilio created this revision.
Herald added a reviewer: jdoerfert.
Herald added projects: clang, LLVM.
Herald added subscribers: llvm-commits, cfe-commits.

Sign-extension is not guaranteed by the ABI, and thus the callee cannot assume
it.

This fixes PR44228 and PR12207.

With these changes, there are still two tests that need updating:

- CodeGenObjC/optimized-setter.m fails with:

  clang: llvm/lib/IR/Instructions.cpp:400: void 
llvm::CallInst::init(llvm::FunctionType *, llvm::Value *, ArrayRef<llvm::Value 
*>, ArrayRef<llvm::OperandBundleDef>, const llvm::Twine &): Assertion `(i >= 
FTy->getNumParams() || FTy->getParamType(i) == Args[i]->getType()) && "Calling 
a function with a bad signature!"' failed.



- OpenMP/parallel_for_simd_codegen.cpp fails with:

  clang: clang/lib/CodeGen/CGCall.cpp:3858: clang::CodeGen::RValue 
clang::CodeGen::CodeGenFunction::EmitCall(const clang::CodeGen::CGFunctionInfo 
&, const clang::CodeGen::CGCallee &, clang::CodeGen::ReturnValueSlot, const 
clang::CodeGen::CallArgList &, llvm::CallBase **, clang::SourceLocation): 
Assertion `IRFuncTy == TypeFromVal' failed.

These two are probably bad assumptions in some of the ObjC / OpenMP-specific
code, but I want to check this patch is on the right track before digging more.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D72742

Files:
  clang/lib/CodeGen/TargetInfo.cpp
  clang/test/CodeGen/2007-06-18-SextAttrAggregate.c
  clang/test/CodeGen/avx512-reduceMinMaxIntrin.c
  clang/test/CodeGen/catch-implicit-integer-sign-changes.c
  clang/test/CodeGen/function-attributes.c
  clang/test/CodeGen/regcall.c
  clang/test/CodeGen/x86_64-arguments-nacl.c
  clang/test/CodeGen/x86_64-arguments.c
  clang/test/CodeGenCXX/blocks.cpp
  clang/test/CodeGenCXX/const-init-cxx11.cpp
  clang/test/CodeGenCXX/cxx1z-initializer-aggregate.cpp
  clang/test/CodeGenCXX/exceptions.cpp
  clang/test/CodeGenCXX/forward-enum.cpp
  clang/test/CodeGenCXX/value-init.cpp
  clang/test/CodeGenCXX/virtual-bases.cpp
  clang/test/CodeGenObjC/arc-blocks.m
  clang/test/CodeGenObjC/arc-literals.m
  clang/test/CodeGenObjC/arc-property.m
  clang/test/CodeGenObjC/arc-ternary-op.m
  clang/test/CodeGenObjC/atomic-aggregate-property.m
  clang/test/CodeGenObjC/objc-literal-tests.m
  clang/test/CodeGenObjC/objc_copyStruct.m
  clang/test/CodeGenObjC/property-atomic-bool.m
  clang/test/CodeGenObjCXX/property-object-reference-1.mm
  llvm/test/CodeGen/X86/x86-64-arg.ll

Index: llvm/test/CodeGen/X86/x86-64-arg.ll
===================================================================
--- llvm/test/CodeGen/X86/x86-64-arg.ll
+++ llvm/test/CodeGen/X86/x86-64-arg.ll
@@ -1,6 +1,5 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 ; RUN: llc < %s | FileCheck %s
-
 ; The input value is already sign extended, don't re-extend it.
 ; This testcase corresponds to:
 ;   int test(short X) { return (int)X; }
Index: clang/test/CodeGenObjCXX/property-object-reference-1.mm
===================================================================
--- clang/test/CodeGenObjCXX/property-object-reference-1.mm
+++ clang/test/CodeGenObjCXX/property-object-reference-1.mm
@@ -28,4 +28,6 @@
 // CHECK: store %struct.TCPPObject* [[cppObject:%.*]], %struct.TCPPObject** [[cppObjectaddr]], align 8
 // CHECK:  [[THREE:%.*]] = load %struct.TCPPObject*, %struct.TCPPObject** [[cppObjectaddr]], align 8
 // CHECK:  [[FOUR:%.*]] = bitcast %struct.TCPPObject* [[THREE]] to i8*
-// CHECK:  call void @objc_copyStruct(i8* [[TWO:%.*]], i8* [[FOUR]], i64 256, i1 zeroext true, i1 zeroext false)
+// CHECK:  [[FIVE:%.*]] = load i8, i8* %coerce, align 1
+// CHECK:  [[SIX:%.*]] = load i8, i8* %coerce1, align 1
+// CHECK:  call void @objc_copyStruct(i8* [[TWO:%.*]], i8* [[FOUR]], i64 256, i8 [[FIVE]], i8 [[SIX]])
Index: clang/test/CodeGenObjC/property-atomic-bool.m
===================================================================
--- clang/test/CodeGenObjC/property-atomic-bool.m
+++ clang/test/CodeGenObjC/property-atomic-bool.m
@@ -5,7 +5,7 @@
 // CHECK:   %[[TOBOOL:.*]] = trunc i8 %[[ATOMIC_LOAD]] to i1
 // CHECK:   ret i1 %[[TOBOOL]]
 
-// CHECK: define internal void @"\01-[A0 setP:]"({{.*}} i1 zeroext {{.*}})
+// CHECK: define internal void @"\01-[A0 setP:]"({{.*}} i8* {{.*}})
 // CHECK:   store atomic i8 %{{.*}}, i8* %{{.*}} seq_cst
 // CHECK:   ret void
 
@@ -14,7 +14,7 @@
 // CHECK:   %[[TOBOOL:.*]] = trunc i8 %load to i1
 // CHECK:   ret i1 %[[TOBOOL]]
 
-// CHECK: define internal void @"\01-[A1 setP:]"({{.*}} i1 zeroext %p)
+// CHECK: define internal void @"\01-[A1 setP:]"({{.*}} i8 %p.coerce)
 // CHECK:   store atomic i8 %{{.*}}, i8* %{{.*}} unordered
 // CHECK:   ret void
 
Index: clang/test/CodeGenObjC/objc_copyStruct.m
===================================================================
--- clang/test/CodeGenObjC/objc_copyStruct.m
+++ clang/test/CodeGenObjC/objc_copyStruct.m
@@ -1,5 +1,5 @@
-// RUN: %clang -target x86_64-unknown-windows-msvc -fobjc-runtime=ios -Wno-objc-root-class -S -o - -emit-llvm %s | FileCheck %s
-// RUN: %clang -target x86_64-apple-ios -fobjc-runtime=ios -Wno-objc-root-class -S -o - -emit-llvm %s | FileCheck %s
+// RUN: %clang -target x86_64-unknown-windows-msvc -fobjc-runtime=ios -Wno-objc-root-class -S -o - -emit-llvm %s | FileCheck %s -check-prefix CHECK-MSVC
+// RUN: %clang -target x86_64-apple-ios -fobjc-runtime=ios -Wno-objc-root-class -S -o - -emit-llvm %s | FileCheck %s -check-prefix CHECK-IOS
 
 struct S {
   float f, g;
@@ -12,5 +12,6 @@
 @implementation I
 @end
 
-// CHECK: declare {{.*}}void @objc_copyStruct(i8*, i8*, i64, i1, i1)
+// CHECK-MSVC: declare {{.*}}void @objc_copyStruct(i8*, i8*, i64, i1, i1)
+// CHECK-IOS: declare {{.*}}void @objc_copyStruct(i8*, i8*, i64, i8, i8)
 
Index: clang/test/CodeGenObjC/objc-literal-tests.m
===================================================================
--- clang/test/CodeGenObjC/objc-literal-tests.m
+++ clang/test/CodeGenObjC/objc-literal-tests.m
@@ -55,7 +55,7 @@
 
 // CHECK: define i32 @main() [[NUW:#[0-9]+]]
 int main() {
-  // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 signext 97
+  // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 97
   NSNumber *aNumber = @'a';
   // CHECK: call{{.*}}@objc_msgSend{{.*}}i32 42
   NSNumber *fortyTwo = @42;
@@ -73,13 +73,13 @@
   NSNumber *piFloat = @3.141592654f;
   // CHECK: call{{.*}}@objc_msgSend{{.*}}double 0x400921FB54411744
   NSNumber *piDouble = @3.1415926535;
-  // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 signext 1
+  // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 1
   NSNumber *yesNumber = @__objc_yes;
-  // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 signext 0
+  // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 0
   NSNumber *noNumber = @__objc_no;
-  // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 signext 1
+  // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 1
   NSNumber *yesNumber1 = @YES;
-  // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 signext 0
+  // CHECK: call{{.*}}@objc_msgSend{{.*}}i8 0
   NSNumber *noNumber1 = @NO;
 NSDictionary *dictionary = @{@"name" : NSUserName(), 
                              @"date" : [NSDate date] }; 
Index: clang/test/CodeGenObjC/atomic-aggregate-property.m
===================================================================
--- clang/test/CodeGenObjC/atomic-aggregate-property.m
+++ clang/test/CodeGenObjC/atomic-aggregate-property.m
@@ -34,11 +34,19 @@
 // CHECK-LP64: define internal void @"\01-[A setX:]"(
 // CHECK-LP64: store atomic i64 {{%.*}}, i64* {{%.*}} unordered, align 8
 
-// CHECK-LP64: define internal void @"\01-[A y]"(
-// CHECK-LP64: call void @objc_copyStruct(i8* {{%.*}}, i8* {{%.*}}, i64 32, i1 zeroext true, i1 zeroext false)
+// CHECK-LP64:      define internal void @"\01-[A y]"(
+// CHECK-LP64: store i8 1
+// CHECK-LP64-NEXT: [[T0:%.*]] = load i8
+// CHECK-LP64-NEXT: store i8 0
+// CHECK-LP64-NEXT: [[T1:%.*]] = load i8
+// CHECK-LP64-NEXT: call void @objc_copyStruct(i8* {{%.*}}, i8* {{%.*}}, i64 32, i8 [[T0]], i8 [[T1]])
 
 // CHECK-LP64: define internal void @"\01-[A setY:]"(
-// CHECK-LP64: call void @objc_copyStruct(i8* {{%.*}}, i8* {{%.*}}, i64 32, i1 zeroext true, i1 zeroext false)
+// CHECK-LP64: store i8 1
+// CHECK-LP64-NEXT: [[T0:%.*]] = load i8
+// CHECK-LP64-NEXT: store i8 0
+// CHECK-LP64-NEXT: [[T1:%.*]] = load i8
+// CHECK-LP64-NEXT: call void @objc_copyStruct(i8* {{%.*}}, i8* {{%.*}}, i64 32, i8 [[T0]], i8 [[T1]])
 
 // CHECK-LP64: define internal void @"\01-[A z]"(
 // CHECK-LP64: call i8* @objc_memmove_collectable(
Index: clang/test/CodeGenObjC/arc-ternary-op.m
===================================================================
--- clang/test/CodeGenObjC/arc-ternary-op.m
+++ clang/test/CodeGenObjC/arc-ternary-op.m
@@ -5,9 +5,13 @@
 
   // CHECK-LABEL:      define void @test0(
   // CHECK:      [[COND:%.*]] = alloca i8,
+  // CHECK-NEXT: [[COND]].addr = alloca i8,
   // CHECK-NEXT: [[X:%.*]] = alloca i8*,
   // CHECK-NEXT: [[RELVAL:%.*]] = alloca i8*
   // CHECK-NEXT: [[RELCOND:%.*]] = alloca i1
+  // CHECK-NEXT: store i8 [[COND]].coerce, i8* [[COND]]
+  // CHECK-NEXT: load
+  // CHECK-NEXT: trunc
   // CHECK-NEXT: zext
   // CHECK-NEXT: store
   // CHECK-NEXT: [[XPTR1:%.*]] = bitcast i8** [[X]] to i8*
Index: clang/test/CodeGenObjC/arc-property.m
===================================================================
--- clang/test/CodeGenObjC/arc-property.m
+++ clang/test/CodeGenObjC/arc-property.m
@@ -36,7 +36,11 @@
 // CHECK-NEXT: [[OFFSET:%.*]] = load i64, i64* @"OBJC_IVAR_$_Test1.pointer"
 // CHECK-NEXT: [[T1:%.*]] = load [[S1]]*, [[S1]]** {{%.*}}
 // CHECK-NEXT: [[T2:%.*]] = bitcast [[S1]]* [[T1]] to i8*
-// CHECK-NEXT: call void @objc_setProperty(i8* [[T0]], i8* {{%.*}}, i64 [[OFFSET]], i8* [[T2]], i1 zeroext false, i1 zeroext false)
+// CHECK-NEXT: store i8 0, i8* %coerce
+// CHECK-NEXT: [[T3:%.*]] = load i8
+// CHECK-NEXT: store i8 0, i8* %coerce
+// CHECK-NEXT: [[T4:%.*]] = load i8
+// CHECK-NEXT: call void @objc_setProperty(i8* [[T0]], i8* {{%.*}}, i64 [[OFFSET]], i8* [[T2]], i8 [[T3]], i8 [[T4]])
 // CHECK-NEXT: ret void
 
 
@@ -67,14 +71,20 @@
 
 // CHECK:    define internal i8* @"\01-[Test2 theClass]"(
 // CHECK:      [[OFFSET:%.*]] = load i64, i64* @"OBJC_IVAR_$_Test2._theClass"
-// CHECK-NEXT: [[T0:%.*]] = tail call i8* @objc_getProperty(i8* {{.*}}, i8* {{.*}}, i64 [[OFFSET]], i1 zeroext true)
-// CHECK-NEXT: ret i8* [[T0]]
+// CHECK-NEXT: store i8 1, i8* %coerce, align 1
+// CHECK-NEXT: [[T0:%.*]] = load i8
+// CHECK-NEXT: [[T1:%.*]] = tail call i8* @objc_getProperty(i8* {{.*}}, i8* {{.*}}, i64 [[OFFSET]], i8 [[T0]])
+// CHECK-NEXT: ret i8* [[T1]]
 
 // CHECK:    define internal void @"\01-[Test2 setTheClass:]"(
 // CHECK:      [[T0:%.*]] = bitcast [[TEST2]]* {{%.*}} to i8*
 // CHECK-NEXT: [[OFFSET:%.*]] = load i64, i64* @"OBJC_IVAR_$_Test2._theClass"
 // CHECK-NEXT: [[T1:%.*]] = load i8*, i8** {{%.*}}
-// CHECK-NEXT: call void @objc_setProperty(i8* [[T0]], i8* {{%.*}}, i64 [[OFFSET]], i8* [[T1]], i1 zeroext true, i1 zeroext true)
+// CHECK-NEXT: store i8 1
+// CHECK-NEXT: [[T2:%.*]] = load i8
+// CHECK-NEXT: store i8 1
+// CHECK-NEXT: [[T3:%.*]] = load i8
+// CHECK-NEXT: call void @objc_setProperty(i8* [[T0]], i8* {{%.*}}, i64 [[OFFSET]], i8* [[T1]], i8 [[T2]], i8 [[T3]])
 // CHECK-NEXT: ret void
 
 // CHECK:    define internal void @"\01-[Test2 .cxx_destruct]"(
Index: clang/test/CodeGenObjC/arc-literals.m
===================================================================
--- clang/test/CodeGenObjC/arc-literals.m
+++ clang/test/CodeGenObjC/arc-literals.m
@@ -23,7 +23,7 @@
   // CHECK: {{call.*objc_msgSend.*i64 42}}
   // CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
   id ulllit = @42ull;
-  // CHECK: {{call.*objc_msgSend.*i8 signext 97}}
+  // CHECK: {{call.*objc_msgSend.*i8 97}}
   // CHECK: call i8* @llvm.objc.retainAutoreleasedReturnValue
   id charlit = @'a';
   // CHECK: call void @llvm.objc.release
Index: clang/test/CodeGenObjC/arc-blocks.m
===================================================================
--- clang/test/CodeGenObjC/arc-blocks.m
+++ clang/test/CodeGenObjC/arc-blocks.m
@@ -472,17 +472,29 @@
 @end
 @implementation Test12
 @synthesize ablock, nblock;
-// CHECK:    define internal void ()* @"\01-[Test12 ablock]"(
-// CHECK:    call i8* @objc_getProperty(i8* {{%.*}}, i8* {{%.*}}, i64 {{%.*}}, i1 zeroext true)
-
-// CHECK:    define internal void @"\01-[Test12 setAblock:]"(
-// CHECK:    call void @objc_setProperty(i8* {{%.*}}, i8* {{%.*}}, i64 {{%.*}}, i8* {{%.*}}, i1 zeroext true, i1 zeroext true)
-
-// CHECK:    define internal void ()* @"\01-[Test12 nblock]"(
-// CHECK:    call i8* @objc_getProperty(i8* {{%.*}}, i8* {{%.*}}, i64 {{%.*}}, i1 zeroext false)
+// CHECK:      define internal void ()* @"\01-[Test12 ablock]"(
+// CHECK:      store i8 1
+// CHECK-NEXT: [[T0:%.*]] = load i8
+// CHECK-NEXT: call i8* @objc_getProperty(i8* {{%.*}}, i8* {{%.*}}, i64 {{%.*}}, i8 [[T0]])
+
+// CHECK:      define internal void @"\01-[Test12 setAblock:]"(
+// CHECK:      store i8 1
+// CHECK-NEXT: [[T0:%.*]] = load i8
+// CHECK-NEXT: store i8 1
+// CHECK-NEXT: [[T1:%.*]] = load i8
+// CHECK-NEXT: call void @objc_setProperty(i8* {{%.*}}, i8* {{%.*}}, i64 {{%.*}}, i8* {{%.*}}, i8 [[T0]], i8 [[T1]])
+
+// CHECK:      define internal void ()* @"\01-[Test12 nblock]"(
+// CHECK:      store i8 0
+// CHECK-NEXT: [[T0:%.*]] = load i8
+// CHECK:      call i8* @objc_getProperty(i8* {{%.*}}, i8* {{%.*}}, i64 {{%.*}}, i8 [[T0]])
 
 // CHECK:    define internal void @"\01-[Test12 setNblock:]"(
-// CHECK:    call void @objc_setProperty(i8* {{%.*}}, i8* {{%.*}}, i64 {{%.*}}, i8* {{%.*}}, i1 zeroext false, i1 zeroext true)
+// CHECK:      store i8 0
+// CHECK-NEXT: [[T0:%.*]] = load i8
+// CHECK-NEXT: store i8 1
+// CHECK-NEXT: [[T1:%.*]] = load i8
+// CHECK-NEXT: call void @objc_setProperty(i8* {{%.*}}, i8* {{%.*}}, i64 {{%.*}}, i8* {{%.*}}, i8 [[T0]], i8 [[T1]])
 @end
 
 // rdar://problem/10131784
Index: clang/test/CodeGenCXX/virtual-bases.cpp
===================================================================
--- clang/test/CodeGenCXX/virtual-bases.cpp
+++ clang/test/CodeGenCXX/virtual-bases.cpp
@@ -20,8 +20,8 @@
   C(bool);
 };
 
-// CHECK-LABEL: define void @_ZN1CC2Eb(%struct.C* %this, i8** %vtt, i1 zeroext %0) unnamed_addr
-// CHECK-LABEL: define void @_ZN1CC1Eb(%struct.C* %this, i1 zeroext %0) unnamed_addr
+// CHECK-LABEL: define void @_ZN1CC2Eb(%struct.C* %this, i8** %vtt, i8 %.coerce) unnamed_addr
+// CHECK-LABEL: define void @_ZN1CC1Eb(%struct.C* %this, i8 %.coerce) unnamed_addr
 C::C(bool) { }
 
 // PR6251
Index: clang/test/CodeGenCXX/value-init.cpp
===================================================================
--- clang/test/CodeGenCXX/value-init.cpp
+++ clang/test/CodeGenCXX/value-init.cpp
@@ -259,9 +259,8 @@
   // CHECK-NEXT: call void @_ZN7PR111242B2C2Ev
 }
 
-// Ensure we produce an i1 here, and don't assert.
 // CHECK-LABEL: define void @_Z9r170806_bv(
-// CHECK: call void @_Z9r170806_ab(i1 zeroext false)
+// CHECK: call void @_Z9r170806_ab(i8 %0)
 void r170806_a(bool b = bool());
 void r170806_b() { r170806_a(); }
 
Index: clang/test/CodeGenCXX/forward-enum.cpp
===================================================================
--- clang/test/CodeGenCXX/forward-enum.cpp
+++ clang/test/CodeGenCXX/forward-enum.cpp
@@ -6,6 +6,6 @@
 // CHECK-LABEL: define void @_Z3foo6MyEnum
 void foo(MyEnum value)
 {
-  // CHECK: call void @_Z3bar6MyEnum(i8 signext
+  // CHECK: call void @_Z3bar6MyEnum(i8
   bar(value);
 }
Index: clang/test/CodeGenCXX/exceptions.cpp
===================================================================
--- clang/test/CodeGenCXX/exceptions.cpp
+++ clang/test/CodeGenCXX/exceptions.cpp
@@ -223,21 +223,25 @@
   // rdar://problem/8439196
   A *b(bool cond) {
 
-    // CHECK:    define [[A:%.*]]* @_ZN5test31bEb(i1 zeroext
+    // CHECK:    define [[A:%.*]]* @_ZN5test31bEb(i8 [[COND:%.*]].coerce
     // CHECK:      [[SAVED0:%.*]] = alloca i8*
     // CHECK-NEXT: [[SAVED1:%.*]] = alloca i8*
-    // CHECK-NEXT: [[CLEANUPACTIVE:%.*]] = alloca i1
-
-    // CHECK:      [[COND:%.*]] = trunc i8 {{.*}} to i1
-    // CHECK-NEXT: store i1 false, i1* [[CLEANUPACTIVE]]
-    // CHECK-NEXT: br i1 [[COND]]
+    // CHECK-NEXT: [[CLEANUP:%.*]].cond = alloca i1, align 1
+
+    // CHECK:      [[COND1:%.*]] = trunc i8 {{.*}} to i1
+    // CHECK-NEXT: [[CONDZEXT:%.*]] = zext i1 [[COND1]] to i8
+    // CHECK-NEXT: store i8 [[CONDZEXT]], i8* [[COND]].addr, align 1
+    // CHECK-NEXT: load i8, i8* [[COND]].addr, align 1
+    // CHECK-NEXT: [[TOBOOL:%.*]] = trunc i8 {{.*}} to i1
+    // CHECK-NEXT: store i1 false, i1* [[CLEANUP]].cond, align 1
+    // CHECK-NEXT: br i1 [[TOBOOL]]
     return (cond ?
 
     // CHECK:      [[FOO:%.*]] = call i8* @_ZN5test33fooEv()
     // CHECK-NEXT: [[NEW:%.*]] = call i8* @_ZN5test31AnwEmPvd(i64 8, i8* [[FOO]], double [[CONST:.*]])
     // CHECK-NEXT: store i8* [[NEW]], i8** [[SAVED0]]
     // CHECK-NEXT: store i8* [[FOO]], i8** [[SAVED1]]
-    // CHECK-NEXT: store i1 true, i1* [[CLEANUPACTIVE]]
+    // CHECK-NEXT: store i1 true, i1* [[CLEANUP]].cond
     // CHECK-NEXT: [[CAST:%.*]] = bitcast i8* [[NEW]] to [[A]]*
     // CHECK-NEXT: invoke void @_ZN5test35makeAEv([[A]]* sret [[CAST]])
     // CHECK: br label
@@ -254,7 +258,7 @@
     // CHECK:      ret [[A]]* [[RESULT]]
 
     // in the EH path:
-    // CHECK:      [[ISACTIVE:%.*]] = load i1, i1* [[CLEANUPACTIVE]]
+    // CHECK:      [[ISACTIVE:%.*]] = load i1, i1* [[CLEANUP]].cond
     // CHECK-NEXT: br i1 [[ISACTIVE]]
     // CHECK:      [[V0:%.*]] = load i8*, i8** [[SAVED0]]
     // CHECK-NEXT: [[V1:%.*]] = load i8*, i8** [[SAVED1]]
Index: clang/test/CodeGenCXX/cxx1z-initializer-aggregate.cpp
===================================================================
--- clang/test/CodeGenCXX/cxx1z-initializer-aggregate.cpp
+++ clang/test/CodeGenCXX/cxx1z-initializer-aggregate.cpp
@@ -65,7 +65,7 @@
   // CHECK-LABEL: define {{.*}}global_var_init
   // CHECK: call void @_ZN7Dynamic1AC2Ev({{.*}} @_ZN7Dynamic2d1E
   // CHECK: store i32 5, {{.*}}i8* getelementptr inbounds {{.*}} @_ZN7Dynamic2d1E{{.*}}, i64 8
-  // CHECK: invoke void @_ZN7Dynamic1CC2Eb({{.*}} @_ZN7Dynamic2d1E{{.*}}, i1 zeroext true)
+  // CHECK: invoke void @_ZN7Dynamic1CC2Eb({{.*}} @_ZN7Dynamic2d1E{{.*}}, i8 %0)
   // CHECK:   unwind label %[[UNWIND:.*]]
   // CHECK: invoke i32 @_ZN7Dynamic1fEv()
   // CHECK:   unwind label %[[UNWIND:.*]]
@@ -81,7 +81,7 @@
   // CHECK-LABEL: define {{.*}}global_var_init
   // CHECK: call void @_ZN7Dynamic1AC1Ei({{.*}} @_ZN7Dynamic2d2E{{.*}}, i32 1)
   // CHECK: store i32 2, {{.*}}i8* getelementptr inbounds {{.*}}@_ZN7Dynamic2d2E{{.*}}, i64 8
-  // CHECK: invoke void @_ZN7Dynamic1CC1Eb({{.*}} @_ZN7Dynamic2d2E{{.*}}, i1 zeroext false)
+  // CHECK: invoke void @_ZN7Dynamic1CC1Eb({{.*}} @_ZN7Dynamic2d2E{{.*}}, i8 %0)
   // CHECK: invoke i32 @_ZN7Dynamic1fEv()
   // CHECK: store i32 {{.*}}, i32* getelementptr {{.*}} @_ZN7Dynamic2d2E, i32 0, i32 2
   // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN7Dynamic1DD1Ev {{.*}} @_ZN7Dynamic2d2E
@@ -94,7 +94,7 @@
   // CHECK: %[[H_CALL:.*]] = invoke i32 @_ZN7Dynamic1hEv()
   // CHECK:   unwind label %[[DESTROY_A_LPAD:.*]]
   // CHECK: store i32 %[[H_CALL]], {{.*}}i8* getelementptr inbounds {{.*}} @_ZN7Dynamic2d3E{{.*}}, i64 8
-  // CHECK: invoke void @_ZN7Dynamic1CC2Eb({{.*}} @_ZN7Dynamic2d3E{{.*}}, i1 zeroext true)
+  // CHECK: invoke void @_ZN7Dynamic1CC2Eb({{.*}} @_ZN7Dynamic2d3E{{.*}}, i8 %0)
   // CHECK:   unwind label %[[DESTROY_AB_LPAD:.*]]
   // CHECK: %[[I_CALL:.*]] = invoke i32 @_ZN7Dynamic1iEv()
   // CHECK:   unwind label %[[DESTROY_AB_LPAD:.*]]
Index: clang/test/CodeGenCXX/const-init-cxx11.cpp
===================================================================
--- clang/test/CodeGenCXX/const-init-cxx11.cpp
+++ clang/test/CodeGenCXX/const-init-cxx11.cpp
@@ -533,7 +533,10 @@
   constexpr int a[3] = { 1, 4, 9 };
 
   void test() {
-    // CHECK: call void @_ZN13InitFromConst7consumeIbEEvT_(i1 zeroext true)
+    // FIXME: This should probably be:
+    // call void @_ZN13InitFromConst7consumeIbEEvT_(i1 zeroext true)
+    // And not require an alloca
+    // CHECK: call void @_ZN13InitFromConst7consumeIbEEvT_(i8 %0)
     consume(b);
 
     // CHECK: call void @_ZN13InitFromConst7consumeIiEEvT_(i32 5)
Index: clang/test/CodeGenCXX/blocks.cpp
===================================================================
--- clang/test/CodeGenCXX/blocks.cpp
+++ clang/test/CodeGenCXX/blocks.cpp
@@ -152,18 +152,22 @@
 
   // CHECK-LABEL:    define void @_ZN5test54testEb(
   // CHECK:      [[COND:%.*]] = alloca i8
+  // CHECK-NEXT: [[COND]].addr = alloca i8, align 1
   // CHECK-NEXT: [[X:%.*]] = alloca [[A:%.*]], align 4
   // CHECK-NEXT: [[B:%.*]] = alloca void ()*, align 8
   // CHECK-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:.*]], align 8
   // CHECK-NEXT: [[CLEANUP_ACTIVE:%.*]] = alloca i1
-  // CHECK-NEXT: [[T0:%.*]] = zext i1
-  // CHECK-NEXT: store i8 [[T0]], i8* [[COND]], align 1
+  // CHECK-NEXT: store i8 [[COND]].coerce, i8* [[COND]], align 1
+  // CHECK-NEXT: [[T0:%.*]] = load i8, i8* [[COND]], align 1
+  // CHECK-NEXT: [[COND1:%.*]] = trunc i8 [[T0]] to i1
+  // CHECK-NEXT: [[T1:%.*]] = zext i1 [[COND1]] to i8
+  // CHECK-NEXT: store i8 [[T1]], i8* [[COND]].addr, align 1
   // CHECK-NEXT: call void @_ZN5test51AC1Ev([[A]]* [[X]])
   // CHECK-NEXT: [[CLEANUP_ADDR:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
-  // CHECK-NEXT: [[T0:%.*]] = load i8, i8* [[COND]], align 1
-  // CHECK-NEXT: [[T1:%.*]] = trunc i8 [[T0]] to i1
+  // CHECK-NEXT: [[T1:%.*]] = load i8, i8* [[COND]].addr, align 1
+  // CHECK-NEXT: [[T2:%.*]] = trunc i8 [[T1]] to i1
   // CHECK-NEXT: store i1 false, i1* [[CLEANUP_ACTIVE]]
-  // CHECK-NEXT: br i1 [[T1]],
+  // CHECK-NEXT: br i1 [[T2]],
 
   // CHECK-NOT:  br
   // CHECK:      [[CAPTURE:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
Index: clang/test/CodeGen/x86_64-arguments.c
===================================================================
--- clang/test/CodeGen/x86_64-arguments.c
+++ clang/test/CodeGen/x86_64-arguments.c
@@ -36,7 +36,7 @@
   return 0;
 }
 
-// CHECK-LABEL: define void @f6(i8 signext %a0, i16 signext %a1, i32 %a2, i64 %a3, i8* %a4)
+// CHECK-LABEL: define void @f6(i8 %a0, i16 %a1, i32 %a2, i64 %a3, i8* %a4)
 void f6(char a0, short a1, int a2, long long a3, void *a4) {
 }
 
Index: clang/test/CodeGen/x86_64-arguments-nacl.c
===================================================================
--- clang/test/CodeGen/x86_64-arguments-nacl.c
+++ clang/test/CodeGen/x86_64-arguments-nacl.c
@@ -30,7 +30,7 @@
   return 0;
 }
 
-// CHECK-LABEL: define void @f6(i8 signext %a0, i16 signext %a1, i32 %a2, i64 %a3, i8* %a4)
+// CHECK-LABEL: define void @f6(i8 %a0, i16 %a1, i32 %a2, i64 %a3, i8* %a4)
 void f6(char a0, short a1, int a2, long long a3, void *a4) {
 }
 
Index: clang/test/CodeGen/regcall.c
===================================================================
--- clang/test/CodeGen/regcall.c
+++ clang/test/CodeGen/regcall.c
@@ -21,7 +21,7 @@
 // Win32: define dso_local x86_regcallcc void @__regcall3__v2(i8 inreg signext %a, i8 inreg signext %b)
 // Win64: define dso_local x86_regcallcc void @__regcall3__v2(i8 %a, i8 %b)
 // Lin32: define x86_regcallcc void @__regcall3__v2(i8 inreg signext %a, i8 inreg signext %b)
-// Lin64: define x86_regcallcc void @__regcall3__v2(i8 signext %a, i8 signext %b)
+// Lin64: define x86_regcallcc void @__regcall3__v2(i8 %a, i8 %b)
 
 struct Small { int x; };
 void __regcall v3(int a, struct Small b, int c) {}
Index: clang/test/CodeGen/function-attributes.c
===================================================================
--- clang/test/CodeGen/function-attributes.c
+++ clang/test/CodeGen/function-attributes.c
@@ -1,14 +1,29 @@
 // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -disable-llvm-passes -Os -o - %s | FileCheck %s
 // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -disable-llvm-passes -Os -std=c99 -o - %s | FileCheck %s
 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -disable-llvm-passes -Os -std=c99 -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -disable-llvm-passes -Os -o - %s | FileCheck %s --check-prefix=CHECK-32
+// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -disable-llvm-passes -Os -std=c99 -o - %s | FileCheck %s --check-prefix=CHECK-32
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -disable-llvm-passes -Os -std=c99 -o - %s | FileCheck %s --check-prefix=CHECK-64
+
 // CHECK: define signext i8 @f0(i32 %x) [[NUW:#[0-9]+]]
-// CHECK: define zeroext i8 @f1(i32 %x) [[NUW]]
-// CHECK: define void @f2(i8 signext %x) [[NUW]]
-// CHECK: define void @f3(i8 zeroext %x) [[NUW]]
-// CHECK: define signext i16 @f4(i32 %x) [[NUW]]
-// CHECK: define zeroext i16 @f5(i32 %x) [[NUW]]
-// CHECK: define void @f6(i16 signext %x) [[NUW]]
-// CHECK: define void @f7(i16 zeroext %x) [[NUW]]
+
+// CHECK-32: define signext i8 @f0(i32 %x) [[NUW:#[0-9]+]]
+// CHECK-32: define zeroext i8 @f1(i32 %x) [[NUW]]
+// CHECK-32: define void @f2(i8 signext %x) [[NUW]]
+// CHECK-32: define void @f3(i8 zeroext %x) [[NUW]]
+// CHECK-32: define signext i16 @f4(i32 %x) [[NUW]]
+// CHECK-32: define zeroext i16 @f5(i32 %x) [[NUW]]
+// CHECK-32: define void @f6(i16 signext %x) [[NUW]]
+// CHECK-32: define void @f7(i16 zeroext %x) [[NUW]]
+
+// CHECK-64: define signext i8 @f0(i32 %x) [[NUW:#[0-9]+]]
+// CHECK-64: define zeroext i8 @f1(i32 %x) [[NUW]]
+// CHECK-64: define void @f2(i8 %x) [[NUW]]
+// CHECK-64: define void @f3(i8 %x) [[NUW]]
+// CHECK-64: define signext i16 @f4(i32 %x) [[NUW]]
+// CHECK-64: define zeroext i16 @f5(i32 %x) [[NUW]]
+// CHECK-64: define void @f6(i16 %x) [[NUW]]
+// CHECK-64: define void @f7(i16 %x) [[NUW]]
 
 signed char f0(int x) { return x; }
 
Index: clang/test/CodeGen/catch-implicit-integer-sign-changes.c
===================================================================
--- clang/test/CodeGen/catch-implicit-integer-sign-changes.c
+++ clang/test/CodeGen/catch-implicit-integer-sign-changes.c
@@ -99,7 +99,7 @@
 // These 3 result (after optimizations) in simple 'icmp sge i8 %src, 0'
 
 // CHECK-LABEL: @signed_char_to_unsigned_char
-// CHECK-SAME: (i8 signext %[[SRC:.*]])
+// CHECK-SAME: (i8 %[[SRC:.*]])
 unsigned char signed_char_to_unsigned_char(signed char src) {
   // CHECK: %[[SRC_ADDR:.*]] = alloca i8
   // CHECK-NEXT: store i8 %[[SRC]], i8* %[[SRC_ADDR]]
@@ -122,7 +122,7 @@
 }
 
 // CHECK-LABEL: @unsigned_char_to_signed_char
-// CHECK-SAME: (i8 zeroext %[[SRC:.*]])
+// CHECK-SAME: (i8 %[[SRC:.*]])
 signed char unsigned_char_to_signed_char(unsigned char src) {
   // CHECK: %[[SRC_ADDR:.*]] = alloca i8
   // CHECK-NEXT: store i8 %[[SRC]], i8* %[[SRC_ADDR]]
@@ -145,7 +145,7 @@
 }
 
 // CHECK-LABEL: @signed_char_to_unsigned_int
-// CHECK-SAME: (i8 signext %[[SRC:.*]])
+// CHECK-SAME: (i8 %[[SRC:.*]])
 unsigned int signed_char_to_unsigned_int(signed char src) {
   // CHECK: %[[SRC_ADDR:.*]] = alloca i8
   // CHECK-NEXT: store i8 %[[SRC]], i8* %[[SRC_ADDR]]
Index: clang/test/CodeGen/avx512-reduceMinMaxIntrin.c
===================================================================
--- clang/test/CodeGen/avx512-reduceMinMaxIntrin.c
+++ clang/test/CodeGen/avx512-reduceMinMaxIntrin.c
@@ -398,7 +398,7 @@
   return _mm512_reduce_min_pd(__W); 
 }
 
-// CHECK-LABEL: define i64 @test_mm512_mask_reduce_max_epi64(i8 zeroext %__M, <8 x i64> %__W) #0 {
+// CHECK-LABEL: define i64 @test_mm512_mask_reduce_max_epi64(i8 %__M, <8 x i64> %__W) #0 {
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    [[__D_ADDR_I_I:%.*]] = alloca i64, align 8
 // CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I_I:%.*]] = alloca <8 x i64>, align 64
@@ -503,7 +503,7 @@
   return _mm512_mask_reduce_max_epi64(__M, __W); 
 }
 
-// CHECK-LABEL: define i64 @test_mm512_mask_reduce_max_epu64(i8 zeroext %__M, <8 x i64> %__W) #0 {
+// CHECK-LABEL: define i64 @test_mm512_mask_reduce_max_epu64(i8 %__M, <8 x i64> %__W) #0 {
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I_I_I:%.*]] = alloca <8 x i64>, align 64
 // CHECK-NEXT:    [[__U_ADDR_I_I:%.*]] = alloca i8, align 1
@@ -587,7 +587,7 @@
   return _mm512_mask_reduce_max_epu64(__M, __W); 
 }
 
-// CHECK-LABEL: define double @test_mm512_mask_reduce_max_pd(i8 zeroext %__M, <8 x double> %__W) #0 {
+// CHECK-LABEL: define double @test_mm512_mask_reduce_max_pd(i8 %__M, <8 x double> %__W) #0 {
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    [[__W_ADDR_I_I:%.*]] = alloca double, align 8
 // CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I_I:%.*]] = alloca <8 x double>, align 64
@@ -695,7 +695,7 @@
   return _mm512_mask_reduce_max_pd(__M, __W); 
 }
 
-// CHECK-LABEL: define i64 @test_mm512_mask_reduce_min_epi64(i8 zeroext %__M, <8 x i64> %__W) #0 {
+// CHECK-LABEL: define i64 @test_mm512_mask_reduce_min_epi64(i8 %__M, <8 x i64> %__W) #0 {
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    [[__D_ADDR_I_I:%.*]] = alloca i64, align 8
 // CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I_I:%.*]] = alloca <8 x i64>, align 64
@@ -800,7 +800,7 @@
   return _mm512_mask_reduce_min_epi64(__M, __W); 
 }
 
-// CHECK-LABEL: define i64 @test_mm512_mask_reduce_min_epu64(i8 zeroext %__M, <8 x i64> %__W) #0 {
+// CHECK-LABEL: define i64 @test_mm512_mask_reduce_min_epu64(i8 %__M, <8 x i64> %__W) #0 {
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    [[__D_ADDR_I_I:%.*]] = alloca i64, align 8
 // CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I_I:%.*]] = alloca <8 x i64>, align 64
@@ -905,7 +905,7 @@
   return _mm512_mask_reduce_min_epu64(__M, __W);
 }
 
-// CHECK-LABEL: define double @test_mm512_mask_reduce_min_pd(i8 zeroext %__M, <8 x double> %__W) #0 {
+// CHECK-LABEL: define double @test_mm512_mask_reduce_min_pd(i8 %__M, <8 x double> %__W) #0 {
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    [[__W_ADDR_I_I:%.*]] = alloca double, align 8
 // CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I_I:%.*]] = alloca <8 x double>, align 64
@@ -1617,7 +1617,7 @@
   return _mm512_reduce_min_ps(__W); 
 }
 
-// CHECK-LABEL: define i32 @test_mm512_mask_reduce_max_epi32(i16 zeroext %__M, <8 x i64> %__W) #0 {
+// CHECK-LABEL: define i32 @test_mm512_mask_reduce_max_epi32(i16 %__M, <8 x i64> %__W) #0 {
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    [[__S_ADDR_I_I:%.*]] = alloca i32, align 4
 // CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I_I:%.*]] = alloca <16 x i32>, align 64
@@ -1784,7 +1784,7 @@
   return _mm512_mask_reduce_max_epi32(__M, __W); 
 }
 
-// CHECK-LABEL: define i32 @test_mm512_mask_reduce_max_epu32(i16 zeroext %__M, <8 x i64> %__W) #0 {
+// CHECK-LABEL: define i32 @test_mm512_mask_reduce_max_epu32(i16 %__M, <8 x i64> %__W) #0 {
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I_I_I:%.*]] = alloca <8 x i64>, align 64
 // CHECK-NEXT:    [[__U_ADDR_I_I:%.*]] = alloca i16, align 2
@@ -1913,7 +1913,7 @@
   return _mm512_mask_reduce_max_epu32(__M, __W); 
 }
 
-// CHECK-LABEL: define float @test_mm512_mask_reduce_max_ps(i16 zeroext %__M, <16 x float> %__W) #0 {
+// CHECK-LABEL: define float @test_mm512_mask_reduce_max_ps(i16 %__M, <16 x float> %__W) #0 {
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    [[__W_ADDR_I_I:%.*]] = alloca float, align 4
 // CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I_I:%.*]] = alloca <16 x float>, align 64
@@ -2057,7 +2057,7 @@
   return _mm512_mask_reduce_max_ps(__M, __W); 
 }
 
-// CHECK-LABEL: define i32 @test_mm512_mask_reduce_min_epi32(i16 zeroext %__M, <8 x i64> %__W) #0 {
+// CHECK-LABEL: define i32 @test_mm512_mask_reduce_min_epi32(i16 %__M, <8 x i64> %__W) #0 {
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    [[__S_ADDR_I_I:%.*]] = alloca i32, align 4
 // CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I_I:%.*]] = alloca <16 x i32>, align 64
@@ -2224,7 +2224,7 @@
   return _mm512_mask_reduce_min_epi32(__M, __W); 
 }
 
-// CHECK-LABEL: define i32 @test_mm512_mask_reduce_min_epu32(i16 zeroext %__M, <8 x i64> %__W) #0 {
+// CHECK-LABEL: define i32 @test_mm512_mask_reduce_min_epu32(i16 %__M, <8 x i64> %__W) #0 {
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    [[__S_ADDR_I_I:%.*]] = alloca i32, align 4
 // CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I_I:%.*]] = alloca <16 x i32>, align 64
@@ -2391,7 +2391,7 @@
   return _mm512_mask_reduce_min_epu32(__M, __W); 
 }
 
-// CHECK-LABEL: define float @test_mm512_mask_reduce_min_ps(i16 zeroext %__M, <16 x float> %__W) #0 {
+// CHECK-LABEL: define float @test_mm512_mask_reduce_min_ps(i16 %__M, <16 x float> %__W) #0 {
 // CHECK-NEXT:  entry:
 // CHECK-NEXT:    [[__W_ADDR_I_I:%.*]] = alloca float, align 4
 // CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I_I:%.*]] = alloca <16 x float>, align 64
Index: clang/test/CodeGen/2007-06-18-SextAttrAggregate.c
===================================================================
--- clang/test/CodeGen/2007-06-18-SextAttrAggregate.c
+++ clang/test/CodeGen/2007-06-18-SextAttrAggregate.c
@@ -1,5 +1,5 @@
 // RUN: %clang_cc1 %s -o - -emit-llvm | FileCheck %s
-// XFAIL: aarch64, arm64, x86_64-pc-windows-msvc, x86_64-w64-windows-gnu, x86_64-pc-windows-gnu
+// XFAIL: x86_64, aarch64, arm64, x86_64-pc-windows-msvc, x86_64-w64-windows-gnu, x86_64-pc-windows-gnu
 
 // PR1513
 
@@ -8,6 +8,8 @@
 
 // Win64 ABI does expect extensions for type smaller than 64bits.
 
+// Same for AMD64's PSABI
+
 // Technically this test wasn't written to test that feature, but it's a
 // valuable check nevertheless.
 
Index: clang/lib/CodeGen/TargetInfo.cpp
===================================================================
--- clang/lib/CodeGen/TargetInfo.cpp
+++ clang/lib/CodeGen/TargetInfo.cpp
@@ -3296,8 +3296,7 @@
   return Result;
 }
 
-ABIArgInfo X86_64ABIInfo::
-classifyReturnType(QualType RetTy) const {
+ABIArgInfo X86_64ABIInfo::classifyReturnType(QualType RetTy) const {
   // AMD64-ABI 3.2.3p4: Rule 1. Classify the return type with the
   // classification algorithm.
   X86_64ABIInfo::Class Lo, Hi;
@@ -3476,19 +3475,6 @@
 
     // Pick an 8-byte type based on the preferred type.
     ResType = GetINTEGERTypeAtOffset(CGT.ConvertType(Ty), 0, Ty, 0);
-
-    // If we have a sign or zero extended integer, make sure to return Extend
-    // so that the parameter gets the right LLVM IR attributes.
-    if (Hi == NoClass && isa<llvm::IntegerType>(ResType)) {
-      // Treat an enum type as its underlying type.
-      if (const EnumType *EnumTy = Ty->getAs<EnumType>())
-        Ty = EnumTy->getDecl()->getIntegerType();
-
-      if (Ty->isIntegralOrEnumerationType() &&
-          Ty->isPromotableIntegerType())
-        return ABIArgInfo::getExtend(Ty);
-    }
-
     break;
 
     // AMD64-ABI 3.2.3p3: Rule 3. If the class is SSE, the next
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to