1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --version 2 2; RUN: opt -passes=newgvn -S < %s | FileCheck %s 3 4define i32 @test1(ptr %p) { 5; CHECK-LABEL: define i32 @test1 6; CHECK-SAME: (ptr [[P:%.*]]) { 7; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG0:![0-9]+]] 8; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]] 9; CHECK-NEXT: ret i32 [[C]] 10; 11 %a = load i32, ptr %p, !range !0 12 %b = load i32, ptr %p, !range !0 13 %c = add i32 %a, %b 14 ret i32 %c 15} 16 17define i32 @test2(ptr %p) { 18; CHECK-LABEL: define i32 @test2 19; CHECK-SAME: (ptr [[P:%.*]]) { 20; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4 21; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]] 22; CHECK-NEXT: ret i32 [[C]] 23; 24 %a = load i32, ptr %p, !range !0 25 %b = load i32, ptr %p 26 %c = add i32 %a, %b 27 ret i32 %c 28} 29 30define i32 @test3(ptr %p) { 31; CHECK-LABEL: define i32 @test3 32; CHECK-SAME: (ptr [[P:%.*]]) { 33; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG1:![0-9]+]] 34; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]] 35; CHECK-NEXT: ret i32 [[C]] 36; 37 %a = load i32, ptr %p, !range !0 38 %b = load i32, ptr %p, !range !1 39 %c = add i32 %a, %b 40 ret i32 %c 41} 42 43define i32 @test4(ptr %p) { 44; CHECK-LABEL: define i32 @test4 45; CHECK-SAME: (ptr [[P:%.*]]) { 46; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG2:![0-9]+]] 47; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]] 48; CHECK-NEXT: ret i32 [[C]] 49; 50 %a = load i32, ptr %p, !range !0 51 %b = load i32, ptr %p, !range !2 52 %c = add i32 %a, %b 53 ret i32 %c 54} 55 56define i32 @test5(ptr %p) { 57; CHECK-LABEL: define i32 @test5 58; CHECK-SAME: (ptr [[P:%.*]]) { 59; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG3:![0-9]+]] 60; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]] 61; CHECK-NEXT: ret i32 [[C]] 62; 63 %a = load i32, ptr %p, !range !3 64 %b = load i32, ptr %p, !range !4 65 %c = add i32 %a, %b 66 ret i32 %c 67} 68 69define i32 @test6(ptr %p) { 70; CHECK-LABEL: define i32 @test6 71; CHECK-SAME: (ptr [[P:%.*]]) { 72; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG4:![0-9]+]] 73; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]] 74; CHECK-NEXT: ret i32 [[C]] 75; 76 %a = load i32, ptr %p, !range !5 77 %b = load i32, ptr %p, !range !6 78 %c = add i32 %a, %b 79 ret i32 %c 80} 81 82define i32 @test7(ptr %p) { 83; CHECK-LABEL: define i32 @test7 84; CHECK-SAME: (ptr [[P:%.*]]) { 85; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG5:![0-9]+]] 86; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]] 87; CHECK-NEXT: ret i32 [[C]] 88; 89 %a = load i32, ptr %p, !range !7 90 %b = load i32, ptr %p, !range !8 91 %c = add i32 %a, %b 92 ret i32 %c 93} 94 95define i32 @test8(ptr %p) { 96; CHECK-LABEL: define i32 @test8 97; CHECK-SAME: (ptr [[P:%.*]]) { 98; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4 99; CHECK-NEXT: [[C:%.*]] = add i32 [[A]], [[A]] 100; CHECK-NEXT: ret i32 [[C]] 101; 102 %a = load i32, ptr %p, !range !9 103 %b = load i32, ptr %p, !range !10 104 %c = add i32 %a, %b 105 ret i32 %c 106} 107 108 109!0 = !{i32 0, i32 2} 110!1 = !{i32 3, i32 5} 111!2 = !{i32 2, i32 5} 112!3 = !{i32 -5, i32 -2} 113!4 = !{i32 1, i32 5} 114!5 = !{i32 10, i32 1} 115!6 = !{i32 12, i32 16} 116!7 = !{i32 1, i32 2, i32 3, i32 4} 117!8 = !{i32 5, i32 1} 118!9 = !{i32 1, i32 5} 119!10 = !{i32 5, i32 1} 120;. 121; CHECK: [[RNG0]] = !{i32 0, i32 2} 122; CHECK: [[RNG1]] = !{i32 0, i32 2, i32 3, i32 5} 123; CHECK: [[RNG2]] = !{i32 0, i32 5} 124; CHECK: [[RNG3]] = !{i32 -5, i32 -2, i32 1, i32 5} 125; CHECK: [[RNG4]] = !{i32 10, i32 1} 126; CHECK: [[RNG5]] = !{i32 3, i32 4, i32 5, i32 2} 127;. 128