Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / speculate-with-offset.ll
blob04f2cbfb2ba88da2a47a40415a9f3d35fee8d9fa
1 ; RUN: opt -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S < %s | FileCheck %s
3 ; This load is safe to speculate, as it's from a safe offset
4 ; within an alloca.
6 ; CHECK-LABEL: @yes(
7 ; CHECK-NOT: br
9 define void @yes(i1 %c) nounwind {
10 entry:
11   %a = alloca [4 x ptr], align 8
12   %__a.addr = getelementptr [4 x ptr], ptr %a, i64 0, i64 3
13   call void @frob(ptr %__a.addr)
14   br i1 %c, label %if.then, label %if.end
16 if.then:                                          ; preds = %entry
17   br label %return
19 if.end:                                           ; preds = %entry
20   %tmp5 = load ptr, ptr %__a.addr, align 8
21   br label %return
23 return:                                           ; preds = %if.end, %if.then
24   %storemerge = phi ptr [ undef, %if.then ], [ %tmp5, %if.end ]
25   ret void
28 ; CHECK-LABEL: @no0(
29 ; CHECK: br i1 %c
31 define void @no0(i1 %c) nounwind {
32 entry:
33   %a = alloca [4 x ptr], align 8
34   %__a.addr = getelementptr [4 x ptr], ptr %a, i64 0, i64 4
35   call void @frob(ptr %__a.addr)
36   br i1 %c, label %if.then, label %if.end
38 if.then:                                          ; preds = %entry
39   br label %return
41 if.end:                                           ; preds = %entry
42   %tmp5 = load ptr, ptr %__a.addr, align 8
43   br label %return
45 return:                                           ; preds = %if.end, %if.then
46   %storemerge = phi ptr [ undef, %if.then ], [ %tmp5, %if.end ]
47   ret void
50 ; CHECK-LABEL: @no1(
51 ; CHECK: br i1 %c
53 define void @no1(i1 %c, i64 %n) nounwind {
54 entry:
55   %a = alloca [4 x ptr], align 8
56   %__a.addr = getelementptr [4 x ptr], ptr %a, i64 0, i64 %n
57   call void @frob(ptr %__a.addr)
58   br i1 %c, label %if.then, label %if.end
60 if.then:                                          ; preds = %entry
61   br label %return
63 if.end:                                           ; preds = %entry
64   %tmp5 = load ptr, ptr %__a.addr, align 8
65   br label %return
67 return:                                           ; preds = %if.end, %if.then
68   %storemerge = phi ptr [ undef, %if.then ], [ %tmp5, %if.end ]
69   ret void
72 ; CHECK-LABEL: @no2(
73 ; CHECK: br i1 %c
75 define void @no2(i1 %c, i64 %n) nounwind {
76 entry:
77   %a = alloca [4 x ptr], align 8
78   %__a.addr = getelementptr [4 x ptr], ptr %a, i64 1, i64 0
79   call void @frob(ptr %__a.addr)
80   br i1 %c, label %if.then, label %if.end
82 if.then:                                          ; preds = %entry
83   br label %return
85 if.end:                                           ; preds = %entry
86   %tmp5 = load ptr, ptr %__a.addr, align 8
87   br label %return
89 return:                                           ; preds = %if.end, %if.then
90   %storemerge = phi ptr [ undef, %if.then ], [ %tmp5, %if.end ]
91   ret void
94 declare void @frob(ptr nocapture %p)