| OLD | NEW |
| 1 ; RUN: opt -S -normalize-alignment %s 2>&1 | FileCheck %s | 1 ; RUN: opt -S -normalize-alignment %s 2>&1 | FileCheck %s |
| 2 | 2 |
| 3 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" | 3 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" |
| 4 | 4 |
| 5 ; Implicit default alignments are changed to explicit alignments. | 5 ; Implicit default alignments are changed to explicit alignments. |
| 6 define void @default_alignment_attrs(float %f, double %d) { | 6 define void @default_alignment_attrs(float %f, double %d) { |
| 7 load i8* null | 7 load i8, i8* null |
| 8 load i32* null | 8 load i32, i32* null |
| 9 load float* null | 9 load float, float* null |
| 10 load double* null | 10 load double, double* null |
| 11 | 11 |
| 12 store i8 100, i8* null | 12 store i8 100, i8* null |
| 13 store i32 100, i32* null | 13 store i32 100, i32* null |
| 14 store float %f, float* null | 14 store float %f, float* null |
| 15 store double %d, double* null | 15 store double %d, double* null |
| 16 ret void | 16 ret void |
| 17 } | 17 } |
| 18 ; CHECK-LABEL: @default_alignment_attrs | 18 ; CHECK-LABEL: @default_alignment_attrs |
| 19 ; CHECK-NEXT: load i8* null, align 1 | 19 ; CHECK-NEXT: load i8, i8* null, align 1 |
| 20 ; CHECK-NEXT: load i32* null, align 1 | 20 ; CHECK-NEXT: load i32, i32* null, align 1 |
| 21 ; CHECK-NEXT: load float* null, align 4 | 21 ; CHECK-NEXT: load float, float* null, align 4 |
| 22 ; CHECK-NEXT: load double* null, align 8 | 22 ; CHECK-NEXT: load double, double* null, align 8 |
| 23 ; CHECK-NEXT: store i8 100, i8* null, align 1 | 23 ; CHECK-NEXT: store i8 100, i8* null, align 1 |
| 24 ; CHECK-NEXT: store i32 100, i32* null, align 1 | 24 ; CHECK-NEXT: store i32 100, i32* null, align 1 |
| 25 ; CHECK-NEXT: store float %f, float* null, align 4 | 25 ; CHECK-NEXT: store float %f, float* null, align 4 |
| 26 ; CHECK-NEXT: store double %d, double* null, align 8 | 26 ; CHECK-NEXT: store double %d, double* null, align 8 |
| 27 | 27 |
| 28 define void @reduce_alignment_assumptions() { | 28 define void @reduce_alignment_assumptions() { |
| 29 load i32* null, align 4 | 29 load i32, i32* null, align 4 |
| 30 load float* null, align 2 | 30 load float, float* null, align 2 |
| 31 load float* null, align 4 | 31 load float, float* null, align 4 |
| 32 load float* null, align 8 | 32 load float, float* null, align 8 |
| 33 load double* null, align 2 | 33 load double, double* null, align 2 |
| 34 load double* null, align 8 | 34 load double, double* null, align 8 |
| 35 load double* null, align 16 | 35 load double, double* null, align 16 |
| 36 | 36 |
| 37 ; Higher alignment assumptions must be retained for atomics. | 37 ; Higher alignment assumptions must be retained for atomics. |
| 38 load atomic i32* null seq_cst, align 4 | 38 load atomic i32, i32* null seq_cst, align 4 |
| 39 load atomic i32* null seq_cst, align 8 | 39 load atomic i32, i32* null seq_cst, align 8 |
| 40 store atomic i32 100, i32* null seq_cst, align 4 | 40 store atomic i32 100, i32* null seq_cst, align 4 |
| 41 store atomic i32 100, i32* null seq_cst, align 8 | 41 store atomic i32 100, i32* null seq_cst, align 8 |
| 42 ret void | 42 ret void |
| 43 } | 43 } |
| 44 ; CHECK-LABEL: @reduce_alignment_assumptions | 44 ; CHECK-LABEL: @reduce_alignment_assumptions |
| 45 ; CHECK-NEXT: load i32* null, align 1 | 45 ; CHECK-NEXT: load i32, i32* null, align 1 |
| 46 ; CHECK-NEXT: load float* null, align 1 | 46 ; CHECK-NEXT: load float, float* null, align 1 |
| 47 ; CHECK-NEXT: load float* null, align 4 | 47 ; CHECK-NEXT: load float, float* null, align 4 |
| 48 ; CHECK-NEXT: load float* null, align 4 | 48 ; CHECK-NEXT: load float, float* null, align 4 |
| 49 ; CHECK-NEXT: load double* null, align 1 | 49 ; CHECK-NEXT: load double, double* null, align 1 |
| 50 ; CHECK-NEXT: load double* null, align 8 | 50 ; CHECK-NEXT: load double, double* null, align 8 |
| 51 ; CHECK-NEXT: load double* null, align 8 | 51 ; CHECK-NEXT: load double, double* null, align 8 |
| 52 ; CHECK-NEXT: load atomic i32* null seq_cst, align 4 | 52 ; CHECK-NEXT: load atomic i32, i32* null seq_cst, align 4 |
| 53 ; CHECK-NEXT: load atomic i32* null seq_cst, align 4 | 53 ; CHECK-NEXT: load atomic i32, i32* null seq_cst, align 4 |
| 54 ; CHECK-NEXT: store atomic i32 100, i32* null seq_cst, align 4 | 54 ; CHECK-NEXT: store atomic i32 100, i32* null seq_cst, align 4 |
| 55 ; CHECK-NEXT: store atomic i32 100, i32* null seq_cst, align 4 | 55 ; CHECK-NEXT: store atomic i32 100, i32* null seq_cst, align 4 |
| 56 | 56 |
| 57 declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) | 57 declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) |
| 58 declare void @llvm.memmove.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) | 58 declare void @llvm.memmove.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) |
| 59 declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i32, i1) | 59 declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i32, i1) |
| 60 | 60 |
| 61 define void @reduce_memcpy_alignment_assumptions(i8* %ptr) { | 61 define void @reduce_memcpy_alignment_assumptions(i8* %ptr) { |
| 62 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %ptr, i8* %ptr, | 62 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %ptr, i8* %ptr, |
| 63 i32 20, i32 4, i1 false) | 63 i32 20, i32 4, i1 false) |
| 64 call void @llvm.memmove.p0i8.p0i8.i32(i8* %ptr, i8* %ptr, | 64 call void @llvm.memmove.p0i8.p0i8.i32(i8* %ptr, i8* %ptr, |
| 65 i32 20, i32 4, i1 false) | 65 i32 20, i32 4, i1 false) |
| 66 call void @llvm.memset.p0i8.i32(i8* %ptr, i8 99, | 66 call void @llvm.memset.p0i8.i32(i8* %ptr, i8 99, |
| 67 i32 20, i32 4, i1 false) | 67 i32 20, i32 4, i1 false) |
| 68 ret void | 68 ret void |
| 69 } | 69 } |
| 70 ; CHECK-LABEL: @reduce_memcpy_alignment_assumptions | 70 ; CHECK-LABEL: @reduce_memcpy_alignment_assumptions |
| 71 ; CHECK-NEXT: call void @llvm.memcpy.{{.*}} i32 20, i32 1, i1 false) | 71 ; CHECK-NEXT: call void @llvm.memcpy.{{.*}} i32 20, i32 1, i1 false) |
| 72 ; CHECK-NEXT: call void @llvm.memmove.{{.*}} i32 20, i32 1, i1 false) | 72 ; CHECK-NEXT: call void @llvm.memmove.{{.*}} i32 20, i32 1, i1 false) |
| 73 ; CHECK-NEXT: call void @llvm.memset.{{.*}} i32 20, i32 1, i1 false) | 73 ; CHECK-NEXT: call void @llvm.memset.{{.*}} i32 20, i32 1, i1 false) |
| OLD | NEW |