100 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=newgvn -enable-phi-of-ops=true -S < %s | FileCheck %s3; RUN: opt -passes=newgvn -enable-phi-of-ops=true -S -o - %s | FileCheck %s4 5target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"6 7;; All the loads in this testcase are useless, but it requires understanding that repeated8;; stores of the same value do not change the memory state to eliminate them.9 10define i32 @foo(ptr, i32) {11; CHECK-LABEL: @foo(12; CHECK-NEXT: store i32 5, ptr [[TMP0:%.*]], align 413; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1:%.*]], 014; CHECK-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP5:%.*]]15; CHECK: 4:16; CHECK-NEXT: br label [[TMP5]]17; CHECK: 5:18; CHECK-NEXT: [[DOT0:%.*]] = phi i32 [ 10, [[TMP4]] ], [ 5, [[TMP2:%.*]] ]19; CHECK-NEXT: br i1 [[TMP3]], label [[TMP6:%.*]], label [[TMP8:%.*]]20; CHECK: 6:21; CHECK-NEXT: [[TMP7:%.*]] = add nsw i32 [[DOT0]], 522; CHECK-NEXT: br label [[TMP8]]23; CHECK: 8:24; CHECK-NEXT: [[DOT1:%.*]] = phi i32 [ [[TMP7]], [[TMP6]] ], [ [[DOT0]], [[TMP5]] ]25; CHECK-NEXT: ret i32 [[DOT1]]26;27 store i32 5, ptr %0, align 428 %3 = icmp ne i32 %1, 029 br i1 %3, label %4, label %730 31; <label>:4: ; preds = %232 %5 = load i32, ptr %0, align 433 %6 = add nsw i32 5, %534 br label %735 36; <label>:7: ; preds = %4, %237 %.0 = phi i32 [ %6, %4 ], [ 5, %2 ]38 store i32 5, ptr %0, align 439 %8 = icmp ne i32 %1, 040 br i1 %8, label %9, label %1241 42; <label>:9: ; preds = %743 %10 = load i32, ptr %0, align 444 %11 = add nsw i32 %.0, %1045 br label %1246 47; <label>:12: ; preds = %9, %748 %.1 = phi i32 [ %11, %9 ], [ %.0, %7 ]49 ret i32 %.150}51 52;; This is similar to the above, but it is a conditional store of the same value53;; which requires value numbering MemoryPhi properly to resolve.54define i32 @foo2(ptr, i32) {55; CHECK-LABEL: @foo2(56; CHECK-NEXT: store i32 5, ptr [[TMP0:%.*]], align 457; CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP1:%.*]], 058; CHECK-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP5:%.*]]59; CHECK: 4:60; CHECK-NEXT: br label [[TMP6:%.*]]61; CHECK: 5:62; CHECK-NEXT: br label [[TMP6]]63; CHECK: 6:64; CHECK-NEXT: [[DOT0:%.*]] = phi i32 [ 10, [[TMP4]] ], [ 5, [[TMP5]] ]65; CHECK-NEXT: br i1 [[TMP3]], label [[TMP7:%.*]], label [[TMP9:%.*]]66; CHECK: 7:67; CHECK-NEXT: [[TMP8:%.*]] = add nsw i32 [[DOT0]], 568; CHECK-NEXT: br label [[TMP9]]69; CHECK: 9:70; CHECK-NEXT: [[DOT1:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ [[DOT0]], [[TMP6]] ]71; CHECK-NEXT: ret i32 [[DOT1]]72;73 store i32 5, ptr %0, align 474 %3 = icmp ne i32 %1, 075 br i1 %3, label %4, label %776 77; <label>:4: ; preds = %278 %5 = load i32, ptr %0, align 479 %6 = add nsw i32 5, %580 br label %881 82; <label>:7: ; preds = %283 store i32 5, ptr %0, align 484 br label %885 86; <label>:8: ; preds = %7, %487 %.0 = phi i32 [ %6, %4 ], [ 5, %7 ]88 %9 = icmp ne i32 %1, 089 br i1 %9, label %10, label %1390 91; <label>:10: ; preds = %892 %11 = load i32, ptr %0, align 493 %12 = add nsw i32 %.0, %1194 br label %1395 96; <label>:13: ; preds = %10, %897 %.1 = phi i32 [ %12, %10 ], [ %.0, %8 ]98 ret i32 %.199}100