1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2; RUN: opt -passes='early-cse<memssa>' -S %s | FileCheck %s 3 4declare void @foo(ptr) 5 6define ptr @align_replacement_does_not_have_align_metadata(ptr noalias %p) { 7; CHECK-LABEL: define ptr @align_replacement_does_not_have_align_metadata( 8; CHECK-SAME: ptr noalias [[P:%.*]]) { 9; CHECK-NEXT: [[L_1:%.*]] = load ptr, ptr [[P]], align 8 10; CHECK-NEXT: call void @foo(ptr [[L_1]]) 11; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[L_1]], i64 4 12; CHECK-NEXT: store ptr [[GEP]], ptr [[P]], align 8 13; CHECK-NEXT: ret ptr [[GEP]] 14; 15 %l.1 = load ptr, ptr %p, align 8 16 call void @foo(ptr %l.1) 17 %l.2 = load ptr, ptr %p, align 8 18 %gep = getelementptr i8, ptr %l.2, i64 4 19 store ptr %gep, ptr %p, align 8 20 %l.3 = load ptr, ptr %p, align 8, !align !0 21 ret ptr %l.3 22} 23 24define ptr @align_replacement_does_not_have_align_metadata2(ptr noalias %p) { 25; CHECK-LABEL: define ptr @align_replacement_does_not_have_align_metadata2( 26; CHECK-SAME: ptr noalias [[P:%.*]]) { 27; CHECK-NEXT: [[L_1:%.*]] = load ptr, ptr [[P]], align 8 28; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[L_1]], i64 4 29; CHECK-NEXT: store ptr [[GEP]], ptr [[P]], align 8 30; CHECK-NEXT: ret ptr [[GEP]] 31; 32 %l.1 = load ptr, ptr %p, align 8 33 %gep = getelementptr i8, ptr %l.1, i64 4 34 store ptr %gep, ptr %p, align 8 35 %l.2 = load ptr, ptr %p, align 8, !align !0 36 ret ptr %l.2 37} 38 39define ptr @align_replacement_has_same_alignment(ptr noalias %p) { 40; CHECK-LABEL: define ptr @align_replacement_has_same_alignment( 41; CHECK-SAME: ptr noalias [[P:%.*]]) { 42; CHECK-NEXT: [[L_1:%.*]] = load ptr, ptr [[P]], align 8, !align [[META0:![0-9]+]] 43; CHECK-NEXT: call void @foo(ptr [[L_1]]) 44; CHECK-NEXT: ret ptr [[L_1]] 45; 46 %l.1 = load ptr, ptr %p, align 8, !align !0 47 call void @foo(ptr %l.1) 48 %l.2 = load ptr, ptr %p, align 8, !align !0 49 ret ptr %l.2 50} 51 52define ptr @align_replacement_has_smaller_alignment(ptr noalias %p) { 53; CHECK-LABEL: define ptr @align_replacement_has_smaller_alignment( 54; CHECK-SAME: ptr noalias [[P:%.*]]) { 55; CHECK-NEXT: [[L_1:%.*]] = load ptr, ptr [[P]], align 8, !align [[META0]] 56; CHECK-NEXT: call void @foo(ptr [[L_1]]) 57; CHECK-NEXT: ret ptr [[L_1]] 58; 59 %l.1 = load ptr, ptr %p, align 8, !align !0 60 call void @foo(ptr %l.1) 61 %l.2 = load ptr, ptr %p, align 8, !align !1 62 ret ptr %l.2 63} 64 65define ptr @align_replacement_has_larger_alignment(ptr %p) { 66; CHECK-LABEL: define ptr @align_replacement_has_larger_alignment( 67; CHECK-SAME: ptr [[P:%.*]]) { 68; CHECK-NEXT: [[L_1:%.*]] = load ptr, ptr [[P]], align 8, !align [[META1:![0-9]+]] 69; CHECK-NEXT: call void @foo(ptr [[L_1]]) 70; CHECK-NEXT: [[L_2:%.*]] = load ptr, ptr [[P]], align 8, !align [[META0]] 71; CHECK-NEXT: ret ptr [[L_2]] 72; 73 %l.1 = load ptr, ptr %p, align 8, !align !1 74 call void @foo(ptr %l.1) 75 %l.2 = load ptr, ptr %p, align 8, !align !0 76 ret ptr %l.2 77} 78 79define ptr @align_1(ptr %p) { 80; CHECK-LABEL: define ptr @align_1( 81; CHECK-SAME: ptr [[P:%.*]]) { 82; CHECK-NEXT: [[L_1:%.*]] = load ptr, ptr [[P]], align 8 83; CHECK-NEXT: call void @foo(ptr [[L_1]]) 84; CHECK-NEXT: [[L_2:%.*]] = load ptr, ptr [[P]], align 8, !align [[META2:![0-9]+]] 85; CHECK-NEXT: ret ptr [[L_2]] 86; 87 %l.1 = load ptr, ptr %p, align 8 88 call void @foo(ptr %l.1) 89 %l.2 = load ptr, ptr %p, align 8, !align !2 90 ret ptr %l.2 91} 92 93!0 = !{i64 4} 94!1 = !{i64 8} 95!2 = !{i64 1} 96;. 97; CHECK: [[META0]] = !{i64 4} 98; CHECK: [[META1]] = !{i64 8} 99; CHECK: [[META2]] = !{i64 1} 100;. 101