Recommit changes to global checks (#71171)

Recommits the changes from https://reviews.llvm.org/D148216.
Explicitly named globals are now matched literally, instead of emitting
a capture group for the name. This resolves #70047.
Metadata and annotations, on the other hand, are captured and matched
against by default, since their identifiers are not stable.

The reasons for revert (#63746) have been fixed:
The first issue, that of duplicated checkers, has already been resolved
in #70050.
This PR resolves the second issue listed in #63746, regarding the order
of named and unnamed globals. This is fixed by recording the index of
substrings containing global values, and sorting the checks according to
that index before emitting them. This results in global value checks
being emitted in the order they were seen instead of being grouped
separately.
This commit is contained in:
Henrik G. Olsson 2023-11-13 14:45:27 +01:00 committed by GitHub
parent 81330286f1
commit e6eda66cbc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 1288 additions and 105 deletions

View File

@ -0,0 +1,6 @@
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=zero %s -emit-llvm -o - | FileCheck %s
int foo() {
int x = x + 1;
return x;
}

View File

@ -0,0 +1,21 @@
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=zero %s -emit-llvm -o - | FileCheck %s
// CHECK-LABEL: define dso_local i32 @foo(
// CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
// CHECK-NEXT: entry:
// CHECK-NEXT: [[X:%.*]] = alloca i32, align 4
// CHECK-NEXT: store i32 0, ptr [[X]], align 4, !annotation [[META2:![0-9]+]]
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[X]], align 4
// CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP0]], 1
// CHECK-NEXT: store i32 [[ADD]], ptr [[X]], align 4
// CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[X]], align 4
// CHECK-NEXT: ret i32 [[TMP1]]
//
int foo() {
int x = x + 1;
return x;
}
//.
// CHECK: [[META2]] = !{!"auto-init"}
//.

View File

@ -0,0 +1,258 @@
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals --include-generated-funcs
// Check that the CHECK lines are generated for clang-generated functions
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fopenmp %s -emit-llvm -o - | FileCheck --check-prefix=OMP %s
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu %s -emit-llvm -o - | FileCheck --check-prefix=NOOMP %s
const int size = 1024 * 1024 * 32;
double A[size];
void foo(void);
int main(void) {
int i = 0;
#pragma omp parallel for
for (i = 0; i < size; ++i) {
A[i] = 0.0;
}
foo();
return 0;
}
void foo(void) {
int i = 0;
#pragma omp parallel for
for (i = 0; i < size; ++i) {
A[i] = 1.0;
}
}
//.
// OMP: @A = global [33554432 x double] zeroinitializer, align 16
// OMP: @size = constant i32 33554432, align 4
// OMP: @[[GLOB0:[0-9]+]] = private unnamed_addr constant [23 x i8] c"
// OMP: @[[GLOB1:[0-9]+]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 514, i32 0, i32 22, ptr @[[GLOB0]] }, align 8
// OMP: @[[GLOB2:[0-9]+]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 22, ptr @[[GLOB0]] }, align 8
//.
// NOOMP: @size = constant i32 33554432, align 4
// NOOMP: @A = global [33554432 x double] zeroinitializer, align 16
//.
// OMP-LABEL: @main(
// OMP-NEXT: entry:
// OMP-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
// OMP-NEXT: [[I:%.*]] = alloca i32, align 4
// OMP-NEXT: store i32 0, ptr [[RETVAL]], align 4
// OMP-NEXT: store i32 0, ptr [[I]], align 4
// OMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 0, ptr @main.omp_outlined)
// OMP-NEXT: call void @foo()
// OMP-NEXT: ret i32 0
//
//
// OMP-LABEL: @main.omp_outlined(
// OMP-NEXT: entry:
// OMP-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
// OMP-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
// OMP-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
// OMP-NEXT: [[TMP:%.*]] = alloca i32, align 4
// OMP-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
// OMP-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
// OMP-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
// OMP-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
// OMP-NEXT: [[I:%.*]] = alloca i32, align 4
// OMP-NEXT: store ptr [[DOTGLOBAL_TID_:%.*]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
// OMP-NEXT: store ptr [[DOTBOUND_TID_:%.*]], ptr [[DOTBOUND_TID__ADDR]], align 8
// OMP-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
// OMP-NEXT: store i32 33554431, ptr [[DOTOMP_UB]], align 4
// OMP-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
// OMP-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
// OMP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
// OMP-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
// OMP-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
// OMP-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
// OMP-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 33554431
// OMP-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
// OMP: cond.true:
// OMP-NEXT: br label [[COND_END:%.*]]
// OMP: cond.false:
// OMP-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
// OMP-NEXT: br label [[COND_END]]
// OMP: cond.end:
// OMP-NEXT: [[COND:%.*]] = phi i32 [ 33554431, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
// OMP-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
// OMP-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
// OMP-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
// OMP-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
// OMP: omp.inner.for.cond:
// OMP-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
// OMP-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
// OMP-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
// OMP-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
// OMP: omp.inner.for.body:
// OMP-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
// OMP-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
// OMP-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
// OMP-NEXT: store i32 [[ADD]], ptr [[I]], align 4
// OMP-NEXT: [[TMP8:%.*]] = load i32, ptr [[I]], align 4
// OMP-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP8]] to i64
// OMP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [33554432 x double], ptr @A, i64 0, i64 [[IDXPROM]]
// OMP-NEXT: store double 0.000000e+00, ptr [[ARRAYIDX]], align 8
// OMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
// OMP: omp.body.continue:
// OMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
// OMP: omp.inner.for.inc:
// OMP-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
// OMP-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP9]], 1
// OMP-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4
// OMP-NEXT: br label [[OMP_INNER_FOR_COND]]
// OMP: omp.inner.for.end:
// OMP-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
// OMP: omp.loop.exit:
// OMP-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
// OMP-NEXT: ret void
//
//
// OMP-LABEL: @foo(
// OMP-NEXT: entry:
// OMP-NEXT: [[I:%.*]] = alloca i32, align 4
// OMP-NEXT: store i32 0, ptr [[I]], align 4
// OMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 0, ptr @foo.omp_outlined)
// OMP-NEXT: ret void
//
//
// OMP-LABEL: @foo.omp_outlined(
// OMP-NEXT: entry:
// OMP-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
// OMP-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
// OMP-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4
// OMP-NEXT: [[TMP:%.*]] = alloca i32, align 4
// OMP-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
// OMP-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
// OMP-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
// OMP-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
// OMP-NEXT: [[I:%.*]] = alloca i32, align 4
// OMP-NEXT: store ptr [[DOTGLOBAL_TID_:%.*]], ptr [[DOTGLOBAL_TID__ADDR]], align 8
// OMP-NEXT: store ptr [[DOTBOUND_TID_:%.*]], ptr [[DOTBOUND_TID__ADDR]], align 8
// OMP-NEXT: store i32 0, ptr [[DOTOMP_LB]], align 4
// OMP-NEXT: store i32 33554431, ptr [[DOTOMP_UB]], align 4
// OMP-NEXT: store i32 1, ptr [[DOTOMP_STRIDE]], align 4
// OMP-NEXT: store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
// OMP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8
// OMP-NEXT: [[TMP1:%.*]] = load i32, ptr [[TMP0]], align 4
// OMP-NEXT: call void @__kmpc_for_static_init_4(ptr @[[GLOB1]], i32 [[TMP1]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i32 1, i32 1)
// OMP-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
// OMP-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP2]], 33554431
// OMP-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
// OMP: cond.true:
// OMP-NEXT: br label [[COND_END:%.*]]
// OMP: cond.false:
// OMP-NEXT: [[TMP3:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
// OMP-NEXT: br label [[COND_END]]
// OMP: cond.end:
// OMP-NEXT: [[COND:%.*]] = phi i32 [ 33554431, [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]
// OMP-NEXT: store i32 [[COND]], ptr [[DOTOMP_UB]], align 4
// OMP-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTOMP_LB]], align 4
// OMP-NEXT: store i32 [[TMP4]], ptr [[DOTOMP_IV]], align 4
// OMP-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
// OMP: omp.inner.for.cond:
// OMP-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
// OMP-NEXT: [[TMP6:%.*]] = load i32, ptr [[DOTOMP_UB]], align 4
// OMP-NEXT: [[CMP1:%.*]] = icmp sle i32 [[TMP5]], [[TMP6]]
// OMP-NEXT: br i1 [[CMP1]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]]
// OMP: omp.inner.for.body:
// OMP-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
// OMP-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP7]], 1
// OMP-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]]
// OMP-NEXT: store i32 [[ADD]], ptr [[I]], align 4
// OMP-NEXT: [[TMP8:%.*]] = load i32, ptr [[I]], align 4
// OMP-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP8]] to i64
// OMP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [33554432 x double], ptr @A, i64 0, i64 [[IDXPROM]]
// OMP-NEXT: store double 1.000000e+00, ptr [[ARRAYIDX]], align 8
// OMP-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
// OMP: omp.body.continue:
// OMP-NEXT: br label [[OMP_INNER_FOR_INC:%.*]]
// OMP: omp.inner.for.inc:
// OMP-NEXT: [[TMP9:%.*]] = load i32, ptr [[DOTOMP_IV]], align 4
// OMP-NEXT: [[ADD2:%.*]] = add nsw i32 [[TMP9]], 1
// OMP-NEXT: store i32 [[ADD2]], ptr [[DOTOMP_IV]], align 4
// OMP-NEXT: br label [[OMP_INNER_FOR_COND]]
// OMP: omp.inner.for.end:
// OMP-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
// OMP: omp.loop.exit:
// OMP-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[TMP1]])
// OMP-NEXT: ret void
//
//
// NOOMP-LABEL: @main(
// NOOMP-NEXT: entry:
// NOOMP-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
// NOOMP-NEXT: [[I:%.*]] = alloca i32, align 4
// NOOMP-NEXT: store i32 0, ptr [[RETVAL]], align 4
// NOOMP-NEXT: store i32 0, ptr [[I]], align 4
// NOOMP-NEXT: store i32 0, ptr [[I]], align 4
// NOOMP-NEXT: br label [[FOR_COND:%.*]]
// NOOMP: for.cond:
// NOOMP-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4
// NOOMP-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], 33554432
// NOOMP-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
// NOOMP: for.body:
// NOOMP-NEXT: [[TMP1:%.*]] = load i32, ptr [[I]], align 4
// NOOMP-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP1]] to i64
// NOOMP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [33554432 x double], ptr @A, i64 0, i64 [[IDXPROM]]
// NOOMP-NEXT: store double 0.000000e+00, ptr [[ARRAYIDX]], align 8
// NOOMP-NEXT: br label [[FOR_INC:%.*]]
// NOOMP: for.inc:
// NOOMP-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
// NOOMP-NEXT: [[INC:%.*]] = add nsw i32 [[TMP2]], 1
// NOOMP-NEXT: store i32 [[INC]], ptr [[I]], align 4
// NOOMP-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP2:![0-9]+]]
// NOOMP: for.end:
// NOOMP-NEXT: call void @foo()
// NOOMP-NEXT: ret i32 0
//
//
// NOOMP-LABEL: @foo(
// NOOMP-NEXT: entry:
// NOOMP-NEXT: [[I:%.*]] = alloca i32, align 4
// NOOMP-NEXT: store i32 0, ptr [[I]], align 4
// NOOMP-NEXT: store i32 0, ptr [[I]], align 4
// NOOMP-NEXT: br label [[FOR_COND:%.*]]
// NOOMP: for.cond:
// NOOMP-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4
// NOOMP-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], 33554432
// NOOMP-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
// NOOMP: for.body:
// NOOMP-NEXT: [[TMP1:%.*]] = load i32, ptr [[I]], align 4
// NOOMP-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP1]] to i64
// NOOMP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [33554432 x double], ptr @A, i64 0, i64 [[IDXPROM]]
// NOOMP-NEXT: store double 1.000000e+00, ptr [[ARRAYIDX]], align 8
// NOOMP-NEXT: br label [[FOR_INC:%.*]]
// NOOMP: for.inc:
// NOOMP-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
// NOOMP-NEXT: [[INC:%.*]] = add nsw i32 [[TMP2]], 1
// NOOMP-NEXT: store i32 [[INC]], ptr [[I]], align 4
// NOOMP-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]
// NOOMP: for.end:
// NOOMP-NEXT: ret void
//
//.
// OMP: attributes #[[ATTR0:[0-9]+]] = { noinline nounwind optnone "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
// OMP: attributes #[[ATTR1:[0-9]+]] = { noinline norecurse nounwind optnone "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
// OMP: attributes #[[ATTR2:[0-9]+]] = { nounwind }
//.
// NOOMP: attributes #[[ATTR0:[0-9]+]] = { noinline nounwind optnone "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
//.
// OMP: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
// OMP: [[META1:![0-9]+]] = !{i32 7, !"openmp", i32 51}
// OMP: [[META2:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}
// OMP: [[META3:![0-9]+]] = !{[[META4:![0-9]+]]}
// OMP: [[META4]] = !{i64 2, i64 -1, i64 -1, i1 true}
//.
// NOOMP: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
// NOOMP: [[META1:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}
// NOOMP: [[LOOP2]] = distinct !{[[LOOP2]], [[META3:![0-9]+]]}
// NOOMP: [[META3]] = !{!"llvm.loop.mustprogress"}
// NOOMP: [[LOOP4]] = distinct !{[[LOOP4]], [[META3]]}
//.

View File

@ -1,4 +1,4 @@
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals smart --include-generated-funcs
// Check that the CHECK lines are generated for clang-generated functions
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fopenmp %s -emit-llvm -o - | FileCheck --check-prefix=OMP %s
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu %s -emit-llvm -o - | FileCheck --check-prefix=NOOMP %s
@ -227,3 +227,8 @@ void foo(void) {
// NOOMP: for.end:
// NOOMP-NEXT: ret void
//
//.
// NOOMP: [[LOOP2]] = distinct !{[[LOOP2]], [[META3:![0-9]+]]}
// NOOMP: [[META3]] = !{!"llvm.loop.mustprogress"}
// NOOMP: [[LOOP4]] = distinct !{[[LOOP4]], [[META3]]}
//.

View File

@ -0,0 +1,129 @@
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals
// Check that the CHECK lines are generated for clang-generated functions
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fopenmp %s -emit-llvm -o - | FileCheck --check-prefix=OMP %s
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu %s -emit-llvm -o - | FileCheck --check-prefix=NOOMP %s
const int size = 1024 * 1024 * 32;
double A[size];
void foo(void);
//.
// OMP: @A = global [33554432 x double] zeroinitializer, align 16
// OMP: @size = constant i32 33554432, align 4
// OMP: @[[GLOB0:[0-9]+]] = private unnamed_addr constant [23 x i8] c"
// OMP: @[[GLOB1:[0-9]+]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 514, i32 0, i32 22, ptr @[[GLOB0]] }, align 8
// OMP: @[[GLOB2:[0-9]+]] = private unnamed_addr constant %struct.ident_t { i32 0, i32 2, i32 0, i32 22, ptr @[[GLOB0]] }, align 8
//.
// NOOMP: @size = constant i32 33554432, align 4
// NOOMP: @A = global [33554432 x double] zeroinitializer, align 16
//.
// OMP-LABEL: @main(
// OMP-NEXT: entry:
// OMP-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
// OMP-NEXT: [[I:%.*]] = alloca i32, align 4
// OMP-NEXT: store i32 0, ptr [[RETVAL]], align 4
// OMP-NEXT: store i32 0, ptr [[I]], align 4
// OMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 0, ptr @main.omp_outlined)
// OMP-NEXT: call void @foo()
// OMP-NEXT: ret i32 0
//
// NOOMP-LABEL: @main(
// NOOMP-NEXT: entry:
// NOOMP-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
// NOOMP-NEXT: [[I:%.*]] = alloca i32, align 4
// NOOMP-NEXT: store i32 0, ptr [[RETVAL]], align 4
// NOOMP-NEXT: store i32 0, ptr [[I]], align 4
// NOOMP-NEXT: store i32 0, ptr [[I]], align 4
// NOOMP-NEXT: br label [[FOR_COND:%.*]]
// NOOMP: for.cond:
// NOOMP-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4
// NOOMP-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], 33554432
// NOOMP-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
// NOOMP: for.body:
// NOOMP-NEXT: [[TMP1:%.*]] = load i32, ptr [[I]], align 4
// NOOMP-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP1]] to i64
// NOOMP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [33554432 x double], ptr @A, i64 0, i64 [[IDXPROM]]
// NOOMP-NEXT: store double 0.000000e+00, ptr [[ARRAYIDX]], align 8
// NOOMP-NEXT: br label [[FOR_INC:%.*]]
// NOOMP: for.inc:
// NOOMP-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
// NOOMP-NEXT: [[INC:%.*]] = add nsw i32 [[TMP2]], 1
// NOOMP-NEXT: store i32 [[INC]], ptr [[I]], align 4
// NOOMP-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP2:![0-9]+]]
// NOOMP: for.end:
// NOOMP-NEXT: call void @foo()
// NOOMP-NEXT: ret i32 0
//
int main(void) {
int i = 0;
#pragma omp parallel for
for (i = 0; i < size; ++i) {
A[i] = 0.0;
}
foo();
return 0;
}
// OMP-LABEL: @foo(
// OMP-NEXT: entry:
// OMP-NEXT: [[I:%.*]] = alloca i32, align 4
// OMP-NEXT: store i32 0, ptr [[I]], align 4
// OMP-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @[[GLOB2]], i32 0, ptr @foo.omp_outlined)
// OMP-NEXT: ret void
//
// NOOMP-LABEL: @foo(
// NOOMP-NEXT: entry:
// NOOMP-NEXT: [[I:%.*]] = alloca i32, align 4
// NOOMP-NEXT: store i32 0, ptr [[I]], align 4
// NOOMP-NEXT: store i32 0, ptr [[I]], align 4
// NOOMP-NEXT: br label [[FOR_COND:%.*]]
// NOOMP: for.cond:
// NOOMP-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4
// NOOMP-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], 33554432
// NOOMP-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
// NOOMP: for.body:
// NOOMP-NEXT: [[TMP1:%.*]] = load i32, ptr [[I]], align 4
// NOOMP-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP1]] to i64
// NOOMP-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [33554432 x double], ptr @A, i64 0, i64 [[IDXPROM]]
// NOOMP-NEXT: store double 1.000000e+00, ptr [[ARRAYIDX]], align 8
// NOOMP-NEXT: br label [[FOR_INC:%.*]]
// NOOMP: for.inc:
// NOOMP-NEXT: [[TMP2:%.*]] = load i32, ptr [[I]], align 4
// NOOMP-NEXT: [[INC:%.*]] = add nsw i32 [[TMP2]], 1
// NOOMP-NEXT: store i32 [[INC]], ptr [[I]], align 4
// NOOMP-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP4:![0-9]+]]
// NOOMP: for.end:
// NOOMP-NEXT: ret void
//
void foo(void) {
int i = 0;
#pragma omp parallel for
for (i = 0; i < size; ++i) {
A[i] = 1.0;
}
}
//.
// OMP: attributes #[[ATTR0:[0-9]+]] = { noinline nounwind optnone "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
// OMP: attributes #[[ATTR1:[0-9]+]] = { noinline norecurse nounwind optnone "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
// OMP: attributes #[[ATTR2:[0-9]+]] = { nounwind }
//.
// NOOMP: attributes #[[ATTR0:[0-9]+]] = { noinline nounwind optnone "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
//.
// OMP: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
// OMP: [[META1:![0-9]+]] = !{i32 7, !"openmp", i32 51}
// OMP: [[META2:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}
// OMP: [[META3:![0-9]+]] = !{[[META4:![0-9]+]]}
// OMP: [[META4]] = !{i64 2, i64 -1, i64 -1, i1 true}
//.
// NOOMP: [[META0:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
// NOOMP: [[META1:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}
// NOOMP: [[LOOP2]] = distinct !{[[LOOP2]], [[META3:![0-9]+]]}
// NOOMP: [[META3]] = !{!"llvm.loop.mustprogress"}
// NOOMP: [[LOOP4]] = distinct !{[[LOOP4]], [[META3]]}
//.

View File

@ -1,4 +1,4 @@
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --check-globals smart
// Check that the CHECK lines are generated for clang-generated functions
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fopenmp %s -emit-llvm -o - | FileCheck --check-prefix=OMP %s
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu %s -emit-llvm -o - | FileCheck --check-prefix=NOOMP %s
@ -98,3 +98,8 @@ void foo(void) {
A[i] = 1.0;
}
}
//.
// NOOMP: [[LOOP2]] = distinct !{[[LOOP2]], [[META3:![0-9]+]]}
// NOOMP: [[META3]] = !{!"llvm.loop.mustprogress"}
// NOOMP: [[LOOP4]] = distinct !{[[LOOP4]], [[META3]]}
//.

View File

@ -0,0 +1,4 @@
## Test that !annotation metadata is matched correctly
# RUN: cp %S/Inputs/annotations.c %t.c && %update_cc_test_checks --version 4 %t.c
# RUN: diff -u %S/Inputs/annotations.c.expected %t.c

View File

@ -1,26 +1,26 @@
RUN: rm -rf %t && mkdir %t
# Check --check-globals in normal mode and in --include-generated-funcs mode.
# Check --check-globals all in normal mode and in --include-generated-funcs mode.
RUN: cp %S/Inputs/check-globals.c %t/norm.c
RUN: %update_cc_test_checks %t/norm.c --check-globals
RUN: %update_cc_test_checks %t/norm.c --check-globals all
RUN: FileCheck %s --input-file=%t/norm.c --match-full-lines -strict-whitespace \
RUN: -check-prefixes=BOTH,NRM
RUN: cp %S/Inputs/check-globals.c %t/igf.c
RUN: %update_cc_test_checks %t/igf.c --check-globals --include-generated-funcs
RUN: %update_cc_test_checks %t/igf.c --check-globals all --include-generated-funcs
RUN: FileCheck %s --input-file=%t/igf.c --match-full-lines -strict-whitespace \
RUN: -check-prefixes=BOTH,IGF
# Check that repeating doesn't change it, such as duplicating '//.' occurrences.
RUN: cp %t/norm.c %t/norm-again.c
RUN: %update_cc_test_checks %t/norm-again.c --check-globals
RUN: %update_cc_test_checks %t/norm-again.c --check-globals all
RUN: diff -u %t/norm.c %t/norm-again.c
RUN: rm %t/norm-again.c
RUN: cp %t/igf.c %t/igf-again.c
RUN: %update_cc_test_checks %t/igf-again.c --check-globals \
RUN: %update_cc_test_checks %t/igf-again.c --check-globals all \
RUN: --include-generated-funcs
RUN: diff -u %t/igf.c %t/igf-again.c
RUN: rm %t/igf-again.c
@ -74,8 +74,8 @@ BOTH-EMPTY:
BOTH-NEXT://.
BOTH-NEXT:// CHECK: attributes {{.*}}
BOTH-NEXT://.
BOTH-NEXT:// CHECK: !0 = {{.*}}
BOTH-NEXT:// CHECK: !1 = {{.*}}
BOTH-NEXT:// CHECK: {{\[\[META0:!\[0-9\]\+\]\]}} = {{.*}}
BOTH-NEXT:// CHECK: {{\[\[META1:!\[0-9\]\+\]\]}} = {{.*}}
BOTH-NEXT://.
BOTH-NOT:{{.}}

View File

@ -1,8 +1,8 @@
## Test that CHECK lines are generated for clang-generated functions
# RUN: cp %S/Inputs/generated-funcs.c %t-generated.c && %update_cc_test_checks --include-generated-funcs %t-generated.c
# RUN: cp %S/Inputs/generated-funcs.c %t-generated.c && %update_cc_test_checks --include-generated-funcs --check-globals smart %t-generated.c
# RUN: diff -u %S/Inputs/generated-funcs.c.generated.expected %t-generated.c
# RUN: cp %S/Inputs/generated-funcs.c %t-no-generated.c && %update_cc_test_checks %t-no-generated.c
# RUN: cp %S/Inputs/generated-funcs.c %t-no-generated.c && %update_cc_test_checks --check-globals smart %t-no-generated.c
# RUN: diff -u %S/Inputs/generated-funcs.c.no-generated.expected %t-no-generated.c
## Check that re-running update_cc_test_checks doesn't change the output
@ -10,3 +10,15 @@
# RUN: diff -u %S/Inputs/generated-funcs.c.generated.expected %t-generated.c
# RUN: %update_cc_test_checks %t-no-generated.c
# RUN: diff -u %S/Inputs/generated-funcs.c.no-generated.expected %t-no-generated.c
## Same as above for --check-globals all
# RUN: cp %S/Inputs/generated-funcs.c %t-generated.c && %update_cc_test_checks --include-generated-funcs --check-globals all %t-generated.c
# RUN: diff -u %S/Inputs/generated-funcs.c.generated.all.expected %t-generated.c
# RUN: cp %S/Inputs/generated-funcs.c %t-no-generated.c && %update_cc_test_checks --check-globals all %t-no-generated.c
# RUN: diff -u %S/Inputs/generated-funcs.c.no-generated.all.expected %t-no-generated.c
## Check that re-running update_cc_test_checks doesn't change the output
# RUN: %update_cc_test_checks --include-generated-funcs %t-generated.c
# RUN: diff -u %S/Inputs/generated-funcs.c.generated.all.expected %t-generated.c
# RUN: %update_cc_test_checks %t-no-generated.c
# RUN: diff -u %S/Inputs/generated-funcs.c.no-generated.all.expected %t-no-generated.c

View File

@ -36,7 +36,7 @@ exit:
declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write)
declare void @_Z10sideeffectv()
;.
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external dso_local global i32, align 4
; CHECK: @G = external dso_local global i32, align 4
;.
; CHECK-LABEL: @foo(
; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0

View File

@ -6,7 +6,7 @@ target triple = "x86_64-apple-macosx10.14.0"
@G = external dso_local global i32, align 4
;.
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external dso_local global i32, align 4
; CHECK: @G = external dso_local global i32, align 4
;.
define void @foo(i32) {
; CHECK-LABEL: @foo(

View File

@ -37,7 +37,7 @@ exit:
declare void @llvm.trap() noreturn cold memory(inaccessiblemem: write)
declare void @_Z10sideeffectv()
;.
; REUSE: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external dso_local global i32, align 4
; REUSE: @G = external dso_local global i32, align 4
;.
; REUSE-LABEL: @foo(
; REUSE-NEXT: [[TMP2:%.*]] = icmp eq i32 [[TMP0:%.*]], 0

View File

@ -7,7 +7,7 @@ target triple = "x86_64-apple-macosx10.14.0"
@G = external dso_local global i32, align 4
;.
; REUSE: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external dso_local global i32, align 4
; REUSE: @G = external dso_local global i32, align 4
;.
define void @foo(i32) {
; REUSE-LABEL: @foo(

View File

@ -6,7 +6,7 @@
@Baz = global i32 2
;.
; CHECK: @[[ONLYFOO:[a-zA-Z0-9_$"\\.-]+]] = global i32 1
; CHECK: @OnlyFoo = global i32 1
;.
define i32 @t() {
; CHECK-LABEL: @t(

View File

@ -250,67 +250,67 @@ attributes #3 = { nounwind }
; CHECK: attributes #[[ATTR2:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
; CHECK: attributes #[[ATTR3]] = { nounwind }
;.
; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 11.0.0 (git@github.com:llvm/llvm-project.git 1d5da8cd30fce1c0a2c2fa6ba656dbfaa36192c8)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None)
; CHECK: [[META1:![0-9]+]] = !DIFile(filename: "various_ir_values.c", directory: "/data/build/llvm-project")
; CHECK: [[META2:![0-9]+]] = !{}
; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C99, file: [[META1:![0-9]+]], producer: "{{.*}}clang version {{.*}}", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: [[META2:![0-9]+]], splitDebugInlining: false, nameTableKind: None)
; CHECK: [[META1]] = !DIFile(filename: "various_ir_values.c", directory: {{.*}})
; CHECK: [[META2]] = !{}
; CHECK: [[META3:![0-9]+]] = !{i32 7, !"Dwarf Version", i32 4}
; CHECK: [[META4:![0-9]+]] = !{i32 2, !"Debug Info Version", i32 3}
; CHECK: [[META5:![0-9]+]] = !{i32 1, !"wchar_size", i32 4}
; CHECK: [[META6:![0-9]+]] = !{!"clang version 11.0.0 (git@github.com:llvm/llvm-project.git 1d5da8cd30fce1c0a2c2fa6ba656dbfaa36192c8)"}
; CHECK: [[DBG7]] = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)
; CHECK: [[META8:![0-9]+]] = !DISubroutineType(types: !9)
; CHECK: [[META9:![0-9]+]] = !{null, !10}
; CHECK: [[META10:![0-9]+]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !11, size: 64)
; CHECK: [[META11:![0-9]+]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
; CHECK: [[META12:![0-9]+]] = !{!13, !14}
; CHECK: [[META13]] = !DILocalVariable(name: "A", arg: 1, scope: !7, file: !1, line: 1, type: !10)
; CHECK: [[META14]] = !DILocalVariable(name: "i", scope: !15, file: !1, line: 3, type: !11)
; CHECK: [[META15:![0-9]+]] = distinct !DILexicalBlock(scope: !7, file: !1, line: 3, column: 3)
; CHECK: [[META6:![0-9]+]] = !{!"{{.*}}clang version {{.*}}"}
; CHECK: [[DBG7]] = distinct !DISubprogram(name: "foo", scope: [[META1]], file: [[META1]], line: 1, type: [[META8:![0-9]+]], scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META12:![0-9]+]])
; CHECK: [[META8]] = !DISubroutineType(types: [[META9:![0-9]+]])
; CHECK: [[META9]] = !{null, [[META10:![0-9]+]]}
; CHECK: [[META10]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[META11:![0-9]+]], size: 64)
; CHECK: [[META11]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
; CHECK: [[META12]] = !{[[META13]], [[META14]]}
; CHECK: [[META13]] = !DILocalVariable(name: "A", arg: 1, scope: [[DBG7]], file: [[META1]], line: 1, type: [[META10]])
; CHECK: [[META14]] = !DILocalVariable(name: "i", scope: [[META15:![0-9]+]], file: [[META1]], line: 3, type: [[META11]])
; CHECK: [[META15]] = distinct !DILexicalBlock(scope: [[DBG7]], file: [[META1]], line: 3, column: 3)
; CHECK: [[DIASSIGNID16]] = distinct !DIAssignID()
; CHECK: [[DBG17]] = !DILocation(line: 1, column: 15, scope: !7)
; CHECK: [[TBAA18]] = !{!19, !19, i64 0}
; CHECK: [[META19:![0-9]+]] = !{!"any pointer", !20, i64 0}
; CHECK: [[META20:![0-9]+]] = !{!"omnipotent char", !21, i64 0}
; CHECK: [[META21:![0-9]+]] = !{!"Simple C/C++ TBAA"}
; CHECK: [[DBG22]] = !DILocation(line: 3, column: 8, scope: !15)
; CHECK: [[DBG23]] = !DILocation(line: 3, column: 12, scope: !15)
; CHECK: [[TBAA24]] = !{!25, !25, i64 0}
; CHECK: [[META25:![0-9]+]] = !{!"int", !20, i64 0}
; CHECK: [[DBG26]] = !DILocation(line: 3, column: 19, scope: !27)
; CHECK: [[META27:![0-9]+]] = distinct !DILexicalBlock(scope: !15, file: !1, line: 3, column: 3)
; CHECK: [[DBG28]] = !DILocation(line: 3, column: 24, scope: !27)
; CHECK: [[DBG29]] = !DILocation(line: 3, column: 23, scope: !27)
; CHECK: [[DBG30]] = !DILocation(line: 3, column: 21, scope: !27)
; CHECK: [[DBG31]] = !DILocation(line: 3, column: 3, scope: !15)
; CHECK: [[DBG17]] = !DILocation(line: 1, column: 15, scope: [[DBG7]])
; CHECK: [[TBAA18]] = !{[[META19:![0-9]+]], [[META19]], i64 0}
; CHECK: [[META19]] = !{!"any pointer", [[META20:![0-9]+]], i64 0}
; CHECK: [[META20]] = !{!"omnipotent char", [[META21:![0-9]+]], i64 0}
; CHECK: [[META21]] = !{!"Simple C/C++ TBAA"}
; CHECK: [[DBG22]] = !DILocation(line: 3, column: 8, scope: [[META15]])
; CHECK: [[DBG23]] = !DILocation(line: 3, column: 12, scope: [[META15]])
; CHECK: [[TBAA24]] = !{[[META25:![0-9]+]], [[META25]], i64 0}
; CHECK: [[META25]] = !{!"int", [[META20]], i64 0}
; CHECK: [[DBG26]] = !DILocation(line: 3, column: 19, scope: [[META27:![0-9]+]])
; CHECK: [[META27]] = distinct !DILexicalBlock(scope: [[META15]], file: [[META1]], line: 3, column: 3)
; CHECK: [[DBG28]] = !DILocation(line: 3, column: 24, scope: [[META27]])
; CHECK: [[DBG29]] = !DILocation(line: 3, column: 23, scope: [[META27]])
; CHECK: [[DBG30]] = !DILocation(line: 3, column: 21, scope: [[META27]])
; CHECK: [[DBG31]] = !DILocation(line: 3, column: 3, scope: [[META15]])
; CHECK: [[PROF32]] = !{!"branch_weights", i32 1, i32 1048575}
; CHECK: [[DBG33]] = !DILocation(line: 3, column: 3, scope: !27)
; CHECK: [[DBG34]] = !DILocation(line: 4, column: 5, scope: !27)
; CHECK: [[DBG35]] = !DILocation(line: 4, column: 7, scope: !27)
; CHECK: [[DBG36]] = !DILocation(line: 4, column: 10, scope: !27)
; CHECK: [[DBG37]] = !DILocation(line: 3, column: 27, scope: !27)
; CHECK: [[LOOP38]] = distinct !{!38, !31, !39}
; CHECK: [[META39:![0-9]+]] = !DILocation(line: 4, column: 12, scope: !15)
; CHECK: [[DBG40]] = !DILocation(line: 5, column: 1, scope: !7)
; CHECK: [[DBG41]] = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 7, type: !8, scopeLine: 7, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !42)
; CHECK: [[META42:![0-9]+]] = !{!43, !44}
; CHECK: [[META43]] = !DILocalVariable(name: "A", arg: 1, scope: !41, file: !1, line: 7, type: !10)
; CHECK: [[META44]] = !DILocalVariable(name: "i", scope: !45, file: !1, line: 9, type: !11)
; CHECK: [[META45:![0-9]+]] = distinct !DILexicalBlock(scope: !41, file: !1, line: 9, column: 3)
; CHECK: [[DBG46]] = !DILocation(line: 7, column: 15, scope: !41)
; CHECK: [[DBG47]] = !DILocation(line: 9, column: 8, scope: !45)
; CHECK: [[DBG48]] = !DILocation(line: 9, column: 12, scope: !45)
; CHECK: [[DBG49]] = !DILocation(line: 9, column: 19, scope: !50)
; CHECK: [[META50:![0-9]+]] = distinct !DILexicalBlock(scope: !45, file: !1, line: 9, column: 3)
; CHECK: [[DBG51]] = !DILocation(line: 9, column: 24, scope: !50)
; CHECK: [[DBG52]] = !DILocation(line: 9, column: 23, scope: !50)
; CHECK: [[DBG53]] = !DILocation(line: 9, column: 21, scope: !50)
; CHECK: [[DBG54]] = !DILocation(line: 9, column: 3, scope: !45)
; CHECK: [[DBG55]] = !DILocation(line: 9, column: 3, scope: !50)
; CHECK: [[DBG56]] = !DILocation(line: 10, column: 5, scope: !50)
; CHECK: [[DBG57]] = !DILocation(line: 10, column: 7, scope: !50)
; CHECK: [[DBG58]] = !DILocation(line: 10, column: 10, scope: !50)
; CHECK: [[DBG59]] = !DILocation(line: 9, column: 27, scope: !50)
; CHECK: [[LOOP60]] = distinct !{!60, !54, !61}
; CHECK: [[META61:![0-9]+]] = !DILocation(line: 10, column: 12, scope: !45)
; CHECK: [[DBG62]] = !DILocation(line: 11, column: 1, scope: !41)
; CHECK: [[DBG33]] = !DILocation(line: 3, column: 3, scope: [[META27]])
; CHECK: [[DBG34]] = !DILocation(line: 4, column: 5, scope: [[META27]])
; CHECK: [[DBG35]] = !DILocation(line: 4, column: 7, scope: [[META27]])
; CHECK: [[DBG36]] = !DILocation(line: 4, column: 10, scope: [[META27]])
; CHECK: [[DBG37]] = !DILocation(line: 3, column: 27, scope: [[META27]])
; CHECK: [[LOOP38]] = distinct !{[[LOOP38]], [[DBG31]], [[META39:![0-9]+]]}
; CHECK: [[META39]] = !DILocation(line: 4, column: 12, scope: [[META15]])
; CHECK: [[DBG40]] = !DILocation(line: 5, column: 1, scope: [[DBG7]])
; CHECK: [[DBG41]] = distinct !DISubprogram(name: "bar", scope: [[META1]], file: [[META1]], line: 7, type: [[META8]], scopeLine: 7, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META42:![0-9]+]])
; CHECK: [[META42]] = !{[[META43]], [[META44]]}
; CHECK: [[META43]] = !DILocalVariable(name: "A", arg: 1, scope: [[DBG41]], file: [[META1]], line: 7, type: [[META10]])
; CHECK: [[META44]] = !DILocalVariable(name: "i", scope: [[META45:![0-9]+]], file: [[META1]], line: 9, type: [[META11]])
; CHECK: [[META45]] = distinct !DILexicalBlock(scope: [[DBG41]], file: [[META1]], line: 9, column: 3)
; CHECK: [[DBG46]] = !DILocation(line: 7, column: 15, scope: [[DBG41]])
; CHECK: [[DBG47]] = !DILocation(line: 9, column: 8, scope: [[META45]])
; CHECK: [[DBG48]] = !DILocation(line: 9, column: 12, scope: [[META45]])
; CHECK: [[DBG49]] = !DILocation(line: 9, column: 19, scope: [[META50:![0-9]+]])
; CHECK: [[META50]] = distinct !DILexicalBlock(scope: [[META45]], file: [[META1]], line: 9, column: 3)
; CHECK: [[DBG51]] = !DILocation(line: 9, column: 24, scope: [[META50]])
; CHECK: [[DBG52]] = !DILocation(line: 9, column: 23, scope: [[META50]])
; CHECK: [[DBG53]] = !DILocation(line: 9, column: 21, scope: [[META50]])
; CHECK: [[DBG54]] = !DILocation(line: 9, column: 3, scope: [[META45]])
; CHECK: [[DBG55]] = !DILocation(line: 9, column: 3, scope: [[META50]])
; CHECK: [[DBG56]] = !DILocation(line: 10, column: 5, scope: [[META50]])
; CHECK: [[DBG57]] = !DILocation(line: 10, column: 7, scope: [[META50]])
; CHECK: [[DBG58]] = !DILocation(line: 10, column: 10, scope: [[META50]])
; CHECK: [[DBG59]] = !DILocation(line: 9, column: 27, scope: [[META50]])
; CHECK: [[LOOP60]] = distinct !{[[LOOP60]], [[DBG54]], [[META61:![0-9]+]]}
; CHECK: [[META61]] = !DILocation(line: 10, column: 12, scope: [[META45]])
; CHECK: [[DBG62]] = !DILocation(line: 11, column: 1, scope: [[DBG41]])
;.

View File

@ -0,0 +1,244 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; Just run it through opt, no passes needed.
; RUN: opt < %s -S | FileCheck %s
; ModuleID = 'various_ir_values.c'
source_filename = "various_ir_values.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: nounwind uwtable
define dso_local void @foo(ptr %A) #0 !dbg !7 {
; CHECK-LABEL: @foo(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, !DIAssignID [[DIASSIGNID16:![0-9]+]]
; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4
; CHECK-NEXT: call void @llvm.dbg.assign(metadata i1 undef, metadata [[META13:![0-9]+]], metadata !DIExpression(), metadata [[DIASSIGNID16]], metadata ptr [[A_ADDR]], metadata !DIExpression()), !dbg [[DBG17:![0-9]+]]
; CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA18:![0-9]+]]
; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[A_ADDR]], metadata [[META13]], metadata !DIExpression()), !dbg [[DBG17]]
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3:[0-9]+]], !dbg [[DBG22:![0-9]+]]
; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META14:![0-9]+]], metadata !DIExpression()), !dbg [[DBG23:![0-9]+]]
; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG23]], !tbaa [[TBAA24:![0-9]+]]
; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG22]]
; CHECK: for.cond:
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG26:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG28:![0-9]+]], !tbaa [[TBAA18]]
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG29:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG30:![0-9]+]]
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG31:![0-9]+]], !prof [[PROF32:![0-9]+]]
; CHECK: for.cond.cleanup:
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG33:![0-9]+]]
; CHECK-NEXT: br label [[FOR_END:%.*]]
; CHECK: for.body:
; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG34:![0-9]+]], !tbaa [[TBAA18]]
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG35:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG34]]
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG34]]
; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG36:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG34]]
; CHECK: for.inc:
; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG37:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG37]]
; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG37]], !tbaa [[TBAA24]]
; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG33]], !llvm.loop [[LOOP38:![0-9]+]]
; CHECK: for.end:
; CHECK-NEXT: ret void, !dbg [[DBG40:![0-9]+]]
;
entry:
%A.addr = alloca ptr, align 8, !DIAssignID !62
%i = alloca i32, align 4
call void @llvm.dbg.assign(metadata i1 undef, metadata !13, metadata !DIExpression(), metadata !62, metadata ptr %A.addr, metadata !DIExpression()), !dbg !20
store ptr %A, ptr %A.addr, align 8, !tbaa !16
call void @llvm.dbg.declare(metadata ptr %A.addr, metadata !13, metadata !DIExpression()), !dbg !20
call void @llvm.lifetime.start.p0(i64 4, ptr %i) #3, !dbg !21
call void @llvm.dbg.declare(metadata ptr %i, metadata !14, metadata !DIExpression()), !dbg !22
store i32 0, ptr %i, align 4, !dbg !22, !tbaa !23
br label %for.cond, !dbg !21
for.cond: ; preds = %for.inc, %entry
%0 = load i32, ptr %i, align 4, !dbg !25, !tbaa !23
%1 = load ptr, ptr %A.addr, align 8, !dbg !27, !tbaa !16
%2 = load i32, ptr %1, align 4, !dbg !28, !tbaa !23
%cmp = icmp slt i32 %0, %2, !dbg !29
br i1 %cmp, label %for.body, label %for.cond.cleanup, !dbg !30, !prof !61
for.cond.cleanup: ; preds = %for.cond
call void @llvm.lifetime.end.p0(i64 4, ptr %i) #3, !dbg !31
br label %for.end
for.body: ; preds = %for.cond
%3 = load ptr, ptr %A.addr, align 8, !dbg !32, !tbaa !16
%4 = load i32, ptr %i, align 4, !dbg !33, !tbaa !23
%idxprom = sext i32 %4 to i64, !dbg !32
%arrayidx = getelementptr inbounds i32, ptr %3, i64 %idxprom, !dbg !32
store i32 0, ptr %arrayidx, align 4, !dbg !34, !tbaa !23
br label %for.inc, !dbg !32
for.inc: ; preds = %for.body
%5 = load i32, ptr %i, align 4, !dbg !35, !tbaa !23
%inc = add nsw i32 %5, 1, !dbg !35
store i32 %inc, ptr %i, align 4, !dbg !35, !tbaa !23
br label %for.cond, !dbg !31, !llvm.loop !36
for.end: ; preds = %for.cond.cleanup
ret void, !dbg !38
}
; Function Attrs: nounwind readnone speculatable willreturn
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #2
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #2
; Function Attrs: nounwind uwtable
define dso_local void @bar(ptr %A) #0 !dbg !39 {
; CHECK-LABEL: @bar(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8
; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4
; CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA18]]
; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[A_ADDR]], metadata [[META43:![0-9]+]], metadata !DIExpression()), !dbg [[DBG46:![0-9]+]]
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG47:![0-9]+]]
; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META44:![0-9]+]], metadata !DIExpression()), !dbg [[DBG48:![0-9]+]]
; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG48]], !tbaa [[TBAA24]]
; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG47]]
; CHECK: for.cond:
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG49:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG51:![0-9]+]], !tbaa [[TBAA18]]
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG52:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG53:![0-9]+]]
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG54:![0-9]+]]
; CHECK: for.cond.cleanup:
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG55:![0-9]+]]
; CHECK-NEXT: br label [[FOR_END:%.*]]
; CHECK: for.body:
; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG56:![0-9]+]], !tbaa [[TBAA18]]
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG57:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG56]]
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG56]]
; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG58:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG56]]
; CHECK: for.inc:
; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG59:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG59]]
; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG59]], !tbaa [[TBAA24]]
; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG55]], !llvm.loop [[LOOP60:![0-9]+]]
; CHECK: for.end:
; CHECK-NEXT: ret void, !dbg [[DBG62:![0-9]+]]
;
entry:
%A.addr = alloca ptr, align 8
%i = alloca i32, align 4
store ptr %A, ptr %A.addr, align 8, !tbaa !16
call void @llvm.dbg.declare(metadata ptr %A.addr, metadata !41, metadata !DIExpression()), !dbg !44
call void @llvm.lifetime.start.p0(i64 4, ptr %i) #3, !dbg !45
call void @llvm.dbg.declare(metadata ptr %i, metadata !42, metadata !DIExpression()), !dbg !46
store i32 0, ptr %i, align 4, !dbg !46, !tbaa !23
br label %for.cond, !dbg !45
for.cond: ; preds = %for.inc, %entry
%0 = load i32, ptr %i, align 4, !dbg !47, !tbaa !23
%1 = load ptr, ptr %A.addr, align 8, !dbg !49, !tbaa !16
%2 = load i32, ptr %1, align 4, !dbg !50, !tbaa !23
%cmp = icmp slt i32 %0, %2, !dbg !51
br i1 %cmp, label %for.body, label %for.cond.cleanup, !dbg !52
for.cond.cleanup: ; preds = %for.cond
call void @llvm.lifetime.end.p0(i64 4, ptr %i) #3, !dbg !53
br label %for.end
for.body: ; preds = %for.cond
%3 = load ptr, ptr %A.addr, align 8, !dbg !54, !tbaa !16
%4 = load i32, ptr %i, align 4, !dbg !55, !tbaa !23
%idxprom = sext i32 %4 to i64, !dbg !54
%arrayidx = getelementptr inbounds i32, ptr %3, i64 %idxprom, !dbg !54
store i32 0, ptr %arrayidx, align 4, !dbg !56, !tbaa !23
br label %for.inc, !dbg !54
for.inc: ; preds = %for.body
%5 = load i32, ptr %i, align 4, !dbg !57, !tbaa !23
%inc = add nsw i32 %5, 1, !dbg !57
store i32 %inc, ptr %i, align 4, !dbg !57, !tbaa !23
br label %for.cond, !dbg !53, !llvm.loop !58
for.end: ; preds = %for.cond.cleanup
ret void, !dbg !60
}
declare void @llvm.dbg.assign(metadata, metadata, metadata, metadata, metadata, metadata)
attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "denormal-fp-math"="ieee,ieee" "denormal-fp-math-f32"="ieee,ieee" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind readnone speculatable willreturn }
attributes #2 = { argmemonly nounwind willreturn }
attributes #3 = { nounwind }
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4, !5}
!llvm.ident = !{!6}
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 11.0.0 (git@github.com:llvm/llvm-project.git 1d5da8cd30fce1c0a2c2fa6ba656dbfaa36192c8)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None)
!1 = !DIFile(filename: "various_ir_values.c", directory: "/data/build/llvm-project")
!2 = !{}
!3 = !{i32 7, !"Dwarf Version", i32 4}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = !{i32 1, !"wchar_size", i32 4}
!6 = !{!"clang version 11.0.0 (git@github.com:llvm/llvm-project.git 1d5da8cd30fce1c0a2c2fa6ba656dbfaa36192c8)"}
!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)
!8 = !DISubroutineType(types: !9)
!9 = !{null, !10}
!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !11, size: 64)
!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!12 = !{!13, !14}
!13 = !DILocalVariable(name: "A", arg: 1, scope: !7, file: !1, line: 1, type: !10)
!14 = !DILocalVariable(name: "i", scope: !15, file: !1, line: 3, type: !11)
!15 = distinct !DILexicalBlock(scope: !7, file: !1, line: 3, column: 3)
!16 = !{!17, !17, i64 0}
!17 = !{!"any pointer", !18, i64 0}
!18 = !{!"omnipotent char", !19, i64 0}
!19 = !{!"Simple C/C++ TBAA"}
!20 = !DILocation(line: 1, column: 15, scope: !7)
!21 = !DILocation(line: 3, column: 8, scope: !15)
!22 = !DILocation(line: 3, column: 12, scope: !15)
!23 = !{!24, !24, i64 0}
!24 = !{!"int", !18, i64 0}
!25 = !DILocation(line: 3, column: 19, scope: !26)
!26 = distinct !DILexicalBlock(scope: !15, file: !1, line: 3, column: 3)
!27 = !DILocation(line: 3, column: 24, scope: !26)
!28 = !DILocation(line: 3, column: 23, scope: !26)
!29 = !DILocation(line: 3, column: 21, scope: !26)
!30 = !DILocation(line: 3, column: 3, scope: !15)
!31 = !DILocation(line: 3, column: 3, scope: !26)
!32 = !DILocation(line: 4, column: 5, scope: !26)
!33 = !DILocation(line: 4, column: 7, scope: !26)
!34 = !DILocation(line: 4, column: 10, scope: !26)
!35 = !DILocation(line: 3, column: 27, scope: !26)
!36 = distinct !{!36, !30, !37}
!37 = !DILocation(line: 4, column: 12, scope: !15)
!38 = !DILocation(line: 5, column: 1, scope: !7)
!39 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 7, type: !8, scopeLine: 7, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !40)
!40 = !{!41, !42}
!41 = !DILocalVariable(name: "A", arg: 1, scope: !39, file: !1, line: 7, type: !10)
!42 = !DILocalVariable(name: "i", scope: !43, file: !1, line: 9, type: !11)
!43 = distinct !DILexicalBlock(scope: !39, file: !1, line: 9, column: 3)
!44 = !DILocation(line: 7, column: 15, scope: !39)
!45 = !DILocation(line: 9, column: 8, scope: !43)
!46 = !DILocation(line: 9, column: 12, scope: !43)
!47 = !DILocation(line: 9, column: 19, scope: !48)
!48 = distinct !DILexicalBlock(scope: !43, file: !1, line: 9, column: 3)
!49 = !DILocation(line: 9, column: 24, scope: !48)
!50 = !DILocation(line: 9, column: 23, scope: !48)
!51 = !DILocation(line: 9, column: 21, scope: !48)
!52 = !DILocation(line: 9, column: 3, scope: !43)
!53 = !DILocation(line: 9, column: 3, scope: !48)
!54 = !DILocation(line: 10, column: 5, scope: !48)
!55 = !DILocation(line: 10, column: 7, scope: !48)
!56 = !DILocation(line: 10, column: 10, scope: !48)
!57 = !DILocation(line: 9, column: 27, scope: !48)
!58 = distinct !{!58, !52, !59}
!59 = !DILocation(line: 10, column: 12, scope: !43)
!60 = !DILocation(line: 11, column: 1, scope: !39)
!61 = !{!"branch_weights", i32 1, i32 1048575}
!62 = distinct !DIAssignID()

