brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.6 KiB · 38d4dfd Raw
181 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; REQUIRES: x86-registered-target3; RUN: opt < %s -passes=newgvn -S | FileCheck %s4;; Now that we do store refinement, we have to verify that we add fake uses5;; when we skip existing stores.6;; We also are testing that various variations that cause stores to move classes7;; have the right class movement happen8;; All of these tests result in verification failures if it does not.9 10source_filename = "bugpoint-output-daef094.bc"11target triple = "x86_64-apple-darwin16.5.0"12 13%struct.eggs = type {}14 15define void @spam(ptr %a, i1 %arg) {16; CHECK-LABEL: @spam(17; CHECK-NEXT:  bb:18; CHECK-NEXT:    store ptr null, ptr [[A:%.*]], align 819; CHECK-NEXT:    br label [[BB1:%.*]]20; CHECK:       bb1:21; CHECK-NEXT:    br i1 [[ARG:%.*]], label [[BB3:%.*]], label [[BB2:%.*]]22; CHECK:       bb2:23; CHECK-NEXT:    call void @baz()24; CHECK-NEXT:    br label [[BB1]]25; CHECK:       bb3:26; CHECK-NEXT:    store i32 0, ptr undef, align 427; CHECK-NEXT:    store ptr null, ptr [[A]], align 828; CHECK-NEXT:    unreachable29;30bb:31  store ptr null, ptr %a32  br label %bb133 34bb1:                                              ; preds = %bb2, %bb35  br i1 %arg, label %bb3, label %bb236 37bb2:                                              ; preds = %bb138  call void @baz()39  br label %bb140 41bb3:                                              ; preds = %bb142  store i32 0, ptr undef43;; This store is defined by a memoryphi of the call and the first store44;; At first, we will prove it equivalent to the first store above.45;; Then the call will become reachable, and the equivalence will be removed46;; Without it being a use of the first store, we will not update the store47;; to reflect this.48  store ptr null, ptr %a49  unreachable50}51 52declare void @baz()53 54 55define void @a(i1 %arg) {56; CHECK-LABEL: @a(57; CHECK-NEXT:  b:58; CHECK-NEXT:    br label [[C:%.*]]59; CHECK:       c:60; CHECK-NEXT:    store i64 undef, ptr null, align 861; CHECK-NEXT:    br label [[E:%.*]]62; CHECK:       e:63; CHECK-NEXT:    store ptr undef, ptr null, align 864; CHECK-NEXT:    br i1 [[ARG:%.*]], label [[C]], label [[E]]65;66b:67  br label %c68 69c:                                                ; preds = %e, %b70  %d = phi ptr [ undef, %b ], [ null, %e ]71  store i64 undef, ptr %d72  br label %e73 74e:                                                ; preds = %e, %c75;; The memory for this load starts out equivalent to just the store in c, we later discover the store after us, and76;; need to make sure the right set of values get marked as changed after memory leaders change77  %g = load ptr, ptr null78  store ptr undef, ptr null79  br i1 %arg, label %c, label %e80}81 82%struct.hoge = type {}83 84define void @widget(ptr %arg, i1 %arg2) {85; CHECK-LABEL: @widget(86; CHECK-NEXT:  bb:87; CHECK-NEXT:    br label [[BB1:%.*]]88; CHECK:       bb1:89; CHECK-NEXT:    [[TMP:%.*]] = phi ptr [ [[ARG:%.*]], [[BB:%.*]] ], [ null, [[BB1]] ]90; CHECK-NEXT:    store ptr [[TMP]], ptr undef, align 891; CHECK-NEXT:    br i1 [[ARG2:%.*]], label [[BB1]], label [[BB2:%.*]]92; CHECK:       bb2:93; CHECK-NEXT:    [[TMP3:%.*]] = phi i64 [ [[TMP8:%.*]], [[BB7:%.*]] ], [ 0, [[BB1]] ]94; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i64 [[TMP3]], 095; CHECK-NEXT:    br i1 [[TMP4]], label [[BB7]], label [[BB5:%.*]]96; CHECK:       bb5:97; CHECK-NEXT:    [[TMP6:%.*]] = load i64, ptr null, align 898; CHECK-NEXT:    call void @quux()99; CHECK-NEXT:    store i64 [[TMP6]], ptr undef, align 8100; CHECK-NEXT:    br label [[BB7]]101; CHECK:       bb7:102; CHECK-NEXT:    [[TMP8]] = add i64 [[TMP3]], 1103; CHECK-NEXT:    br label [[BB2]]104;105bb:106  br label %bb1107 108bb1:                                              ; preds = %bb1, %bb109  %tmp = phi ptr [ %arg, %bb ], [ null, %bb1 ]110  store ptr %tmp, ptr undef111  br i1 %arg2, label %bb1, label %bb2112 113bb2:                                              ; preds = %bb7, %bb1114  %tmp3 = phi i64 [ %tmp8, %bb7 ], [ 0, %bb1 ]115  %tmp4 = icmp eq i64 %tmp3, 0116  br i1 %tmp4, label %bb7, label %bb5117 118bb5:                                              ; preds = %bb2119  ;; Originally thought equal to the store that comes after it until the phi edges120  ;; are completely traversed121  %tmp6 = load i64, ptr null122  call void @quux()123  store i64 %tmp6, ptr undef124  br label %bb7125 126bb7:                                              ; preds = %bb5, %bb2127  %tmp8 = add i64 %tmp3, 1128  br label %bb2129}130 131declare void @quux()132 133%struct.a = type {}134 135define void @b(i1 %arg) {136; CHECK-LABEL: @b(137; CHECK-NEXT:    [[C:%.*]] = alloca [[STRUCT_A:%.*]], align 8138; CHECK-NEXT:    br label [[D:%.*]]139; CHECK:       m:140; CHECK-NEXT:    unreachable141; CHECK:       d:142; CHECK-NEXT:    [[E:%.*]] = load i32, ptr [[C]], align 4143; CHECK-NEXT:    br i1 [[ARG:%.*]], label [[I:%.*]], label [[J:%.*]]144; CHECK:       i:145; CHECK-NEXT:    br i1 true, label [[K:%.*]], label [[M:%.*]]146; CHECK:       k:147; CHECK-NEXT:    br label [[L:%.*]]148; CHECK:       l:149; CHECK-NEXT:    unreachable150; CHECK:       j:151; CHECK-NEXT:    br label [[M]]152;153  %c = alloca %struct.a154  br label %d155 156m:                                                ; preds = %j, %i157  store i32 %e, ptr %h158  unreachable159 160d:                                                ; preds = %0161  %h = getelementptr i8, ptr %c162  %e = load i32, ptr %h163  br i1 %arg, label %i, label %j164 165i:                                                ; preds = %d166  br i1 %arg, label %k, label %m167 168k:                                                ; preds = %i169  br label %l170 171l:                                                ; preds = %k172  %n = phi i32 [ %e, %k ]173  ;; Becomes equal and then not equal to the other store, and174  ;; along the way, the load.175  store i32 %n, ptr %h176  unreachable177 178j:                                                ; preds = %d179  br label %m180}181