diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/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(ResType)) { - // Treat an enum type as its underlying type. - if (const EnumType *EnumTy = Ty->getAs()) - 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 diff --git a/clang/test/CodeGen/2007-06-18-SextAttrAggregate.c b/clang/test/CodeGen/2007-06-18-SextAttrAggregate.c --- a/clang/test/CodeGen/2007-06-18-SextAttrAggregate.c +++ b/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. diff --git a/clang/test/CodeGen/avx512-reduceMinMaxIntrin.c b/clang/test/CodeGen/avx512-reduceMinMaxIntrin.c --- a/clang/test/CodeGen/avx512-reduceMinMaxIntrin.c +++ b/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 diff --git a/clang/test/CodeGen/catch-implicit-integer-sign-changes.c b/clang/test/CodeGen/catch-implicit-integer-sign-changes.c --- a/clang/test/CodeGen/catch-implicit-integer-sign-changes.c +++ b/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]] diff --git a/clang/test/CodeGen/function-attributes.c b/clang/test/CodeGen/function-attributes.c --- a/clang/test/CodeGen/function-attributes.c +++ b/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; } diff --git a/clang/test/CodeGen/regcall.c b/clang/test/CodeGen/regcall.c --- a/clang/test/CodeGen/regcall.c +++ b/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) {} diff --git a/clang/test/CodeGen/x86_64-arguments-nacl.c b/clang/test/CodeGen/x86_64-arguments-nacl.c --- a/clang/test/CodeGen/x86_64-arguments-nacl.c +++ b/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) { } diff --git a/clang/test/CodeGen/x86_64-arguments.c b/clang/test/CodeGen/x86_64-arguments.c --- a/clang/test/CodeGen/x86_64-arguments.c +++ b/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) { } diff --git a/clang/test/CodeGenCXX/blocks.cpp b/clang/test/CodeGenCXX/blocks.cpp --- a/clang/test/CodeGenCXX/blocks.cpp +++ b/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 diff --git a/clang/test/CodeGenCXX/const-init-cxx11.cpp b/clang/test/CodeGenCXX/const-init-cxx11.cpp --- a/clang/test/CodeGenCXX/const-init-cxx11.cpp +++ b/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) diff --git a/clang/test/CodeGenCXX/cxx1z-initializer-aggregate.cpp b/clang/test/CodeGenCXX/cxx1z-initializer-aggregate.cpp --- a/clang/test/CodeGenCXX/cxx1z-initializer-aggregate.cpp +++ b/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:.*]] diff --git a/clang/test/CodeGenCXX/exceptions.cpp b/clang/test/CodeGenCXX/exceptions.cpp --- a/clang/test/CodeGenCXX/exceptions.cpp +++ b/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]] diff --git a/clang/test/CodeGenCXX/forward-enum.cpp b/clang/test/CodeGenCXX/forward-enum.cpp --- a/clang/test/CodeGenCXX/forward-enum.cpp +++ b/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); } diff --git a/clang/test/CodeGenCXX/value-init.cpp b/clang/test/CodeGenCXX/value-init.cpp --- a/clang/test/CodeGenCXX/value-init.cpp +++ b/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(); } diff --git a/clang/test/CodeGenCXX/virtual-bases.cpp b/clang/test/CodeGenCXX/virtual-bases.cpp --- a/clang/test/CodeGenCXX/virtual-bases.cpp +++ b/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 diff --git a/clang/test/CodeGenObjC/arc-blocks.m b/clang/test/CodeGenObjC/arc-blocks.m --- a/clang/test/CodeGenObjC/arc-blocks.m +++ b/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 diff --git a/clang/test/CodeGenObjC/arc-literals.m b/clang/test/CodeGenObjC/arc-literals.m --- a/clang/test/CodeGenObjC/arc-literals.m +++ b/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 diff --git a/clang/test/CodeGenObjC/arc-property.m b/clang/test/CodeGenObjC/arc-property.m --- a/clang/test/CodeGenObjC/arc-property.m +++ b/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]"( diff --git a/clang/test/CodeGenObjC/arc-ternary-op.m b/clang/test/CodeGenObjC/arc-ternary-op.m --- a/clang/test/CodeGenObjC/arc-ternary-op.m +++ b/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* diff --git a/clang/test/CodeGenObjC/atomic-aggregate-property.m b/clang/test/CodeGenObjC/atomic-aggregate-property.m --- a/clang/test/CodeGenObjC/atomic-aggregate-property.m +++ b/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( diff --git a/clang/test/CodeGenObjC/objc-literal-tests.m b/clang/test/CodeGenObjC/objc-literal-tests.m --- a/clang/test/CodeGenObjC/objc-literal-tests.m +++ b/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] }; diff --git a/clang/test/CodeGenObjC/objc_copyStruct.m b/clang/test/CodeGenObjC/objc_copyStruct.m --- a/clang/test/CodeGenObjC/objc_copyStruct.m +++ b/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) diff --git a/clang/test/CodeGenObjC/property-atomic-bool.m b/clang/test/CodeGenObjC/property-atomic-bool.m --- a/clang/test/CodeGenObjC/property-atomic-bool.m +++ b/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 diff --git a/clang/test/CodeGenObjCXX/property-object-reference-1.mm b/clang/test/CodeGenObjCXX/property-object-reference-1.mm --- a/clang/test/CodeGenObjCXX/property-object-reference-1.mm +++ b/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]]) diff --git a/llvm/test/CodeGen/X86/x86-64-arg.ll b/llvm/test/CodeGen/X86/x86-64-arg.ll --- a/llvm/test/CodeGen/X86/x86-64-arg.ll +++ b/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; }