Index: test/NaCl/X86/pnacl-avoids-r11-x86-64.ll |
diff --git a/test/NaCl/X86/pnacl-avoids-r11-x86-64.ll b/test/NaCl/X86/pnacl-avoids-r11-x86-64.ll |
new file mode 100644 |
index 0000000000000000000000000000000000000000..72ecdb35fb68c244a4aaf9eaf0bebafba32b3222 |
--- /dev/null |
+++ b/test/NaCl/X86/pnacl-avoids-r11-x86-64.ll |
@@ -0,0 +1,131 @@ |
+; The NACLON test verifies that %r11 and %r11d are not used except as |
+; part of the return sequence. |
+; |
+; RUN: pnacl-llc -O2 -mtriple=x86_64-none-nacl < %s | \ |
+; RUN: FileCheck %s --check-prefix=NACLON |
+; |
+; The NACLOFF test verifies that %r11 would normally be used if PNaCl |
+; weren't reserving r11 for its own uses, to be sure NACLON is a |
+; valid test. |
+; |
+; RUN: pnacl-llc -O2 -mtriple=x86_64-linux < %s | \ |
+; RUN: FileCheck %s --check-prefix=NACLOFF |
+; |
+; NACLON: RegisterPressure: |
+; NACLON-NOT: %r11 |
+; NACLON: popq %r11 |
+; NACLON: nacljmp %r11d, %r15 |
+; |
+; NACLOFF: RegisterPressure: |
+; NACLOFF: %r11 |
+; NACLOFF: ret |
+; ModuleID = 'pnacl-avoids-r11-x86-64.c' |
+target datalayout = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-p:32:32:32-v128:32:32" |
+target triple = "le32-unknown-nacl" |
+ |
+@v1a = external global i32 |
+@v1b = external global i32 |
+@v2a = external global i32 |
+@v2b = external global i32 |
+@v3a = external global i32 |
+@v3b = external global i32 |
+@v4a = external global i32 |
+@v4b = external global i32 |
+ |
+; Function Attrs: nounwind |
+define void @RegisterPressure() #0 { |
+entry: |
+ %call = tail call i32 @GetValue() #2 |
+ %call1 = tail call i32 @GetValue() #2 |
+ %call2 = tail call i32 @GetValue() #2 |
+ %call3 = tail call i32 @GetValue() #2 |
+ %call4 = tail call i32 @GetValue() #2 |
+ %call5 = tail call i32 @GetValue() #2 |
+ %call6 = tail call i32 @GetValue() #2 |
+ %call7 = tail call i32 @GetValue() #2 |
+ %call8 = tail call i32 @GetValue() #2 |
+ %call9 = tail call i32 @GetValue() #2 |
+ %call10 = tail call i32 @GetValue() #2 |
+ %call11 = tail call i32 @GetValue() #2 |
+ %call12 = tail call i32 @GetValue() #2 |
+ %call13 = tail call i32 @GetValue() #2 |
+ %call14 = tail call i32 @GetValue() #2 |
+ %call15 = tail call i32 @GetValue() #2 |
+ tail call void @Use(i32 %call, i32 %call1, i32 %call2, i32 %call3, i32 %call4, i32 %call5, i32 %call6, i32 %call7, i32 %call8, i32 %call9, i32 %call10, i32 %call11, i32 %call12, i32 %call13, i32 %call14, i32 %call15) #2 |
+ tail call void @Use(i32 %call, i32 %call1, i32 %call2, i32 %call3, i32 %call4, i32 %call5, i32 %call6, i32 %call7, i32 %call8, i32 %call9, i32 %call10, i32 %call11, i32 %call12, i32 %call13, i32 %call14, i32 %call15) #2 |
+ %add = add nsw i32 %call1, %call |
+ %add16 = add nsw i32 %add, %call2 |
+ %add17 = add nsw i32 %add16, %call3 |
+ %add18 = add nsw i32 %add17, %call4 |
+ %add19 = add nsw i32 %add18, %call5 |
+ %add20 = add nsw i32 %add19, %call6 |
+ %add21 = add nsw i32 %add20, %call7 |
+ store volatile i32 %add21, i32* @v1a, align 4, !tbaa !0 |
+ %add22 = add nsw i32 %call9, %call8 |
+ %add23 = add nsw i32 %add22, %call10 |
+ %add24 = add nsw i32 %add23, %call11 |
+ %add25 = add nsw i32 %add24, %call12 |
+ %add26 = add nsw i32 %add25, %call13 |
+ %add27 = add nsw i32 %add26, %call14 |
+ %add28 = add nsw i32 %add27, %call15 |
+ store volatile i32 %add28, i32* @v1b, align 4, !tbaa !0 |
+ %add32 = add nsw i32 %call8, %add17 |
+ %add33 = add nsw i32 %add32, %call9 |
+ %add34 = add nsw i32 %add33, %call10 |
+ %add35 = add nsw i32 %add34, %call11 |
+ store volatile i32 %add35, i32* @v2a, align 4, !tbaa !0 |
+ %add36 = add nsw i32 %call5, %call4 |
+ %add37 = add nsw i32 %add36, %call6 |
+ %add38 = add nsw i32 %add37, %call7 |
+ %add39 = add nsw i32 %add38, %call12 |
+ %add40 = add nsw i32 %add39, %call13 |
+ %add41 = add nsw i32 %add40, %call14 |
+ %add42 = add nsw i32 %add41, %call15 |
+ store volatile i32 %add42, i32* @v2b, align 4, !tbaa !0 |
+ %add44 = add nsw i32 %call4, %add |
+ %add45 = add nsw i32 %add44, %call5 |
+ %add46 = add nsw i32 %add45, %call8 |
+ %add47 = add nsw i32 %add46, %call9 |
+ %add48 = add nsw i32 %add47, %call12 |
+ %add49 = add nsw i32 %add48, %call13 |
+ store volatile i32 %add49, i32* @v3a, align 4, !tbaa !0 |
+ %add50 = add nsw i32 %call3, %call2 |
+ %add51 = add nsw i32 %add50, %call6 |
+ %add52 = add nsw i32 %add51, %call7 |
+ %add53 = add nsw i32 %add52, %call10 |
+ %add54 = add nsw i32 %add53, %call11 |
+ %add55 = add nsw i32 %add54, %call14 |
+ %add56 = add nsw i32 %add55, %call15 |
+ store volatile i32 %add56, i32* @v3b, align 4, !tbaa !0 |
+ %add57 = add nsw i32 %call2, %call |
+ %add58 = add nsw i32 %add57, %call4 |
+ %add59 = add nsw i32 %add58, %call6 |
+ %add60 = add nsw i32 %add59, %call8 |
+ %add61 = add nsw i32 %add60, %call10 |
+ %add62 = add nsw i32 %add61, %call12 |
+ %add63 = add nsw i32 %add62, %call14 |
+ store volatile i32 %add63, i32* @v4a, align 4, !tbaa !0 |
+ %add64 = add nsw i32 %call3, %call1 |
+ %add65 = add nsw i32 %add64, %call5 |
+ %add66 = add nsw i32 %add65, %call7 |
+ %add67 = add nsw i32 %add66, %call9 |
+ %add68 = add nsw i32 %add67, %call11 |
+ %add69 = add nsw i32 %add68, %call13 |
+ %add70 = add nsw i32 %add69, %call15 |
+ store volatile i32 %add70, i32* @v4b, align 4, !tbaa !0 |
+ tail call void @Use(i32 %call, i32 %call1, i32 %call2, i32 %call3, i32 %call4, i32 %call5, i32 %call6, i32 %call7, i32 %call8, i32 %call9, i32 %call10, i32 %call11, i32 %call12, i32 %call13, i32 %call14, i32 %call15) #2 |
+ tail call void @Use(i32 %call, i32 %call1, i32 %call2, i32 %call3, i32 %call4, i32 %call5, i32 %call6, i32 %call7, i32 %call8, i32 %call9, i32 %call10, i32 %call11, i32 %call12, i32 %call13, i32 %call14, i32 %call15) #2 |
+ ret void |
+} |
+ |
+declare i32 @GetValue() #1 |
+ |
+declare void @Use(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) #1 |
+ |
+attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } |
+attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" } |
+attributes #2 = { nounwind } |
+ |
+!0 = metadata !{metadata !"int", metadata !1} |
+!1 = metadata !{metadata !"omnipotent char", metadata !2} |
+!2 = metadata !{metadata !"Simple C/C++ TBAA"} |