View File

@ -0,0 +1,305 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals smart
; Just run it through opt, no passes needed.
; RUN: opt < %s -S | FileCheck %s
; ModuleID = 'various_ir_values.c'
source_filename = "various_ir_values.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: nounwind uwtable
define dso_local void @foo(ptr %A) #0 !dbg !7 {
; CHECK-LABEL: @foo(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, !DIAssignID [[DIASSIGNID16:![0-9]+]]
; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4
; CHECK-NEXT: call void @llvm.dbg.assign(metadata i1 undef, metadata [[META13:![0-9]+]], metadata !DIExpression(), metadata [[DIASSIGNID16]], metadata ptr [[A_ADDR]], metadata !DIExpression()), !dbg [[DBG17:![0-9]+]]
; CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA18:![0-9]+]]
; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[A_ADDR]], metadata [[META13]], metadata !DIExpression()), !dbg [[DBG17]]
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3:[0-9]+]], !dbg [[DBG22:![0-9]+]]
; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META14:![0-9]+]], metadata !DIExpression()), !dbg [[DBG23:![0-9]+]]
; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG23]], !tbaa [[TBAA24:![0-9]+]]
; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG22]]
; CHECK: for.cond:
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG26:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG28:![0-9]+]], !tbaa [[TBAA18]]
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG29:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG30:![0-9]+]]
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG31:![0-9]+]], !prof [[PROF32:![0-9]+]]
; CHECK: for.cond.cleanup:
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG33:![0-9]+]]
; CHECK-NEXT: br label [[FOR_END:%.*]]
; CHECK: for.body:
; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG34:![0-9]+]], !tbaa [[TBAA18]]
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG35:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG34]]
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG34]]
; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG36:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG34]]
; CHECK: for.inc:
; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG37:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG37]]
; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG37]], !tbaa [[TBAA24]]
; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG33]], !llvm.loop [[LOOP38:![0-9]+]]
; CHECK: for.end:
; CHECK-NEXT: ret void, !dbg [[DBG40:![0-9]+]]
;
entry:
%A.addr = alloca ptr, align 8, !DIAssignID !62
%i = alloca i32, align 4
call void @llvm.dbg.assign(metadata i1 undef, metadata !13, metadata !DIExpression(), metadata !62, metadata ptr %A.addr, metadata !DIExpression()), !dbg !20
store ptr %A, ptr %A.addr, align 8, !tbaa !16
call void @llvm.dbg.declare(metadata ptr %A.addr, metadata !13, metadata !DIExpression()), !dbg !20
call void @llvm.lifetime.start.p0(i64 4, ptr %i) #3, !dbg !21
call void @llvm.dbg.declare(metadata ptr %i, metadata !14, metadata !DIExpression()), !dbg !22
store i32 0, ptr %i, align 4, !dbg !22, !tbaa !23
br label %for.cond, !dbg !21
for.cond: ; preds = %for.inc, %entry
%0 = load i32, ptr %i, align 4, !dbg !25, !tbaa !23
%1 = load ptr, ptr %A.addr, align 8, !dbg !27, !tbaa !16
%2 = load i32, ptr %1, align 4, !dbg !28, !tbaa !23
%cmp = icmp slt i32 %0, %2, !dbg !29
br i1 %cmp, label %for.body, label %for.cond.cleanup, !dbg !30, !prof !61
for.cond.cleanup: ; preds = %for.cond
call void @llvm.lifetime.end.p0(i64 4, ptr %i) #3, !dbg !31
br label %for.end
for.body: ; preds = %for.cond
%3 = load ptr, ptr %A.addr, align 8, !dbg !32, !tbaa !16
%4 = load i32, ptr %i, align 4, !dbg !33, !tbaa !23
%idxprom = sext i32 %4 to i64, !dbg !32
%arrayidx = getelementptr inbounds i32, ptr %3, i64 %idxprom, !dbg !32
store i32 0, ptr %arrayidx, align 4, !dbg !34, !tbaa !23
br label %for.inc, !dbg !32
for.inc: ; preds = %for.body
%5 = load i32, ptr %i, align 4, !dbg !35, !tbaa !23
%inc = add nsw i32 %5, 1, !dbg !35
store i32 %inc, ptr %i, align 4, !dbg !35, !tbaa !23
br label %for.cond, !dbg !31, !llvm.loop !36
for.end: ; preds = %for.cond.cleanup
ret void, !dbg !38
}
; Function Attrs: nounwind readnone speculatable willreturn
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #2
; Function Attrs: argmemonly nounwind willreturn
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #2
; Function Attrs: nounwind uwtable
define dso_local void @bar(ptr %A) #0 !dbg !39 {
; CHECK-LABEL: @bar(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8
; CHECK-NEXT: [[I:%.*]] = alloca i32, align 4
; CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8, !tbaa [[TBAA18]]
; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[A_ADDR]], metadata [[META43:![0-9]+]], metadata !DIExpression()), !dbg [[DBG46:![0-9]+]]
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG47:![0-9]+]]
; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr [[I]], metadata [[META44:![0-9]+]], metadata !DIExpression()), !dbg [[DBG48:![0-9]+]]
; CHECK-NEXT: store i32 0, ptr [[I]], align 4, !dbg [[DBG48]], !tbaa [[TBAA24]]
; CHECK-NEXT: br label [[FOR_COND:%.*]], !dbg [[DBG47]]
; CHECK: for.cond:
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG49:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG51:![0-9]+]], !tbaa [[TBAA18]]
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4, !dbg [[DBG52:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], [[TMP2]], !dbg [[DBG53:![0-9]+]]
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]], !dbg [[DBG54:![0-9]+]]
; CHECK: for.cond.cleanup:
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR3]], !dbg [[DBG55:![0-9]+]]
; CHECK-NEXT: br label [[FOR_END:%.*]]
; CHECK: for.body:
; CHECK-NEXT: [[TMP3:%.*]] = load ptr, ptr [[A_ADDR]], align 8, !dbg [[DBG56:![0-9]+]], !tbaa [[TBAA18]]
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG57:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP4]] to i64, !dbg [[DBG56]]
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[TMP3]], i64 [[IDXPROM]], !dbg [[DBG56]]
; CHECK-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !dbg [[DBG58:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: br label [[FOR_INC:%.*]], !dbg [[DBG56]]
; CHECK: for.inc:
; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[I]], align 4, !dbg [[DBG59:![0-9]+]], !tbaa [[TBAA24]]
; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP5]], 1, !dbg [[DBG59]]
; CHECK-NEXT: store i32 [[INC]], ptr [[I]], align 4, !dbg [[DBG59]], !tbaa [[TBAA24]]
; CHECK-NEXT: br label [[FOR_COND]], !dbg [[DBG55]], !llvm.loop [[LOOP60:![0-9]+]]
; CHECK: for.end:
; CHECK-NEXT: ret void, !dbg [[DBG62:![0-9]+]]
;
entry:
%A.addr = alloca ptr, align 8
%i = alloca i32, align 4
store ptr %A, ptr %A.addr, align 8, !tbaa !16
call void @llvm.dbg.declare(metadata ptr %A.addr, metadata !41, metadata !DIExpression()), !dbg !44
call void @llvm.lifetime.start.p0(i64 4, ptr %i) #3, !dbg !45
call void @llvm.dbg.declare(metadata ptr %i, metadata !42, metadata !DIExpression()), !dbg !46
store i32 0, ptr %i, align 4, !dbg !46, !tbaa !23
br label %for.cond, !dbg !45
for.cond: ; preds = %for.inc, %entry
%0 = load i32, ptr %i, align 4, !dbg !47, !tbaa !23
%1 = load ptr, ptr %A.addr, align 8, !dbg !49, !tbaa !16
%2 = load i32, ptr %1, align 4, !dbg !50, !tbaa !23
%cmp = icmp slt i32 %0, %2, !dbg !51
br i1 %cmp, label %for.body, label %for.cond.cleanup, !dbg !52
for.cond.cleanup: ; preds = %for.cond
call void @llvm.lifetime.end.p0(i64 4, ptr %i) #3, !dbg !53
br label %for.end
for.body: ; preds = %for.cond
%3 = load ptr, ptr %A.addr, align 8, !dbg !54, !tbaa !16
%4 = load i32, ptr %i, align 4, !dbg !55, !tbaa !23
%idxprom = sext i32 %4 to i64, !dbg !54
%arrayidx = getelementptr inbounds i32, ptr %3, i64 %idxprom, !dbg !54
store i32 0, ptr %arrayidx, align 4, !dbg !56, !tbaa !23
br label %for.inc, !dbg !54
for.inc: ; preds = %for.body
%5 = load i32, ptr %i, align 4, !dbg !57, !tbaa !23
%inc = add nsw i32 %5, 1, !dbg !57
store i32 %inc, ptr %i, align 4, !dbg !57, !tbaa !23
br label %for.cond, !dbg !53, !llvm.loop !58
for.end: ; preds = %for.cond.cleanup
ret void, !dbg !60
}
declare void @llvm.dbg.assign(metadata, metadata, metadata, metadata, metadata, metadata)
attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "denormal-fp-math"="ieee,ieee" "denormal-fp-math-f32"="ieee,ieee" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind readnone speculatable willreturn }
attributes #2 = { argmemonly nounwind willreturn }
attributes #3 = { nounwind }
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4, !5}
!llvm.ident = !{!6}
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 11.0.0 (git@github.com:llvm/llvm-project.git 1d5da8cd30fce1c0a2c2fa6ba656dbfaa36192c8)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None)
!1 = !DIFile(filename: "various_ir_values.c", directory: "/data/build/llvm-project")
!2 = !{}
!3 = !{i32 7, !"Dwarf Version", i32 4}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = !{i32 1, !"wchar_size", i32 4}
!6 = !{!"clang version 11.0.0 (git@github.com:llvm/llvm-project.git 1d5da8cd30fce1c0a2c2fa6ba656dbfaa36192c8)"}
!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 1, type: !8, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !12)
!8 = !DISubroutineType(types: !9)
!9 = !{null, !10}
!10 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !11, size: 64)
!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!12 = !{!13, !14}
!13 = !DILocalVariable(name: "A", arg: 1, scope: !7, file: !1, line: 1, type: !10)
!14 = !DILocalVariable(name: "i", scope: !15, file: !1, line: 3, type: !11)
!15 = distinct !DILexicalBlock(scope: !7, file: !1, line: 3, column: 3)
!16 = !{!17, !17, i64 0}
!17 = !{!"any pointer", !18, i64 0}
!18 = !{!"omnipotent char", !19, i64 0}
!19 = !{!"Simple C/C++ TBAA"}
!20 = !DILocation(line: 1, column: 15, scope: !7)
!21 = !DILocation(line: 3, column: 8, scope: !15)
!22 = !DILocation(line: 3, column: 12, scope: !15)
!23 = !{!24, !24, i64 0}
!24 = !{!"int", !18, i64 0}
!25 = !DILocation(line: 3, column: 19, scope: !26)
!26 = distinct !DILexicalBlock(scope: !15, file: !1, line: 3, column: 3)
!27 = !DILocation(line: 3, column: 24, scope: !26)
!28 = !DILocation(line: 3, column: 23, scope: !26)
!29 = !DILocation(line: 3, column: 21, scope: !26)
!30 = !DILocation(line: 3, column: 3, scope: !15)
!31 = !DILocation(line: 3, column: 3, scope: !26)
!32 = !DILocation(line: 4, column: 5, scope: !26)
!33 = !DILocation(line: 4, column: 7, scope: !26)
!34 = !DILocation(line: 4, column: 10, scope: !26)
!35 = !DILocation(line: 3, column: 27, scope: !26)
!36 = distinct !{!36, !30, !37}
!37 = !DILocation(line: 4, column: 12, scope: !15)
!38 = !DILocation(line: 5, column: 1, scope: !7)
!39 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 7, type: !8, scopeLine: 7, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !40)
!40 = !{!41, !42}
!41 = !DILocalVariable(name: "A", arg: 1, scope: !39, file: !1, line: 7, type: !10)
!42 = !DILocalVariable(name: "i", scope: !43, file: !1, line: 9, type: !11)
!43 = distinct !DILexicalBlock(scope: !39, file: !1, line: 9, column: 3)
!44 = !DILocation(line: 7, column: 15, scope: !39)
!45 = !DILocation(line: 9, column: 8, scope: !43)
!46 = !DILocation(line: 9, column: 12, scope: !43)
!47 = !DILocation(line: 9, column: 19, scope: !48)
!48 = distinct !DILexicalBlock(scope: !43, file: !1, line: 9, column: 3)
!49 = !DILocation(line: 9, column: 24, scope: !48)
!50 = !DILocation(line: 9, column: 23, scope: !48)
!51 = !DILocation(line: 9, column: 21, scope: !48)
!52 = !DILocation(line: 9, column: 3, scope: !43)
!53 = !DILocation(line: 9, column: 3, scope: !48)
!54 = !DILocation(line: 10, column: 5, scope: !48)
!55 = !DILocation(line: 10, column: 7, scope: !48)
!56 = !DILocation(line: 10, column: 10, scope: !48)
!57 = !DILocation(line: 9, column: 27, scope: !48)
!58 = distinct !{!58, !52, !59}
!59 = !DILocation(line: 10, column: 12, scope: !43)
!60 = !DILocation(line: 11, column: 1, scope: !39)
!61 = !{!"branch_weights", i32 1, i32 1048575}
!62 = distinct !DIAssignID()
;.
; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C99, file: [[META1:![0-9]+]], producer: "{{.*}}clang version {{.*}}", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: [[META2:![0-9]+]], splitDebugInlining: false, nameTableKind: None)
; CHECK: [[META1]] = !DIFile(filename: "various_ir_values.c", directory: {{.*}})
; CHECK: [[META2]] = !{}
; CHECK: [[META7:![0-9]+]] = distinct !DISubprogram(name: "foo", scope: [[META1]], file: [[META1]], line: 1, type: [[META8:![0-9]+]], scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META12:![0-9]+]])
; CHECK: [[META8]] = !DISubroutineType(types: [[META9:![0-9]+]])
; CHECK: [[META9]] = !{null, [[META10:![0-9]+]]}
; CHECK: [[META10]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: [[META11:![0-9]+]], size: 64)
; CHECK: [[META11]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
; CHECK: [[META12]] = !{[[META13]], [[META14]]}
; CHECK: [[META13]] = !DILocalVariable(name: "A", arg: 1, scope: [[META7]], file: [[META1]], line: 1, type: [[META10]])
; CHECK: [[META14]] = !DILocalVariable(name: "i", scope: [[META15:![0-9]+]], file: [[META1]], line: 3, type: [[META11]])
; CHECK: [[META15]] = distinct !DILexicalBlock(scope: [[META7]], file: [[META1]], line: 3, column: 3)
; CHECK: [[DIASSIGNID16]] = distinct !DIAssignID()
; CHECK: [[DBG17]] = !DILocation(line: 1, column: 15, scope: [[META7]])
; CHECK: [[TBAA18]] = !{[[META19:![0-9]+]], [[META19]], i64 0}
; CHECK: [[META19]] = !{!"any pointer", [[META20:![0-9]+]], i64 0}
; CHECK: [[META20]] = !{!"omnipotent char", [[META21:![0-9]+]], i64 0}
; CHECK: [[META21]] = !{!"Simple C/C++ TBAA"}
; CHECK: [[DBG22]] = !DILocation(line: 3, column: 8, scope: [[META15]])
; CHECK: [[DBG23]] = !DILocation(line: 3, column: 12, scope: [[META15]])
; CHECK: [[TBAA24]] = !{[[META25:![0-9]+]], [[META25]], i64 0}
; CHECK: [[META25]] = !{!"int", [[META20]], i64 0}
; CHECK: [[DBG26]] = !DILocation(line: 3, column: 19, scope: [[META27:![0-9]+]])
; CHECK: [[META27]] = distinct !DILexicalBlock(scope: [[META15]], file: [[META1]], line: 3, column: 3)
; CHECK: [[DBG28]] = !DILocation(line: 3, column: 24, scope: [[META27]])
; CHECK: [[DBG29]] = !DILocation(line: 3, column: 23, scope: [[META27]])
; CHECK: [[DBG30]] = !DILocation(line: 3, column: 21, scope: [[META27]])
; CHECK: [[DBG31]] = !DILocation(line: 3, column: 3, scope: [[META15]])
; CHECK: [[PROF32]] = !{!"branch_weights", i32 1, i32 1048575}
; CHECK: [[DBG33]] = !DILocation(line: 3, column: 3, scope: [[META27]])
; CHECK: [[DBG34]] = !DILocation(line: 4, column: 5, scope: [[META27]])
; CHECK: [[DBG35]] = !DILocation(line: 4, column: 7, scope: [[META27]])
; CHECK: [[DBG36]] = !DILocation(line: 4, column: 10, scope: [[META27]])
; CHECK: [[DBG37]] = !DILocation(line: 3, column: 27, scope: [[META27]])
; CHECK: [[LOOP38]] = distinct !{[[LOOP38]], [[DBG31]], [[META39:![0-9]+]]}
; CHECK: [[META39]] = !DILocation(line: 4, column: 12, scope: [[META15]])
; CHECK: [[DBG40]] = !DILocation(line: 5, column: 1, scope: [[META7]])
; CHECK: [[META41:![0-9]+]] = distinct !DISubprogram(name: "bar", scope: [[META1]], file: [[META1]], line: 7, type: [[META8]], scopeLine: 7, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META42:![0-9]+]])
; CHECK: [[META42]] = !{[[META43]], [[META44]]}
; CHECK: [[META43]] = !DILocalVariable(name: "A", arg: 1, scope: [[META41]], file: [[META1]], line: 7, type: [[META10]])
; CHECK: [[META44]] = !DILocalVariable(name: "i", scope: [[META45:![0-9]+]], file: [[META1]], line: 9, type: [[META11]])
; CHECK: [[META45]] = distinct !DILexicalBlock(scope: [[META41]], file: [[META1]], line: 9, column: 3)
; CHECK: [[DBG46]] = !DILocation(line: 7, column: 15, scope: [[META41]])
; CHECK: [[DBG47]] = !DILocation(line: 9, column: 8, scope: [[META45]])
; CHECK: [[DBG48]] = !DILocation(line: 9, column: 12, scope: [[META45]])
; CHECK: [[DBG49]] = !DILocation(line: 9, column: 19, scope: [[META50:![0-9]+]])
; CHECK: [[META50]] = distinct !DILexicalBlock(scope: [[META45]], file: [[META1]], line: 9, column: 3)
; CHECK: [[DBG51]] = !DILocation(line: 9, column: 24, scope: [[META50]])
; CHECK: [[DBG52]] = !DILocation(line: 9, column: 23, scope: [[META50]])
; CHECK: [[DBG53]] = !DILocation(line: 9, column: 21, scope: [[META50]])
; CHECK: [[DBG54]] = !DILocation(line: 9, column: 3, scope: [[META45]])
; CHECK: [[DBG55]] = !DILocation(line: 9, column: 3, scope: [[META50]])
; CHECK: [[DBG56]] = !DILocation(line: 10, column: 5, scope: [[META50]])
; CHECK: [[DBG57]] = !DILocation(line: 10, column: 7, scope: [[META50]])
; CHECK: [[DBG58]] = !DILocation(line: 10, column: 10, scope: [[META50]])
; CHECK: [[DBG59]] = !DILocation(line: 9, column: 27, scope: [[META50]])
; CHECK: [[LOOP60]] = distinct !{[[LOOP60]], [[DBG54]], [[META61:![0-9]+]]}
; CHECK: [[META61]] = !DILocation(line: 10, column: 12, scope: [[META45]])
; CHECK: [[DBG62]] = !DILocation(line: 11, column: 1, scope: [[META41]])
;.

