1
+ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
1
2
; RUN: opt -S -licm < %s | FileCheck %s
2
3
3
4
; Note: the !invariant.load is there just solely to let us call @use()
@@ -10,12 +11,16 @@ declare void @use(i32)
10
11
11
12
define void @f_0 (i8* align 4 dereferenceable (1024 ) %ptr ) {
12
13
; CHECK-LABEL: @f_0(
13
- ; CHECK: entry:
14
- ; CHECK: %val = load i32, i32* %ptr.i32
15
- ; CHECK: br label %loop
16
- ; CHECK: loop:
17
- ; CHECK: call void @use(i32 0)
18
- ; CHECK-NEXT: call void @use(i32 %val)
14
+ ; CHECK-NEXT: entry:
15
+ ; CHECK-NEXT: [[PTR_GEP:%.*]] = getelementptr i8, i8* [[PTR:%.*]], i32 32
16
+ ; CHECK-NEXT: [[PTR_I32:%.*]] = bitcast i8* [[PTR_GEP]] to i32*
17
+ ; CHECK-NEXT: [[VAL:%.*]] = load i32, i32* [[PTR_I32]], align 4
18
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
19
+ ; CHECK: loop:
20
+ ; CHECK-NEXT: call void @use(i32 0)
21
+ ; CHECK-NEXT: call void @use(i32 [[VAL]])
22
+ ; CHECK-NEXT: br label [[LOOP]]
23
+ ;
19
24
20
25
21
26
entry:
@@ -32,18 +37,27 @@ loop:
32
37
33
38
define void @f_1 (i8* align 4 dereferenceable_or_null (1024 ) %ptr ) {
34
39
; CHECK-LABEL: @f_1(
40
+ ; CHECK-NEXT: entry:
41
+ ; CHECK-NEXT: [[PTR_GEP:%.*]] = getelementptr i8, i8* [[PTR:%.*]], i32 32
42
+ ; CHECK-NEXT: [[PTR_I32:%.*]] = bitcast i8* [[PTR_GEP]] to i32*
43
+ ; CHECK-NEXT: [[PTR_IS_NULL:%.*]] = icmp eq i8* [[PTR]], null
44
+ ; CHECK-NEXT: br i1 [[PTR_IS_NULL]], label [[LEAVE:%.*]], label [[LOOP_PREHEADER:%.*]]
45
+ ; CHECK: loop.preheader:
46
+ ; CHECK-NEXT: [[VAL:%.*]] = load i32, i32* [[PTR_I32]], align 4
47
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
48
+ ; CHECK: loop:
49
+ ; CHECK-NEXT: call void @use(i32 0)
50
+ ; CHECK-NEXT: call void @use(i32 [[VAL]])
51
+ ; CHECK-NEXT: br label [[LOOP]]
52
+ ; CHECK: leave:
53
+ ; CHECK-NEXT: ret void
54
+ ;
35
55
entry:
36
56
%ptr.gep = getelementptr i8 , i8* %ptr , i32 32
37
57
%ptr.i32 = bitcast i8* %ptr.gep to i32*
38
58
%ptr_is_null = icmp eq i8* %ptr , null
39
59
br i1 %ptr_is_null , label %leave , label %loop
40
60
41
- ; CHECK: loop.preheader:
42
- ; CHECK: %val = load i32, i32* %ptr.i32
43
- ; CHECK: br label %loop
44
- ; CHECK: loop:
45
- ; CHECK: call void @use(i32 0)
46
- ; CHECK-NEXT: call void @use(i32 %val)
47
61
48
62
loop:
49
63
call void @use (i32 0 )
@@ -57,10 +71,21 @@ leave:
57
71
58
72
define void @f_2 (i8* align 4 dereferenceable_or_null (1024 ) %ptr ) {
59
73
; CHECK-LABEL: @f_2(
60
- ; CHECK-NOT: load
61
- ; CHECK: call void @use(i32 0)
62
- ; CHECK-NEXT: %val = load i32, i32* %ptr.i32, align 4, !invariant.load !0
63
- ; CHECK-NEXT: call void @use(i32 %val)
74
+ ; CHECK-NEXT: entry:
75
+ ; CHECK-NEXT: [[PTR_GEP:%.*]] = getelementptr i8, i8* [[PTR:%.*]], i32 30
76
+ ; CHECK-NEXT: [[PTR_I32:%.*]] = bitcast i8* [[PTR_GEP]] to i32*
77
+ ; CHECK-NEXT: [[PTR_IS_NULL:%.*]] = icmp eq i8* [[PTR]], null
78
+ ; CHECK-NEXT: br i1 [[PTR_IS_NULL]], label [[LEAVE:%.*]], label [[LOOP_PREHEADER:%.*]]
79
+ ; CHECK: loop.preheader:
80
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
81
+ ; CHECK: loop:
82
+ ; CHECK-NEXT: call void @use(i32 0)
83
+ ; CHECK-NEXT: [[VAL:%.*]] = load i32, i32* [[PTR_I32]], align 4, !invariant.load !0
84
+ ; CHECK-NEXT: call void @use(i32 [[VAL]])
85
+ ; CHECK-NEXT: br label [[LOOP]]
86
+ ; CHECK: leave:
87
+ ; CHECK-NEXT: ret void
88
+ ;
64
89
65
90
entry:
66
91
;; Can't hoist, since the alignment does not work out -- (<4 byte
@@ -83,13 +108,15 @@ leave:
83
108
84
109
define void @checkLaunder (i8* align 4 dereferenceable (1024 ) %p ) {
85
110
; CHECK-LABEL: @checkLaunder(
86
- ; CHECK: entry:
87
- ; CHECK: %l = call i8* @llvm.launder.invariant.group.p0i8(i8* %p)
88
- ; CHECK: %val = load i8, i8* %l
89
- ; CHECK: br label %loop
90
- ; CHECK: loop:
91
- ; CHECK: call void @use(i32 0)
92
- ; CHECK-NEXT: call void @use8(i8 %val)
111
+ ; CHECK-NEXT: entry:
112
+ ; CHECK-NEXT: [[L:%.*]] = call i8* @llvm.launder.invariant.group.p0i8(i8* [[P:%.*]])
113
+ ; CHECK-NEXT: [[VAL:%.*]] = load i8, i8* [[L]], align 1
114
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
115
+ ; CHECK: loop:
116
+ ; CHECK-NEXT: call void @use(i32 0)
117
+ ; CHECK-NEXT: call void @use8(i8 [[VAL]])
118
+ ; CHECK-NEXT: br label [[LOOP]]
119
+ ;
93
120
94
121
entry:
95
122
%l = call i8* @llvm.launder.invariant.group.p0i8 (i8* %p )
0 commit comments