OLD | NEW |
(Empty) | |
| 1 ; RUN: opt -S -nacl-strip-attributes %s 2>&1 | FileCheck %s |
| 2 |
| 3 |
| 4 ; Check that we emit a warning for some special meaning sections: |
| 5 ; CHECK: Warning: func_init_array will have its section (.init_array) stripped. |
| 6 ; CHECK-NOT: Warning: __rustc_debug_gdb_scripts_section__ will have its section |
| 7 |
| 8 @var = unnamed_addr global i32 0 |
| 9 ; CHECK: @var = global i32 0 |
| 10 |
| 11 @__rustc_debug_gdb_scripts_section__ = internal unnamed_addr constant [34 x i8]
c"\01gdb_load_rust_pretty_printers.py\00", section ".debug_gdb_scripts", align 1 |
| 12 ; CHECK: @__rustc_debug_gdb_scripts_section__ = internal constant [34 x i8] c"\0
1gdb_load_rust_pretty_printers.py\00", align 1 |
| 13 |
| 14 define void @func_section() section ".some_section" { |
| 15 ret void |
| 16 } |
| 17 ; CHECK-LABEL: define void @func_section() { |
| 18 |
| 19 define void @func_init_array() section ".init_array" { |
| 20 ret void |
| 21 } |
| 22 ; CHECK-LABEL: define void @func_init_array() { |
| 23 |
| 24 |
| 25 define fastcc void @func_attrs(i32 inreg, i32 zeroext) |
| 26 unnamed_addr noreturn nounwind readonly align 8 { |
| 27 ret void |
| 28 } |
| 29 ; CHECK: define void @func_attrs(i32, i32) { |
| 30 |
| 31 define hidden void @hidden_visibility() { |
| 32 ret void |
| 33 } |
| 34 ; CHECK: define void @hidden_visibility() { |
| 35 |
| 36 define protected void @protected_visibility() { |
| 37 ret void |
| 38 } |
| 39 ; CHECK: define void @protected_visibility() { |
| 40 |
| 41 |
| 42 define void @call_attrs() { |
| 43 call fastcc void @func_attrs(i32 inreg 10, i32 zeroext 20) noreturn nounwind r
eadonly |
| 44 ret void |
| 45 } |
| 46 ; CHECK: define void @call_attrs() |
| 47 ; CHECK: call void @func_attrs(i32 10, i32 20){{$}} |
| 48 |
| 49 |
| 50 ; We currently don't attempt to strip attributes from intrinsic |
| 51 ; declarations because the reader automatically inserts attributes |
| 52 ; based on built-in knowledge of intrinsics, so it is difficult to get |
| 53 ; rid of them here. |
| 54 declare i8* @llvm.nacl.read.tp() |
| 55 ; CHECK: declare i8* @llvm.nacl.read.tp() #{{[0-9]+}} |
| 56 |
| 57 define void @arithmetic_attrs() { |
| 58 %add = add nsw i32 1, 2 |
| 59 %shl = shl nuw i32 3, 4 |
| 60 %lshr = lshr exact i32 2, 1 |
| 61 ret void |
| 62 } |
| 63 ; CHECK: define void @arithmetic_attrs() { |
| 64 ; CHECK-NEXT: %add = add i32 1, 2 |
| 65 ; CHECK-NEXT: %shl = shl i32 3, 4 |
| 66 ; CHECK-NEXT: %lshr = lshr i32 2, 1 |
| 67 |
| 68 |
| 69 ; Implicit default alignments are changed to explicit alignments. |
| 70 define void @default_alignment_attrs(float %f, double %d) { |
| 71 load i8* null |
| 72 load i32* null |
| 73 load float* null |
| 74 load double* null |
| 75 |
| 76 store i8 100, i8* null |
| 77 store i32 100, i32* null |
| 78 store float %f, float* null |
| 79 store double %d, double* null |
| 80 ret void |
| 81 } |
| 82 ; CHECK: define void @default_alignment_attrs |
| 83 ; CHECK-NEXT: load i8* null, align 1 |
| 84 ; CHECK-NEXT: load i32* null, align 1 |
| 85 ; CHECK-NEXT: load float* null, align 4 |
| 86 ; CHECK-NEXT: load double* null, align 8 |
| 87 ; CHECK-NEXT: store i8 100, i8* null, align 1 |
| 88 ; CHECK-NEXT: store i32 100, i32* null, align 1 |
| 89 ; CHECK-NEXT: store float %f, float* null, align 4 |
| 90 ; CHECK-NEXT: store double %d, double* null, align 8 |
| 91 |
| 92 define void @reduce_alignment_assumptions() { |
| 93 load i32* null, align 4 |
| 94 load float* null, align 2 |
| 95 load float* null, align 4 |
| 96 load float* null, align 8 |
| 97 load double* null, align 2 |
| 98 load double* null, align 8 |
| 99 load double* null, align 16 |
| 100 |
| 101 ; Higher alignment assumptions must be retained for atomics. |
| 102 load atomic i32* null seq_cst, align 4 |
| 103 load atomic i32* null seq_cst, align 8 |
| 104 store atomic i32 100, i32* null seq_cst, align 4 |
| 105 store atomic i32 100, i32* null seq_cst, align 8 |
| 106 ret void |
| 107 } |
| 108 ; CHECK: define void @reduce_alignment_assumptions |
| 109 ; CHECK-NEXT: load i32* null, align 1 |
| 110 ; CHECK-NEXT: load float* null, align 1 |
| 111 ; CHECK-NEXT: load float* null, align 4 |
| 112 ; CHECK-NEXT: load float* null, align 4 |
| 113 ; CHECK-NEXT: load double* null, align 1 |
| 114 ; CHECK-NEXT: load double* null, align 8 |
| 115 ; CHECK-NEXT: load double* null, align 8 |
| 116 ; CHECK-NEXT: load atomic i32* null seq_cst, align 4 |
| 117 ; CHECK-NEXT: load atomic i32* null seq_cst, align 4 |
| 118 ; CHECK-NEXT: store atomic i32 100, i32* null seq_cst, align 4 |
| 119 ; CHECK-NEXT: store atomic i32 100, i32* null seq_cst, align 4 |
| 120 |
| 121 declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) |
| 122 declare void @llvm.memmove.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) |
| 123 declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i32, i1) |
| 124 |
| 125 define void @reduce_memcpy_alignment_assumptions(i8* %ptr) { |
| 126 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %ptr, i8* %ptr, |
| 127 i32 20, i32 4, i1 false) |
| 128 call void @llvm.memmove.p0i8.p0i8.i32(i8* %ptr, i8* %ptr, |
| 129 i32 20, i32 4, i1 false) |
| 130 call void @llvm.memset.p0i8.i32(i8* %ptr, i8 99, |
| 131 i32 20, i32 4, i1 false) |
| 132 ret void |
| 133 } |
| 134 ; CHECK: define void @reduce_memcpy_alignment_assumptions |
| 135 ; CHECK-NEXT: call void @llvm.memcpy.{{.*}} i32 20, i32 1, i1 false) |
| 136 ; CHECK-NEXT: call void @llvm.memmove.{{.*}} i32 20, i32 1, i1 false) |
| 137 ; CHECK-NEXT: call void @llvm.memset.{{.*}} i32 20, i32 1, i1 false) |
OLD | NEW |