Files
clang-p2996/llvm/test/Transforms/SCCP/load-store-range.ll
Bjorn Pettersson 8ebb3eac02 [test] Use -passes syntax when specifying pipeline in some more tests
The legacy PM is deprecated, so update a bunch of lit tests running
opt to use the new PM syntax when specifying the pipeline.
In this patch focus has been put on test cases for ConstantMerge,
ConstraintElimination, CorrelatedValuePropagation, GlobalDCE,
GlobalOpt, SCCP, TailCallElim and PredicateInfo.

Differential Revision: https://reviews.llvm.org/D114516
2021-11-27 09:52:55 +01:00

307 lines
7.4 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -passes=ipsccp -S | FileCheck %s
declare void @use(i1)
@G = internal global i32 0
define void @test1a() {
; CHECK-LABEL: @test1a(
; CHECK-NEXT: [[X:%.*]] = load i32, i32* @G
; CHECK-NEXT: call void @use(i1 true)
; CHECK-NEXT: call void @use(i1 true)
; CHECK-NEXT: call void @use(i1 false)
; CHECK-NEXT: call void @use(i1 false)
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[X]], 20
; CHECK-NEXT: call void @use(i1 [[C_1]])
; CHECK-NEXT: ret void
;
%X = load i32, i32* @G
%t.1 = icmp ne i32 %X, 124
call void @use(i1 %t.1)
%t.2 = icmp ult i32 %X, 124
call void @use(i1 %t.2)
%f.1 = icmp eq i32 %X, 124
call void @use(i1 %f.1)
%f.2 = icmp ugt i32 %X, 123
call void @use(i1 %f.2)
%c.1 = icmp eq i32 %X, 20
call void @use(i1 %c.1)
ret void
}
define void @test1b(i1 %c) {
; CHECK-LABEL: @test1b(
; CHECK-NEXT: br i1 [[C:%.*]], label [[T:%.*]], label [[F:%.*]]
; CHECK: T:
; CHECK-NEXT: store i32 17, i32* @G
; CHECK-NEXT: ret void
; CHECK: F:
; CHECK-NEXT: store i32 123, i32* @G
; CHECK-NEXT: ret void
;
br i1 %c, label %T, label %F
T:
store i32 17, i32* @G
ret void
F:
store i32 123, i32* @G
ret void
}
@H = internal global i32 0
define void @test2a() {
; CHECK-LABEL: @test2a(
; CHECK-NEXT: [[X:%.*]] = load i32, i32* @H
; CHECK-NEXT: call void @use(i1 true)
; CHECK-NEXT: call void @use(i1 true)
; CHECK-NEXT: call void @use(i1 false)
; CHECK-NEXT: call void @use(i1 false)
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[X]], 20
; CHECK-NEXT: call void @use(i1 [[C_1]])
; CHECK-NEXT: ret void
;
%X = load i32, i32* @H
%t.1 = icmp ne i32 %X, 124
call void @use(i1 %t.1)
%t.2 = icmp ult i32 %X, 124
call void @use(i1 %t.2)
%f.1 = icmp eq i32 %X, 124
call void @use(i1 %f.1)
%f.2 = icmp ugt i32 %X, 123
call void @use(i1 %f.2)
%c.1 = icmp eq i32 %X, 20
call void @use(i1 %c.1)
ret void
}
define void @test2b(i1 %c.1, i1 %c.2) {
; CHECK-LABEL: @test2b(
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[T:%.*]], label [[F:%.*]]
; CHECK: T:
; CHECK-NEXT: br i1 [[C_2:%.*]], label [[T_1:%.*]], label [[F_1:%.*]]
; CHECK: T.1:
; CHECK-NEXT: store i32 17, i32* @H
; CHECK-NEXT: ret void
; CHECK: F.1:
; CHECK-NEXT: store i32 20, i32* @H
; CHECK-NEXT: ret void
; CHECK: F:
; CHECK-NEXT: store i32 123, i32* @H
; CHECK-NEXT: ret void
;
br i1 %c.1, label %T, label %F
T:
br i1 %c.2, label %T.1, label %F.1
T.1:
store i32 17, i32* @H
ret void
F.1:
store i32 20, i32* @H
ret void
F:
store i32 123, i32* @H
ret void
}
@I = internal global i32 0
define void @test3a() {
; CHECK-LABEL: @test3a(
; CHECK-NEXT: [[X:%.*]] = load i32, i32* @I
; CHECK-NEXT: call void @use(i1 true)
; CHECK-NEXT: call void @use(i1 true)
; CHECK-NEXT: call void @use(i1 false)
; CHECK-NEXT: call void @use(i1 false)
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[X]], 20
; CHECK-NEXT: call void @use(i1 [[C_1]])
; CHECK-NEXT: ret void
;
%X = load i32, i32* @I
%t.1 = icmp ne i32 %X, 124
call void @use(i1 %t.1)
%t.2 = icmp ult i32 %X, 124
call void @use(i1 %t.2)
%f.1 = icmp eq i32 %X, 124
call void @use(i1 %f.1)
%f.2 = icmp ugt i32 %X, 123
call void @use(i1 %f.2)
%c.1 = icmp eq i32 %X, 20
call void @use(i1 %c.1)
ret void
}
define void @test3b(i1 %c.1, i1 %c.2) {
; CHECK-LABEL: @test3b(
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[T:%.*]], label [[F:%.*]]
; CHECK: T:
; CHECK-NEXT: br label [[EXIT:%.*]]
; CHECK: F:
; CHECK-NEXT: br label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: [[P:%.*]] = phi i32 [ 17, [[T]] ], [ 123, [[F]] ]
; CHECK-NEXT: store i32 [[P]], i32* @I
; CHECK-NEXT: ret void
;
br i1 %c.1, label %T, label %F
T:
br label %exit
F:
br label %exit
exit:
%p = phi i32 [ 17, %T ], [ 123, %F ]
store i32 %p, i32* @I
ret void
}
; Make sure stored values are correctly updated to overdefined.
@J = internal global i32 0
define void @test4a() {
; CHECK-LABEL: @test4a(
; CHECK-NEXT: [[X:%.*]] = load i32, i32* @J
; CHECK-NEXT: [[C_1:%.*]] = icmp ne i32 [[X]], 124
; CHECK-NEXT: call void @use(i1 [[C_1]])
; CHECK-NEXT: [[C_2:%.*]] = icmp ult i32 [[X]], 124
; CHECK-NEXT: call void @use(i1 [[C_2]])
; CHECK-NEXT: [[C_3:%.*]] = icmp eq i32 [[X]], 124
; CHECK-NEXT: call void @use(i1 [[C_3]])
; CHECK-NEXT: [[C_4:%.*]] = icmp ugt i32 [[X]], 123
; CHECK-NEXT: call void @use(i1 [[C_4]])
; CHECK-NEXT: [[C_5:%.*]] = icmp eq i32 [[X]], 20
; CHECK-NEXT: call void @use(i1 [[C_5]])
; CHECK-NEXT: ret void
;
%X = load i32, i32* @J
%c.1 = icmp ne i32 %X, 124
call void @use(i1 %c.1)
%c.2 = icmp ult i32 %X, 124
call void @use(i1 %c.2)
%c.3 = icmp eq i32 %X, 124
call void @use(i1 %c.3)
%c.4 = icmp ugt i32 %X, 123
call void @use(i1 %c.4)
%c.5 = icmp eq i32 %X, 20
call void @use(i1 %c.5)
ret void
}
define void @test4b(i1 %c.1, i1 %c.2, i32 %x) {
; CHECK-LABEL: @test4b(
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[T:%.*]], label [[F:%.*]]
; CHECK: T:
; CHECK-NEXT: br i1 [[C_2:%.*]], label [[T_1:%.*]], label [[F_1:%.*]]
; CHECK: T.1:
; CHECK-NEXT: br label [[EXIT:%.*]]
; CHECK: F.1:
; CHECK-NEXT: br label [[EXIT]]
; CHECK: F:
; CHECK-NEXT: br label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: [[P:%.*]] = phi i32 [ 17, [[T_1]] ], [ [[X:%.*]], [[F_1]] ], [ 123, [[F]] ]
; CHECK-NEXT: store i32 [[P]], i32* @J
; CHECK-NEXT: ret void
;
br i1 %c.1, label %T, label %F
T:
br i1 %c.2, label %T.1, label %F.1
T.1:
br label %exit
F.1:
br label %exit
F:
br label %exit
exit:
%p = phi i32 [ 17, %T.1 ], [ %x, %F.1 ], [ 123, %F ]
store i32 %p, i32* @J
ret void
}
; Same as test1, but storing 4 different values.
@K = internal global i32 501
define void @test5a() {
; CHECK-LABEL: @test5a(
; CHECK-NEXT: [[X:%.*]] = load i32, i32* @K
; CHECK-NEXT: call void @use(i1 true)
; CHECK-NEXT: call void @use(i1 true)
; CHECK-NEXT: call void @use(i1 false)
; CHECK-NEXT: call void @use(i1 false)
; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 [[X]], 510
; CHECK-NEXT: call void @use(i1 [[C_1]])
; CHECK-NEXT: ret void
;
%X = load i32, i32* @K
%t.1 = icmp ne i32 %X, 499
call void @use(i1 %t.1)
%t.2 = icmp ult i32 %X, 600
call void @use(i1 %t.2)
%f.1 = icmp eq i32 %X, 600
call void @use(i1 %f.1)
%f.2 = icmp ugt i32 %X, 600
call void @use(i1 %f.2)
%c.1 = icmp eq i32 %X, 510
call void @use(i1 %c.1)
ret void
}
define void @test5b(i1 %c.1, i1 %c.2) {
; CHECK-LABEL: @test5b(
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[T_1:%.*]], label [[F_1:%.*]]
; CHECK: T.1:
; CHECK-NEXT: br i1 [[C_2:%.*]], label [[T_2:%.*]], label [[F_2:%.*]]
; CHECK: T.2:
; CHECK-NEXT: store i32 500, i32* @K
; CHECK-NEXT: ret void
; CHECK: F.2:
; CHECK-NEXT: store i32 510, i32* @K
; CHECK-NEXT: ret void
; CHECK: F.1:
; CHECK-NEXT: br i1 [[C_2]], label [[T_3:%.*]], label [[F_3:%.*]]
; CHECK: T.3:
; CHECK-NEXT: store i32 520, i32* @K
; CHECK-NEXT: ret void
; CHECK: F.3:
; CHECK-NEXT: store i32 530, i32* @K
; CHECK-NEXT: ret void
;
br i1 %c.1, label %T.1, label %F.1
T.1:
br i1 %c.2, label %T.2, label %F.2
T.2:
store i32 500, i32* @K
ret void
F.2:
store i32 510, i32* @K
ret void
F.1:
br i1 %c.2, label %T.3, label %F.3
T.3:
store i32 520, i32* @K
ret void
F.3:
store i32 530, i32* @K
ret void
}