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
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits