[stackprotector] Allow for copies from vreg -> vreg to be in a terminator sequence.
[oota-llvm.git] / test / CodeGen / X86 / stack-protector-vreg-to-vreg-copy.ll
1 ; RUN: llc -mtriple i386-unknown-freebsd10.0 -march=x86 --relocation-model=pic %s -o -
2
3 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
4 target triple = "i386-unknown-freebsd10.0"
5
6 @state = internal unnamed_addr global i32 0, align 4
7
8 ; Function Attrs: nounwind sspreq
9 define void @set_state(i32 %s) #0 {
10 entry:
11   store i32 %s, i32* @state, align 4, !tbaa !0
12   ret void
13 }
14
15 ; Function Attrs: nounwind sspreq
16 define void @zero_char(i8* nocapture %p) #0 {
17 entry:
18   store i8 0, i8* %p, align 1, !tbaa !1
19   tail call void @g(i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) #2
20   ret void
21 }
22
23 declare void @g(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) #1
24
25 ; Function Attrs: nounwind sspreq
26 define void @do_something(i32 %i) #0 {
27 entry:
28   %data = alloca [8 x i8], align 1
29   %0 = load i32* @state, align 4, !tbaa !0
30   %cmp = icmp eq i32 %0, 0
31   br i1 %cmp, label %if.then, label %if.else
32
33 if.then:                                          ; preds = %entry
34   tail call fastcc void @send_int(i32 0)
35   br label %if.end
36
37 if.else:                                          ; preds = %entry
38   tail call fastcc void @send_int(i32 %i)
39   %arrayidx = getelementptr inbounds [8 x i8]* %data, i32 0, i32 0
40   call void @zero_char(i8* %arrayidx)
41   br label %if.end
42
43 if.end:                                           ; preds = %if.else, %if.then
44   ret void
45 }
46
47 ; Function Attrs: nounwind sspreq
48 define internal fastcc void @send_int(i32 %p) #0 {
49 entry:
50   tail call void @f(i32 %p) #2
51   tail call void @g(i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) #2
52   ret void
53 }
54
55 declare void @f(i32) #1
56
57 attributes #0 = { nounwind sspreq "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
58 attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
59 attributes #2 = { nounwind }
60
61 !0 = metadata !{metadata !"int", metadata !1}
62 !1 = metadata !{metadata !"omnipotent char", metadata !2}
63 !2 = metadata !{metadata !"Simple C/C++ TBAA"}