View File

@ -16,3 +16,9 @@
## Also try the --check-globals flag
# RUN: %update_test_checks %t.ll --check-globals
# RUN: diff -u %t.ll %S/Inputs/various_ir_values.ll.funcsig.globals.expected
# RUN: cp -f %S/Inputs/various_ir_values.ll %t.ll && %update_test_checks %t.ll --function-signature --check-globals all
# RUN: diff -u %t.ll %S/Inputs/various_ir_values.ll.funcsig.globals.expected
# RUN: cp -f %S/Inputs/various_ir_values.ll %t.ll && %update_test_checks %t.ll --check-globals none
# RUN: diff -u %t.ll %S/Inputs/various_ir_values.ll.funcsig.noglobals.expected
# RUN: cp -f %S/Inputs/various_ir_values.ll %t.ll && %update_test_checks %t.ll --check-globals smart
# RUN: diff -u %t.ll %S/Inputs/various_ir_values.ll.funcsig.transitiveglobals.expected

View File

@ -26,8 +26,10 @@ Version changelog:
type/attributes.
3: Opening parenthesis of function args is kept on the first LABEL line
in case arguments are split to a separate SAME line.
4: --check-globals now has a third option ('smart'). The others are now called
'none' and 'all'. 'smart' is the default.
"""
DEFAULT_VERSION = 3
DEFAULT_VERSION = 4
class Regex(object):
@ -228,6 +230,8 @@ def parse_args(parser, argv):
_verbose = args.verbose
_global_value_regex = args.global_value_regex
_global_hex_value_regex = args.global_hex_value_regex
if "check_globals" in args and args.check_globals == "default":
args.check_globals = "none" if args.version < 4 else "smart"
return args
@ -332,8 +336,8 @@ def itertests(
input_lines = [l.rstrip() for l in f]
first_line = input_lines[0] if input_lines else ""
if UTC_AVOID in first_line:
warn("Skipping test that must not be autogenerated: " + test)
continue
warn("Skipping test that must not be autogenerated: " + test)
continue
is_regenerate = UTC_ADVERT in first_line
# If we're generating a new test, set the default version to the latest.
@ -896,7 +900,9 @@ class NamelessValue:
*,
is_before_functions=False,
is_number=False,
replace_number_with_counter=False
replace_number_with_counter=False,
match_literally=False,
interlaced_with_previous=False
):
self.check_prefix = check_prefix
self.check_key = check_key
@ -908,6 +914,8 @@ class NamelessValue:
# Some variable numbers (e.g. MCINST1234) will change based on unrelated
# modifications to LLVM, replace those with an incrementing counter.
self.replace_number_with_counter = replace_number_with_counter
self.match_literally = match_literally
self.interlaced_with_previous = interlaced_with_previous
self.variable_mapping = {}
# Return true if this kind of IR value is "local", basically if it matches '%{{.*}}'.
@ -919,9 +927,10 @@ class NamelessValue:
return self.global_ir_rhs_regexp is not None
# Return the IR prefix and check prefix we use for this kind or IR value,
# e.g., (%, TMP) for locals.
# e.g., (%, TMP) for locals. If the IR prefix is a regex, return the prefix
# used in the IR output
def get_ir_prefix_from_ir_value_match(self, match):
return self.ir_prefix, self.check_prefix
return re.search(self.ir_prefix, match[0])[0], self.check_prefix
# Return the IR regexp we use for this kind or IR value, e.g., [\w.-]+? for locals
def get_ir_regex_from_ir_value_re_match(self, match):
@ -990,8 +999,16 @@ ir_nameless_values = [
NamelessValue(r"ATTR", "#", r"#", r"[0-9]+", None),
NamelessValue(r"ATTR", "#", r"attributes #", r"[0-9]+", r"{[^}]*}"),
NamelessValue(r"GLOB", "@", r"@", r"[0-9]+", None),
NamelessValue(r"GLOB", "@", r"@", r"[0-9]+", r".+", is_before_functions=True),
NamelessValue(
r"GLOB", "@", r"@", r'[a-zA-Z0-9_$"\\.-]+', r".+", is_before_functions=True
r"GLOBNAMED",
"@",
r"@",
r"[a-zA-Z0-9_$\"\\.-]*[a-zA-Z_$\"\\.-][a-zA-Z0-9_$\"\\.-]*",
r".+",
is_before_functions=True,
match_literally=True,
interlaced_with_previous=True,
),
NamelessValue(r"DBG", "!", r"!dbg ", r"![0-9]+", None),
NamelessValue(r"DIASSIGNID", "!", r"!DIAssignID ", r"![0-9]+", None),
@ -1003,6 +1020,19 @@ ir_nameless_values = [
NamelessValue(r"META", "!", r"metadata ", r"![0-9]+", None),
NamelessValue(r"META", "!", r"", r"![0-9]+", r"(?:distinct |)!.*"),
NamelessValue(r"ACC_GRP", "!", r"!llvm.access.group ", r"![0-9]+", None),
NamelessValue(r"META", "!", r"![a-z.]+ ", r"![0-9]+", None),
]
global_nameless_values = [
nameless_value
for nameless_value in ir_nameless_values
if nameless_value.global_ir_rhs_regexp is not None
]
# global variable names should be matched literally
global_nameless_values_w_unstable_ids = [
nameless_value
for nameless_value in global_nameless_values
if not nameless_value.match_literally
]
asm_nameless_values = [
@ -1037,6 +1067,7 @@ analyze_nameless_values = [
),
]
def createOrRegexp(old, new):
if not old:
return new
@ -1060,7 +1091,7 @@ for nameless_value in ir_nameless_values:
if nameless_value.global_ir_rhs_regexp is not None:
match = "^" + match
IR_VALUE_REGEXP_STRING = createOrRegexp(IR_VALUE_REGEXP_STRING, match)
IR_VALUE_REGEXP_SUFFIX = r"([,\s\(\)]|\Z)"
IR_VALUE_REGEXP_SUFFIX = r"([,\s\(\)\}]|\Z)"
IR_VALUE_RE = re.compile(
IR_VALUE_REGEXP_PREFIX
+ r"("
@ -1069,6 +1100,18 @@ IR_VALUE_RE = re.compile(
+ IR_VALUE_REGEXP_SUFFIX
)
GLOBAL_VALUE_REGEXP_STRING = r""
for nameless_value in global_nameless_values_w_unstable_ids:
match = createPrefixMatch(nameless_value.ir_prefix, nameless_value.ir_regexp)
GLOBAL_VALUE_REGEXP_STRING = createOrRegexp(GLOBAL_VALUE_REGEXP_STRING, match)
GLOBAL_VALUE_RE = re.compile(
IR_VALUE_REGEXP_PREFIX
+ r"("
+ GLOBAL_VALUE_REGEXP_STRING
+ r")"
+ IR_VALUE_REGEXP_SUFFIX
)
# Build the regexp that matches an "ASM value" (currently only for --asm-show-inst comments).
ASM_VALUE_REGEXP_STRING = ""
for nameless_value in asm_nameless_values:
@ -1101,6 +1144,7 @@ first_nameless_group_in_ir_value_match = 3
variable_group_in_ir_value_match = 3
attribute_group_in_ir_value_match = 4
# Check a match for IR_VALUE_RE and inspect it to determine if it was a local
# value, %..., global @..., debug number !dbg !..., etc. See the PREFIXES above.
def get_idx_from_ir_value_match(match):
@ -1226,6 +1270,20 @@ def generalize_check_lines(
)
def generalize_global_check_line(line, preserve_names, global_vars_seen):
[new_line] = generalize_check_lines_common(
[line],
False,
set(),
global_vars_seen,
global_nameless_values_w_unstable_ids,
GLOBAL_VALUE_RE,
False,
preserve_names,
)
return new_line
def generalize_asm_check_lines(lines, vars_seen, global_vars_seen):
return generalize_check_lines_common(
lines,
@ -1251,6 +1309,7 @@ def generalize_analyze_check_lines(lines, vars_seen, global_vars_seen):
False,
)
def add_checks(
output_lines,
comment_marker,
@ -1553,7 +1612,7 @@ def add_analyze_checks(
def build_global_values_dictionary(glob_val_dict, raw_tool_output, prefixes):
for nameless_value in itertools.chain(ir_nameless_values, asm_nameless_values):
for nameless_value in itertools.chain(global_nameless_values, asm_nameless_values):
if nameless_value.global_ir_rhs_regexp is None:
continue
@ -1564,7 +1623,10 @@ def build_global_values_dictionary(glob_val_dict, raw_tool_output, prefixes):
global_ir_value_re = re.compile(global_ir_value_re_str, flags=(re.M))
lines = []
for m in global_ir_value_re.finditer(raw_tool_output):
lines.append(m.group(0))
# Attach the substring's start index so that CHECK lines
# can be sorted properly even if they are matched by different nameless values.
# This is relevant for GLOB and GLOBNAMED since they may appear interlaced.
lines.append((m.start(), m.group(0)))
for prefix in prefixes:
if glob_val_dict[prefix] is None:
@ -1580,6 +1642,86 @@ def build_global_values_dictionary(glob_val_dict, raw_tool_output, prefixes):
glob_val_dict[prefix][nameless_value.check_prefix] = lines
def filter_globals_according_to_preference(
global_val_lines_w_index, global_vars_seen, nameless_value, global_check_setting
):
if global_check_setting == "none":
return []
if global_check_setting == "all":
return global_val_lines_w_index
assert global_check_setting == "smart"
if nameless_value.check_key == "#":
# attribute sets are usually better checked by --check-attributes
return []
def extract(line, nv):
p = (
"^"
+ nv.ir_prefix
+ "("
+ nv.ir_regexp
+ ") = ("
+ nv.global_ir_rhs_regexp
+ ")"
)
match = re.match(p, line)
return (match.group(1), re.findall(nv.ir_regexp, match.group(2)))
transitively_visible = set()
contains_refs_to = {}
def add(var):
nonlocal transitively_visible
nonlocal contains_refs_to
if var in transitively_visible:
return
transitively_visible.add(var)
if not var in contains_refs_to:
return
for x in contains_refs_to[var]:
add(x)
for i, line in global_val_lines_w_index:
(var, refs) = extract(line, nameless_value)
contains_refs_to[var] = refs
for var, check_key in global_vars_seen:
if check_key != nameless_value.check_key:
continue
add(var)
return [
(i, line)
for i, line in global_val_lines_w_index
if extract(line, nameless_value)[0] in transitively_visible
]
METADATA_FILTERS = [
(
r"(?<=\")(\w+ )?(\w+ version )[\d.]+(?: \([^)]+\))?",
r"{{.*}}\2{{.*}}",
), # preface with glob also, to capture optional CLANG_VENDOR
(r'(!DIFile\(filename: ".+", directory: )".+"', r"\1{{.*}}"),
]
METADATA_FILTERS_RE = [(re.compile(f), r) for (f, r) in METADATA_FILTERS]
def filter_unstable_metadata(line):
for f, replacement in METADATA_FILTERS_RE:
line = f.sub(replacement, line)
return line
def flush_current_checks(output_lines, new_lines_w_index, comment_marker):
if not new_lines_w_index:
return
output_lines.append(comment_marker + SEPARATOR)
new_lines_w_index.sort()
for _, line in new_lines_w_index:
output_lines.append(line)
new_lines_w_index.clear()
def add_global_checks(
glob_val_dict,
comment_marker,
@ -1588,11 +1730,11 @@ def add_global_checks(
global_vars_seen_dict,
preserve_names,
is_before_functions,
global_check_setting,
):
printed_prefixes = set()
for nameless_value in ir_nameless_values:
if nameless_value.global_ir_rhs_regexp is None:
continue
output_lines_loc = {} # Allows GLOB and GLOBNAMED to be sorted correctly
for nameless_value in global_nameless_values:
if nameless_value.is_before_functions != is_before_functions:
continue
for p in prefix_list:
@ -1616,26 +1758,41 @@ def add_global_checks(
check_lines = []
global_vars_seen_before = [key for key in global_vars_seen.keys()]
for line in glob_val_dict[checkprefix][nameless_value.check_prefix]:
lines_w_index = glob_val_dict[checkprefix][nameless_value.check_prefix]
lines_w_index = filter_globals_according_to_preference(
lines_w_index,
global_vars_seen_before,
nameless_value,
global_check_setting,
)
for i, line in lines_w_index:
if _global_value_regex:
matched = False
for regex in _global_value_regex:
if re.match("^@" + regex + " = ", line):
if re.match("^@" + regex + " = ", line) or re.match(
"^!" + regex + " = ", line
):
matched = True
break
if not matched:
continue
tmp = generalize_check_lines(
[line], False, set(), global_vars_seen, preserve_names
new_line = generalize_global_check_line(
line, preserve_names, global_vars_seen
)
check_line = "%s %s: %s" % (comment_marker, checkprefix, tmp[0])
check_lines.append(check_line)
new_line = filter_unstable_metadata(new_line)
check_line = "%s %s: %s" % (comment_marker, checkprefix, new_line)
check_lines.append((i, check_line))
if not check_lines:
continue
output_lines.append(comment_marker + SEPARATOR)
if not checkprefix in output_lines_loc:
output_lines_loc[checkprefix] = []
if not nameless_value.interlaced_with_previous:
flush_current_checks(
output_lines, output_lines_loc[checkprefix], comment_marker
)
for check_line in check_lines:
output_lines.append(check_line)
output_lines_loc[checkprefix].append(check_line)
printed_prefixes.add((checkprefix, nameless_value.check_prefix))
@ -1646,6 +1803,16 @@ def add_global_checks(
break
if printed_prefixes:
for p in prefix_list:
if p[0] is None:
continue
for checkprefix in p[0]:
if checkprefix not in output_lines_loc:
continue
flush_current_checks(
output_lines, output_lines_loc[checkprefix], comment_marker
)
break
output_lines.append(comment_marker + SEPARATOR)
return printed_prefixes
@ -1712,6 +1879,15 @@ def get_autogennote_suffix(parser, args):
):
continue
value = getattr(args, action.dest)
if action.dest == "check_globals":
default_value = "none" if args.version < 4 else "smart"
if value == default_value:
continue
autogenerated_note_args += action.option_strings[0] + " "
if args.version < 4 and value == "all":
continue
autogenerated_note_args += "%s " % value
continue
if action.const is not None: # action stores a constant (usually True/False)
# Skip actions with different constant values (this happens with boolean
# --foo/--no-foo options)

View File

@ -205,7 +205,10 @@ def config():
)
parser.add_argument(
"--check-globals",
action="store_true",
nargs="?",
const="all",
default="default",
choices=["none", "smart", "all"],
help="Check global entries (global variables, metadata, attribute sets, ...) for functions",
)
parser.add_argument("tests", nargs="+")
@ -436,7 +439,7 @@ def main():
is_filtered=builder.is_filtered(),
)
if ti.args.check_globals:
if ti.args.check_globals != 'none':
generated_prefixes.extend(
common.add_global_checks(
builder.global_var_dict(),
@ -444,8 +447,9 @@ def main():
run_list,
output_lines,
global_vars_seen_dict,
False,
True,
True,
ti.args.check_globals,
)
)
generated_prefixes.extend(
@ -493,7 +497,7 @@ def main():
output_lines.pop()
last_line = output_lines[-1].strip()
if (
ti.args.check_globals
ti.args.check_globals != 'none'
and not has_checked_pre_function_globals
):
generated_prefixes.extend(
@ -503,8 +507,9 @@ def main():
run_list,
output_lines,
global_vars_seen_dict,
False,
True,
True,
ti.args.check_globals,
)
)
has_checked_pre_function_globals = True
@ -531,7 +536,7 @@ def main():
if include_line:
output_lines.append(line.rstrip("\n"))
if ti.args.check_globals:
if ti.args.check_globals != 'none':
generated_prefixes.extend(
common.add_global_checks(
builder.global_var_dict(),
@ -539,8 +544,9 @@ def main():
run_list,
output_lines,
global_vars_seen_dict,
True,
False,
False,
ti.args.check_globals,
)
)
if ti.args.gen_unused_prefix_body:

View File

@ -79,7 +79,10 @@ def main():
)
parser.add_argument(
"--check-globals",
action="store_true",
nargs="?",
const="all",
default="default",
choices=["none", "smart", "all"],
help="Check global entries (global variables, metadata, attribute sets, ...) for functions",
)
parser.add_argument("tests", nargs="+")
@ -195,7 +198,7 @@ def main():
common.dump_input_lines(output_lines, ti, prefix_set, ";")
args = ti.args
if args.check_globals:
if args.check_globals != 'none':
generated_prefixes.extend(
common.add_global_checks(
builder.global_var_dict(),
@ -205,6 +208,7 @@ def main():
global_vars_seen_dict,
args.preserve_names,
True,
args.check_globals,
)
)
@ -272,6 +276,7 @@ def main():
global_vars_seen_dict,
args.preserve_names,
True,
args.check_globals,
)
)
has_checked_pre_function_globals = True
@ -301,7 +306,7 @@ def main():
continue
is_in_function = is_in_function_start = True
if args.check_globals:
if args.check_globals != 'none':
generated_prefixes.extend(
common.add_global_checks(
builder.global_var_dict(),
@ -311,6 +316,7 @@ def main():
global_vars_seen_dict,
args.preserve_names,
False,
args.check_globals,
)
)
if ti.args.gen_unused_prefix_body: