forked from OSchip/llvm-project
[IPConstProp] Regenerate check lines.
Preparation for D84447.
This commit is contained in:
parent
bbe5099207
commit
1ac72a0774
|
@ -1,17 +1,25 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -ipconstprop -S | FileCheck %s
|
||||
; Should not propagate the result of a weak function.
|
||||
; PR2411
|
||||
|
||||
; CHECK: ret i32 %r
|
||||
|
||||
define weak i32 @foo() nounwind {
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: ret i32 1
|
||||
;
|
||||
entry:
|
||||
ret i32 1
|
||||
ret i32 1
|
||||
}
|
||||
|
||||
define i32 @main() nounwind {
|
||||
; CHECK-LABEL: @main(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[R:%.*]] = call i32 @foo() #0
|
||||
; CHECK-NEXT: ret i32 [[R]]
|
||||
;
|
||||
entry:
|
||||
%r = call i32 @foo( ) nounwind
|
||||
ret i32 %r
|
||||
%r = call i32 @foo( ) nounwind
|
||||
ret i32 %r
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -ipconstprop -S -o - | FileCheck %s
|
||||
|
||||
; The original C source looked like this:
|
||||
|
@ -50,22 +51,28 @@ define internal i16 @bar(i16 %p1, i16 %p2) {
|
|||
; in argument count due to varargs (as long as all non-variadic arguments have
|
||||
; been provided),
|
||||
|
||||
define internal i16 @vararg_prop(i16 %p1, ...) {
|
||||
; CHECK-LABEL: @vararg_prop(
|
||||
; CHECK-NEXT: ret i16 7
|
||||
;
|
||||
ret i16 %p1
|
||||
}
|
||||
|
||||
define dso_local i16 @vararg_tests(i16 %a) {
|
||||
; CHECK-LABEL: @vararg_tests(
|
||||
; CHECK-NEXT: [[CALL1:%.*]] = call i16 (i16, ...) @vararg_prop(i16 7, i16 8, i16 [[A:%.*]])
|
||||
; CHECK-NEXT: [[CALL2:%.*]] = call i16 bitcast (i16 (i16, i16, ...)* @vararg_no_prop to i16 (i16)*)(i16 7)
|
||||
; CHECK-NEXT: [[ADD:%.*]] = add i16 7, [[CALL2]]
|
||||
; CHECK-NEXT: ret i16 [[ADD]]
|
||||
;
|
||||
%call1 = call i16 (i16, ...) @vararg_prop(i16 7, i16 8, i16 %a)
|
||||
%call2 = call i16 bitcast (i16 (i16, i16, ...) * @vararg_no_prop to i16 (i16) *) (i16 7)
|
||||
%add = add i16 %call1, %call2
|
||||
ret i16 %add
|
||||
}
|
||||
|
||||
define internal i16 @vararg_prop(i16 %p1, ...) {
|
||||
; CHECK-LABEL: define internal i16 @vararg_prop(
|
||||
; CHECK-NEXT: ret i16 7
|
||||
;
|
||||
ret i16 %p1
|
||||
}
|
||||
|
||||
define internal i16 @vararg_no_prop(i16 %p1, i16 %p2, ...) {
|
||||
; CHECK-LABEL: define internal i16 @vararg_no_prop(
|
||||
; CHECK-LABEL: @vararg_no_prop(
|
||||
; CHECK-NEXT: ret i16 [[P1:%.*]]
|
||||
;
|
||||
ret i16 %p1
|
||||
|
|
|
@ -1,8 +1,12 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -ipconstprop -S | FileCheck %s
|
||||
|
||||
; See PR26774
|
||||
|
||||
define i32 @baz() {
|
||||
; CHECK-LABEL: @baz(
|
||||
; CHECK-NEXT: ret i32 10
|
||||
;
|
||||
ret i32 10
|
||||
}
|
||||
|
||||
|
@ -11,8 +15,9 @@ define i32 @baz() {
|
|||
|
||||
define linkonce_odr i32 @foo() {
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK-NEXT: %val = call i32 @baz()
|
||||
; CHECK-NEXT: ret i32 10
|
||||
; CHECK-NEXT: [[VAL:%.*]] = call i32 @baz()
|
||||
; CHECK-NEXT: ret i32 10
|
||||
;
|
||||
|
||||
%val = call i32 @baz()
|
||||
ret i32 %val
|
||||
|
@ -20,8 +25,9 @@ define linkonce_odr i32 @foo() {
|
|||
|
||||
define i32 @bar() {
|
||||
; CHECK-LABEL: @bar(
|
||||
; CHECK-NEXT: %val = call i32 @foo()
|
||||
; CHECK-NEXT: ret i32 %val
|
||||
; CHECK-NEXT: [[VAL:%.*]] = call i32 @foo()
|
||||
; CHECK-NEXT: ret i32 [[VAL]]
|
||||
;
|
||||
|
||||
%val = call i32 @foo()
|
||||
ret i32 %val
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -ipconstprop -disable-output
|
||||
define internal void @foo(i32 %X) {
|
||||
call void @foo( i32 %X )
|
||||
ret void
|
||||
call void @foo( i32 %X )
|
||||
ret void
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,5 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -ipconstprop -S < %s | FileCheck %s
|
||||
; FIXME: There seems to be another instance of nondeterminism which causes the number of iterations to be either 1 or 3, depending on the system.
|
||||
; This needs to be investigated and resolved. In the meantime we do not verify the number of iterations.
|
||||
; opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s
|
||||
; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-max-iterations-verify=false -attributor-max-iterations=3 < %s | FileCheck %s
|
||||
;
|
||||
;
|
||||
; /---------------------------------------|
|
||||
; | /----------------------|----|
|
||||
|
@ -40,39 +36,63 @@
|
|||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
define internal i32 @cb0(i32 %zero) {
|
||||
; CHECK-LABEL: @cb0(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: ret i32 0
|
||||
;
|
||||
entry:
|
||||
; CHECK: @cb0
|
||||
; CHECK-NEXT: entry
|
||||
; CHECK-NEXT: ret i32 0
|
||||
ret i32 %zero
|
||||
}
|
||||
|
||||
define internal i32 @cb1(i32 %unknown) {
|
||||
; CHECK-LABEL: @cb1(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: ret i32 [[UNKNOWN:%.*]]
|
||||
;
|
||||
entry:
|
||||
; CHECK: ret i32 %unknown
|
||||
ret i32 %unknown
|
||||
}
|
||||
|
||||
define internal i32 @cb2(i32 %unknown) {
|
||||
; CHECK-LABEL: @cb2(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[CALL:%.*]] = call i32 @cb0(i32 0)
|
||||
; CHECK-NEXT: ret i32 [[UNKNOWN:%.*]]
|
||||
;
|
||||
entry:
|
||||
%call = call i32 @cb0(i32 0)
|
||||
; CHECK: ret i32 %unknown
|
||||
ret i32 %unknown
|
||||
}
|
||||
|
||||
define internal i32 @cb3(i32 %unknown) {
|
||||
; CHECK-LABEL: @cb3(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: ret i32 [[UNKNOWN:%.*]]
|
||||
;
|
||||
entry:
|
||||
; CHECK: ret i32 %unknown
|
||||
ret i32 %unknown
|
||||
}
|
||||
|
||||
define internal i32 @cb4(i32 %unknown) {
|
||||
; CHECK-LABEL: @cb4(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: ret i32 [[UNKNOWN:%.*]]
|
||||
;
|
||||
entry:
|
||||
; CHECK: ret i32 %unknown
|
||||
ret i32 %unknown
|
||||
}
|
||||
|
||||
define void @foo() {
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[CALL:%.*]] = call i32 @cb0(i32 0)
|
||||
; CHECK-NEXT: [[CALL1:%.*]] = call i32 @cb3(i32 1)
|
||||
; CHECK-NEXT: call void @broker(i32 (i32)* nonnull @cb0, i32 (i32)* nonnull @cb1, i32 (i32)* nonnull @cb0, i32 0, i32 1)
|
||||
; CHECK-NEXT: call void @broker(i32 (i32)* nonnull @cb1, i32 (i32)* nonnull @cb2, i32 (i32)* nonnull @cb2, i32 0, i32 1)
|
||||
; CHECK-NEXT: call void @broker(i32 (i32)* nonnull @cb3, i32 (i32)* nonnull @cb2, i32 (i32)* nonnull @cb3, i32 0, i32 1)
|
||||
; CHECK-NEXT: call void @broker(i32 (i32)* nonnull @cb4, i32 (i32)* nonnull @cb4, i32 (i32)* nonnull @cb4, i32 0, i32 1)
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
entry:
|
||||
%call = call i32 @cb0(i32 0)
|
||||
%call1 = call i32 @cb3(i32 1)
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -ipsccp -S %s | FileCheck %s
|
||||
; RUN: opt -ipconstprop -S %s | FileCheck %s
|
||||
|
||||
|
@ -5,22 +6,37 @@ target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
|
|||
target triple = "i686-pc-windows-msvc19.0.24215"
|
||||
|
||||
define i32 @dipsy(i32, i32) local_unnamed_addr #0 {
|
||||
; CHECK-LABEL: @dipsy(
|
||||
; CHECK-NEXT: BasicBlock0:
|
||||
; CHECK-NEXT: call void asm "\0D\0Apushl %ebp\0D\0Amovl 8(%esp),%eax\0D\0Amovl 12(%esp), %ebp\0D\0Acalll *%eax\0D\0Apopl %ebp\0D\0Aretl\0D\0A", ""()
|
||||
; CHECK-NEXT: ret i32 0
|
||||
;
|
||||
BasicBlock0:
|
||||
call void asm "\0D\0Apushl %ebp\0D\0Amovl 8(%esp),%eax\0D\0Amovl 12(%esp), %ebp\0D\0Acalll *%eax\0D\0Apopl %ebp\0D\0Aretl\0D\0A", ""()
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
define void @tinkywinky(i32, i32, i32) local_unnamed_addr #0 {
|
||||
; CHECK-LABEL: @tinkywinky(
|
||||
; CHECK-NEXT: BasicBlock1:
|
||||
; CHECK-NEXT: call void asm "\0D\0A movl 12(%esp), %ebp\0D\0A movl 4(%esp), %eax\0D\0A movl 8(%esp), %esp\0D\0A jmpl *%eax\0D\0A", ""()
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
BasicBlock1:
|
||||
call void asm "\0D\0A movl 12(%esp), %ebp\0D\0A movl 4(%esp), %eax\0D\0A movl 8(%esp), %esp\0D\0A jmpl *%eax\0D\0A", ""()
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @patatino(i32, i32, i32) local_unnamed_addr #1 {
|
||||
; CHECK-LABEL: @patatino(
|
||||
; CHECK-NEXT: bb:
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @dipsy(i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) #0
|
||||
; CHECK-NEXT: tail call void @tinkywinky(i32 [[TMP3]], i32 [[TMP2:%.*]], i32 [[TMP1]]) #0
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
bb:
|
||||
%3 = tail call i32 @dipsy(i32 %0, i32 %1) #0
|
||||
; Check that we don't accidentally propagate zero.
|
||||
; CHECK: @tinkywinky(i32 %3, i32 %2, i32 %1) #0
|
||||
tail call void @tinkywinky(i32 %3, i32 %2, i32 %1) #0
|
||||
ret void
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -S -ipconstprop < %s | FileCheck %s
|
||||
;
|
||||
; void bar(int, float, double);
|
||||
|
@ -24,6 +25,16 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|||
@1 = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str, i32 0, i32 0) }, align 8
|
||||
|
||||
define dso_local void @foo(i32 %N) {
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[N_ADDR:%.*]] = alloca i32, align 4
|
||||
; CHECK-NEXT: [[P:%.*]] = alloca float, align 4
|
||||
; CHECK-NEXT: store i32 [[N:%.*]], i32* [[N_ADDR]], align 4
|
||||
; CHECK-NEXT: store float 3.000000e+00, float* [[P]], align 4
|
||||
; CHECK-NEXT: store i32 7, i32* [[N_ADDR]], align 4
|
||||
; CHECK-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @1, i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, float*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* nonnull [[N_ADDR]], float* nonnull [[P]], i64 4617315517961601024)
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
entry:
|
||||
%N.addr = alloca i32, align 4
|
||||
%p = alloca float, align 4
|
||||
|
@ -35,13 +46,72 @@ entry:
|
|||
}
|
||||
|
||||
define internal void @.omp_outlined.(i32* noalias %.global_tid., i32* noalias %.bound_tid., i32* dereferenceable(4) %N, float* dereferenceable(4) %p, i64 %q) {
|
||||
; CHECK-LABEL: @.omp_outlined.(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[Q_ADDR:%.*]] = alloca i64, align 8
|
||||
; CHECK-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
||||
; CHECK-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
||||
; CHECK-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
||||
; CHECK-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
||||
; CHECK-NEXT: store i64 4617315517961601024, i64* [[Q_ADDR]], align 8
|
||||
; CHECK-NEXT: [[CONV:%.*]] = bitcast i64* [[Q_ADDR]] to double*
|
||||
; CHECK-NEXT: [[TMP:%.*]] = load i32, i32* [[N:%.*]], align 4
|
||||
; CHECK-NEXT: [[SUB3:%.*]] = add nsw i32 [[TMP]], -3
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP]], 2
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
||||
; CHECK: omp.precond.then:
|
||||
; CHECK-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
|
||||
; CHECK-NEXT: store i32 [[SUB3]], i32* [[DOTOMP_UB]], align 4
|
||||
; CHECK-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
|
||||
; CHECK-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTGLOBAL_TID_:%.*]], align 4
|
||||
; CHECK-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* nonnull @0, i32 [[TMP5]], i32 34, i32* nonnull [[DOTOMP_IS_LAST]], i32* nonnull [[DOTOMP_LB]], i32* nonnull [[DOTOMP_UB]], i32* nonnull [[DOTOMP_STRIDE]], i32 1, i32 1)
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
|
||||
; CHECK-NEXT: [[CMP6:%.*]] = icmp sgt i32 [[TMP6]], [[SUB3]]
|
||||
; CHECK-NEXT: br i1 [[CMP6]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
||||
; CHECK: cond.true:
|
||||
; CHECK-NEXT: br label [[COND_END:%.*]]
|
||||
; CHECK: cond.false:
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
|
||||
; CHECK-NEXT: br label [[COND_END]]
|
||||
; CHECK: cond.end:
|
||||
; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[SUB3]], [[COND_TRUE]] ], [ [[TMP7]], [[COND_FALSE]] ]
|
||||
; CHECK-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
|
||||
; CHECK-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
|
||||
; CHECK-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
||||
; CHECK: omp.inner.for.cond:
|
||||
; CHECK-NEXT: [[DOTOMP_IV_0:%.*]] = phi i32 [ [[TMP8]], [[COND_END]] ], [ [[ADD11:%.*]], [[OMP_INNER_FOR_INC:%.*]] ]
|
||||
; CHECK-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
|
||||
; CHECK-NEXT: [[CMP8:%.*]] = icmp sgt i32 [[DOTOMP_IV_0]], [[TMP9]]
|
||||
; CHECK-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]], label [[OMP_INNER_FOR_BODY:%.*]]
|
||||
; CHECK: omp.inner.for.cond.cleanup:
|
||||
; CHECK-NEXT: br label [[OMP_INNER_FOR_END:%.*]]
|
||||
; CHECK: omp.inner.for.body:
|
||||
; CHECK-NEXT: [[ADD10:%.*]] = add nsw i32 [[DOTOMP_IV_0]], 2
|
||||
; CHECK-NEXT: [[TMP10:%.*]] = load float, float* [[P:%.*]], align 4
|
||||
; CHECK-NEXT: [[TMP11:%.*]] = load double, double* [[CONV]], align 8
|
||||
; CHECK-NEXT: call void @bar(i32 [[ADD10]], float [[TMP10]], double [[TMP11]])
|
||||
; CHECK-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
||||
; CHECK: omp.body.continue:
|
||||
; CHECK-NEXT: br label [[OMP_INNER_FOR_INC]]
|
||||
; CHECK: omp.inner.for.inc:
|
||||
; CHECK-NEXT: [[ADD11]] = add nsw i32 [[DOTOMP_IV_0]], 1
|
||||
; CHECK-NEXT: br label [[OMP_INNER_FOR_COND]]
|
||||
; CHECK: omp.inner.for.end:
|
||||
; CHECK-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
||||
; CHECK: omp.loop.exit:
|
||||
; CHECK-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
|
||||
; CHECK-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* nonnull @0, i32 [[TMP12]])
|
||||
; CHECK-NEXT: br label [[OMP_PRECOND_END]]
|
||||
; CHECK: omp.precond.end:
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
entry:
|
||||
%q.addr = alloca i64, align 8
|
||||
%.omp.lb = alloca i32, align 4
|
||||
%.omp.ub = alloca i32, align 4
|
||||
%.omp.stride = alloca i32, align 4
|
||||
%.omp.is_last = alloca i32, align 4
|
||||
; CHECK: store i64 4617315517961601024, i64* %q.addr, align 8
|
||||
store i64 %q, i64* %q.addr, align 8
|
||||
%conv = bitcast i64* %q.addr to double*
|
||||
%tmp = load i32, i32* %N, align 4
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -ipconstprop -S < %s | FileCheck %s
|
||||
;
|
||||
; #include <pthread.h>
|
||||
|
@ -24,6 +25,13 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|||
@GlobalVPtr = common dso_local global i8* null, align 8
|
||||
|
||||
define dso_local i32 @main() {
|
||||
; CHECK-LABEL: @main(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[THREAD:%.*]] = alloca i64, align 8
|
||||
; CHECK-NEXT: [[CALL:%.*]] = call i32 @pthread_create(i64* nonnull [[THREAD]], %union.pthread_attr_t* null, i8* (i8*)* nonnull @foo, i8* null)
|
||||
; CHECK-NEXT: [[CALL1:%.*]] = call i32 @pthread_create(i64* nonnull [[THREAD]], %union.pthread_attr_t* null, i8* (i8*)* nonnull @bar, i8* bitcast (i8** @GlobalVPtr to i8*))
|
||||
; CHECK-NEXT: ret i32 0
|
||||
;
|
||||
entry:
|
||||
%thread = alloca i64, align 8
|
||||
%call = call i32 @pthread_create(i64* nonnull %thread, %union.pthread_attr_t* null, i8* (i8*)* nonnull @foo, i8* null)
|
||||
|
@ -34,14 +42,20 @@ entry:
|
|||
declare !callback !0 dso_local i32 @pthread_create(i64*, %union.pthread_attr_t*, i8* (i8*)*, i8*)
|
||||
|
||||
define internal i8* @foo(i8* %arg) {
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: ret i8* null
|
||||
;
|
||||
entry:
|
||||
; CHECK: ret i8* null
|
||||
ret i8* %arg
|
||||
}
|
||||
|
||||
define internal i8* @bar(i8* %arg) {
|
||||
; CHECK-LABEL: @bar(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: ret i8* bitcast (i8** @GlobalVPtr to i8*)
|
||||
;
|
||||
entry:
|
||||
; CHECK: ret i8* bitcast (i8** @GlobalVPtr to i8*)
|
||||
ret i8* %arg
|
||||
}
|
||||
|
||||
|
|
|
@ -1,15 +1,25 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -ipconstprop -deadargelim -S | FileCheck %s
|
||||
|
||||
; CHECK-NOT: %X
|
||||
|
||||
define internal i32 @foo(i32 %X) {
|
||||
%Y = call i32 @foo( i32 %X ) ; <i32> [#uses=1]
|
||||
%Z = add i32 %Y, 1 ; <i32> [#uses=1]
|
||||
ret i32 %Z
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK-NEXT: [[Y:%.*]] = call i32 @foo()
|
||||
; CHECK-NEXT: [[Z:%.*]] = add i32 [[Y]], 1
|
||||
; CHECK-NEXT: ret i32 [[Z]]
|
||||
;
|
||||
%Y = call i32 @foo( i32 %X ) ; <i32> [#uses=1]
|
||||
%Z = add i32 %Y, 1 ; <i32> [#uses=1]
|
||||
ret i32 %Z
|
||||
}
|
||||
|
||||
define void @bar() {
|
||||
call i32 @foo( i32 17 ) ; <i32>:1 [#uses=0]
|
||||
ret void
|
||||
; CHECK-LABEL: @bar(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = call i32 @foo()
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
call i32 @foo( i32 17 ) ; <i32>:1 [#uses=0]
|
||||
ret void
|
||||
}
|
||||
|
||||
|
|
|
@ -1,58 +1,91 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -ipconstprop -S | FileCheck %s
|
||||
|
||||
; CHECK: add i32 1, 3
|
||||
; CHECK: store i32 %Z, i32* %Q
|
||||
|
||||
;; This function returns its second argument on all return statements
|
||||
define internal i32* @incdec(i1 %C, i32* %V) {
|
||||
%X = load i32, i32* %V
|
||||
br i1 %C, label %T, label %F
|
||||
; CHECK-LABEL: @incdec(
|
||||
; CHECK-NEXT: [[X:%.*]] = load i32, i32* [[V:%.*]], align 4
|
||||
; CHECK-NEXT: br i1 [[C:%.*]], label [[T:%.*]], label [[F:%.*]]
|
||||
; CHECK: T:
|
||||
; CHECK-NEXT: [[X1:%.*]] = add i32 [[X]], 1
|
||||
; CHECK-NEXT: store i32 [[X1]], i32* [[V]], align 4
|
||||
; CHECK-NEXT: ret i32* [[V]]
|
||||
; CHECK: F:
|
||||
; CHECK-NEXT: [[X2:%.*]] = sub i32 [[X]], 1
|
||||
; CHECK-NEXT: store i32 [[X2]], i32* [[V]], align 4
|
||||
; CHECK-NEXT: ret i32* [[V]]
|
||||
;
|
||||
%X = load i32, i32* %V
|
||||
br i1 %C, label %T, label %F
|
||||
|
||||
T: ; preds = %0
|
||||
%X1 = add i32 %X, 1
|
||||
store i32 %X1, i32* %V
|
||||
ret i32* %V
|
||||
%X1 = add i32 %X, 1
|
||||
store i32 %X1, i32* %V
|
||||
ret i32* %V
|
||||
|
||||
F: ; preds = %0
|
||||
%X2 = sub i32 %X, 1
|
||||
store i32 %X2, i32* %V
|
||||
ret i32* %V
|
||||
%X2 = sub i32 %X, 1
|
||||
store i32 %X2, i32* %V
|
||||
ret i32* %V
|
||||
}
|
||||
|
||||
;; This function returns its first argument as a part of a multiple return
|
||||
;; value
|
||||
define internal { i32, i32 } @foo(i32 %A, i32 %B) {
|
||||
%X = add i32 %A, %B
|
||||
%Y = insertvalue { i32, i32 } undef, i32 %A, 0
|
||||
%Z = insertvalue { i32, i32 } %Y, i32 %X, 1
|
||||
ret { i32, i32 } %Z
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK-NEXT: [[X:%.*]] = add i32 [[A:%.*]], [[B:%.*]]
|
||||
; CHECK-NEXT: [[Y:%.*]] = insertvalue { i32, i32 } undef, i32 [[A]], 0
|
||||
; CHECK-NEXT: [[Z:%.*]] = insertvalue { i32, i32 } [[Y]], i32 [[X]], 1
|
||||
; CHECK-NEXT: ret { i32, i32 } [[Z]]
|
||||
;
|
||||
%X = add i32 %A, %B
|
||||
%Y = insertvalue { i32, i32 } undef, i32 %A, 0
|
||||
%Z = insertvalue { i32, i32 } %Y, i32 %X, 1
|
||||
ret { i32, i32 } %Z
|
||||
}
|
||||
|
||||
define void @caller(i1 %C) personality i32 (...)* @__gxx_personality_v0 {
|
||||
%Q = alloca i32
|
||||
;; Call incdec to see if %W is properly replaced by %Q
|
||||
%W = call i32* @incdec(i1 %C, i32* %Q ) ; <i32> [#uses=1]
|
||||
;; Call @foo twice, to prevent the arguments from propagating into the
|
||||
;; function (so we can check the returned argument is properly
|
||||
;; propagated per-caller).
|
||||
%S1 = call { i32, i32 } @foo(i32 1, i32 2)
|
||||
%X1 = extractvalue { i32, i32 } %S1, 0
|
||||
%S2 = invoke { i32, i32 } @foo(i32 3, i32 4) to label %OK unwind label %LPAD
|
||||
; CHECK-LABEL: @caller(
|
||||
; CHECK-NEXT: [[Q:%.*]] = alloca i32, align 4
|
||||
; CHECK-NEXT: [[W:%.*]] = call i32* @incdec(i1 [[C:%.*]], i32* [[Q]])
|
||||
; CHECK-NEXT: [[S1:%.*]] = call { i32, i32 } @foo(i32 1, i32 2)
|
||||
; CHECK-NEXT: [[S2:%.*]] = invoke { i32, i32 } @foo(i32 3, i32 4)
|
||||
; CHECK-NEXT: to label [[OK:%.*]] unwind label [[LPAD:%.*]]
|
||||
; CHECK: OK:
|
||||
; CHECK-NEXT: [[Z:%.*]] = add i32 1, 3
|
||||
; CHECK-NEXT: store i32 [[Z]], i32* [[Q]], align 4
|
||||
; CHECK-NEXT: br label [[RET:%.*]]
|
||||
; CHECK: LPAD:
|
||||
; CHECK-NEXT: [[EXN:%.*]] = landingpad { i8*, i32 }
|
||||
; CHECK-NEXT: cleanup
|
||||
; CHECK-NEXT: br label [[RET]]
|
||||
; CHECK: RET:
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
%Q = alloca i32
|
||||
;; Call incdec to see if %W is properly replaced by %Q
|
||||
%W = call i32* @incdec(i1 %C, i32* %Q ) ; <i32> [#uses=1]
|
||||
;; Call @foo twice, to prevent the arguments from propagating into the
|
||||
;; function (so we can check the returned argument is properly
|
||||
;; propagated per-caller).
|
||||
%S1 = call { i32, i32 } @foo(i32 1, i32 2)
|
||||
%X1 = extractvalue { i32, i32 } %S1, 0
|
||||
%S2 = invoke { i32, i32 } @foo(i32 3, i32 4) to label %OK unwind label %LPAD
|
||||
|
||||
OK:
|
||||
%X2 = extractvalue { i32, i32 } %S2, 0
|
||||
;; Do some stuff with the returned values which we can grep for
|
||||
%Z = add i32 %X1, %X2
|
||||
store i32 %Z, i32* %W
|
||||
br label %RET
|
||||
%X2 = extractvalue { i32, i32 } %S2, 0
|
||||
;; Do some stuff with the returned values which we can grep for
|
||||
%Z = add i32 %X1, %X2
|
||||
store i32 %Z, i32* %W
|
||||
br label %RET
|
||||
|
||||
LPAD:
|
||||
%exn = landingpad {i8*, i32}
|
||||
cleanup
|
||||
br label %RET
|
||||
%exn = landingpad {i8*, i32}
|
||||
cleanup
|
||||
br label %RET
|
||||
|
||||
RET:
|
||||
ret void
|
||||
ret void
|
||||
}
|
||||
|
||||
declare i32 @__gxx_personality_v0(...)
|
||||
|
|
|
@ -1,34 +1,52 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -ipconstprop -instcombine -S | FileCheck %s
|
||||
|
||||
; CHECK: ret i1 true
|
||||
; CHECK: ret i1 true
|
||||
; CHECK-NOT: ret i1 true
|
||||
|
||||
define internal i32 @foo(i1 %C) {
|
||||
br i1 %C, label %T, label %F
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK-NEXT: br i1 [[C:%.*]], label [[T:%.*]], label [[F:%.*]]
|
||||
; CHECK: T:
|
||||
; CHECK-NEXT: ret i32 52
|
||||
; CHECK: F:
|
||||
; CHECK-NEXT: ret i32 52
|
||||
;
|
||||
br i1 %C, label %T, label %F
|
||||
|
||||
T: ; preds = %0
|
||||
ret i32 52
|
||||
ret i32 52
|
||||
|
||||
F: ; preds = %0
|
||||
ret i32 52
|
||||
ret i32 52
|
||||
}
|
||||
|
||||
define i1 @caller(i1 %C) {
|
||||
%X = call i32 @foo( i1 %C ) ; <i32> [#uses=1]
|
||||
%Y = icmp ne i32 %X, 0 ; <i1> [#uses=1]
|
||||
ret i1 %Y
|
||||
; CHECK-LABEL: @caller(
|
||||
; CHECK-NEXT: [[X:%.*]] = call i32 @foo(i1 [[C:%.*]])
|
||||
; CHECK-NEXT: ret i1 true
|
||||
;
|
||||
%X = call i32 @foo( i1 %C ) ; <i32> [#uses=1]
|
||||
%Y = icmp ne i32 %X, 0 ; <i1> [#uses=1]
|
||||
ret i1 %Y
|
||||
}
|
||||
|
||||
define i1 @invokecaller(i1 %C) personality i32 (...)* @__gxx_personality_v0 {
|
||||
%X = invoke i32 @foo( i1 %C ) to label %OK unwind label %FAIL ; <i32> [#uses=1]
|
||||
; CHECK-LABEL: @invokecaller(
|
||||
; CHECK-NEXT: [[X:%.*]] = invoke i32 @foo(i1 [[C:%.*]])
|
||||
; CHECK-NEXT: to label [[OK:%.*]] unwind label [[FAIL:%.*]]
|
||||
; CHECK: OK:
|
||||
; CHECK-NEXT: ret i1 true
|
||||
; CHECK: FAIL:
|
||||
; CHECK-NEXT: [[EXN:%.*]] = landingpad { i8*, i32 }
|
||||
; CHECK-NEXT: cleanup
|
||||
; CHECK-NEXT: ret i1 false
|
||||
;
|
||||
%X = invoke i32 @foo( i1 %C ) to label %OK unwind label %FAIL ; <i32> [#uses=1]
|
||||
OK:
|
||||
%Y = icmp ne i32 %X, 0 ; <i1> [#uses=1]
|
||||
ret i1 %Y
|
||||
%Y = icmp ne i32 %X, 0 ; <i1> [#uses=1]
|
||||
ret i1 %Y
|
||||
FAIL:
|
||||
%exn = landingpad {i8*, i32}
|
||||
cleanup
|
||||
ret i1 false
|
||||
%exn = landingpad {i8*, i32}
|
||||
cleanup
|
||||
ret i1 false
|
||||
}
|
||||
|
||||
declare i32 @__gxx_personality_v0(...)
|
||||
|
|
|
@ -1,13 +1,20 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -ipconstprop -S | FileCheck %s
|
||||
|
||||
;; Check that the 21 constants got propagated properly
|
||||
; CHECK: %M = add i32 21, 21
|
||||
;; Check that the second return values didn't get propagated
|
||||
; CHECK: %N = add i32 %B, %D
|
||||
|
||||
%0 = type { i32, i32 }
|
||||
|
||||
define internal %0 @foo(i1 %Q) {
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK-NEXT: br i1 [[Q:%.*]], label [[T:%.*]], label [[F:%.*]]
|
||||
; CHECK: T:
|
||||
; CHECK-NEXT: [[MRV:%.*]] = insertvalue [[TMP0:%.*]] undef, i32 21, 0
|
||||
; CHECK-NEXT: [[MRV1:%.*]] = insertvalue [[TMP0]] %mrv, i32 22, 1
|
||||
; CHECK-NEXT: ret [[TMP0]] %mrv1
|
||||
; CHECK: F:
|
||||
; CHECK-NEXT: [[MRV2:%.*]] = insertvalue [[TMP0]] undef, i32 21, 0
|
||||
; CHECK-NEXT: [[MRV3:%.*]] = insertvalue [[TMP0]] %mrv2, i32 23, 1
|
||||
; CHECK-NEXT: ret [[TMP0]] %mrv3
|
||||
;
|
||||
br i1 %Q, label %T, label %F
|
||||
|
||||
T: ; preds = %0
|
||||
|
@ -22,6 +29,16 @@ F: ; preds = %0
|
|||
}
|
||||
|
||||
define internal %0 @bar(i1 %Q) {
|
||||
; CHECK-LABEL: @bar(
|
||||
; CHECK-NEXT: [[A:%.*]] = insertvalue [[TMP0:%.*]] undef, i32 21, 0
|
||||
; CHECK-NEXT: br i1 [[Q:%.*]], label [[T:%.*]], label [[F:%.*]]
|
||||
; CHECK: T:
|
||||
; CHECK-NEXT: [[B:%.*]] = insertvalue [[TMP0]] %A, i32 22, 1
|
||||
; CHECK-NEXT: ret [[TMP0]] %B
|
||||
; CHECK: F:
|
||||
; CHECK-NEXT: [[C:%.*]] = insertvalue [[TMP0]] %A, i32 23, 1
|
||||
; CHECK-NEXT: ret [[TMP0]] %C
|
||||
;
|
||||
%A = insertvalue %0 undef, i32 21, 0
|
||||
br i1 %Q, label %T, label %F
|
||||
|
||||
|
@ -35,6 +52,15 @@ F: ; preds = %0
|
|||
}
|
||||
|
||||
define %0 @caller(i1 %Q) {
|
||||
; CHECK-LABEL: @caller(
|
||||
; CHECK-NEXT: [[X:%.*]] = call [[TMP0:%.*]] @foo(i1 [[Q:%.*]])
|
||||
; CHECK-NEXT: [[B:%.*]] = extractvalue [[TMP0]] %X, 1
|
||||
; CHECK-NEXT: [[Y:%.*]] = call [[TMP0]] @bar(i1 [[Q]])
|
||||
; CHECK-NEXT: [[D:%.*]] = extractvalue [[TMP0]] %Y, 1
|
||||
; CHECK-NEXT: [[M:%.*]] = add i32 21, 21
|
||||
; CHECK-NEXT: [[N:%.*]] = add i32 [[B]], [[D]]
|
||||
; CHECK-NEXT: ret [[TMP0]] %X
|
||||
;
|
||||
%X = call %0 @foo(i1 %Q)
|
||||
%A = extractvalue %0 %X, 0
|
||||
%B = extractvalue %0 %X, 1
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -ipconstprop -S < %s | FileCheck %s
|
||||
;
|
||||
; #include <threads.h>
|
||||
|
@ -20,10 +21,14 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|||
@gsh = dso_local global i32 0, align 4
|
||||
|
||||
define internal i32 @callee(i32* %thread_local_ptr, i32* %shared_ptr) {
|
||||
; CHECK-LABEL: @callee(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[TMP:%.*]] = load i32, i32* [[THREAD_LOCAL_PTR:%.*]], align 4
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* @gsh, align 4
|
||||
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP]], [[TMP1]]
|
||||
; CHECK-NEXT: ret i32 [[ADD]]
|
||||
;
|
||||
entry:
|
||||
; CHECK: %tmp = load i32, i32* %thread_local_ptr, align 4
|
||||
; CHECK: %tmp1 = load i32, i32* @gsh, align 4
|
||||
; CHECK: %add = add nsw i32 %tmp, %tmp1
|
||||
%tmp = load i32, i32* %thread_local_ptr, align 4
|
||||
%tmp1 = load i32, i32* %shared_ptr, align 4
|
||||
%add = add nsw i32 %tmp, %tmp1
|
||||
|
@ -31,6 +36,11 @@ entry:
|
|||
}
|
||||
|
||||
define dso_local void @caller() {
|
||||
; CHECK-LABEL: @caller(
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: call void @broker(i32* nonnull @gtl, i32 (i32*, i32*)* nonnull @callee, i32* nonnull @gsh)
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
entry:
|
||||
call void @broker(i32* nonnull @gtl, i32 (i32*, i32*)* nonnull @callee, i32* nonnull @gsh)
|
||||
ret void
|
||||
|
|
Loading…
Reference in New Issue