1; RUN: llc < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s 2 3; and can be eliminated 4; CHECK-LABEL: {{^}}test_call_known_max_range: 5; CHECK: bl foo 6; CHECK-NOT: and 7; CHECK: ret 8define i32 @test_call_known_max_range() #0 { 9entry: 10 %id = tail call i32 @foo(), !range !0, !noundef !{} 11 %and = and i32 %id, 1023 12 ret i32 %and 13} 14 15; CHECK-LABEL: {{^}}test_call_known_trunc_1_bit_range: 16; CHECK: bl foo 17; CHECK: and w{{[0-9]+}}, w0, #0x1ff 18; CHECK: ret 19define i32 @test_call_known_trunc_1_bit_range() #0 { 20entry: 21 %id = tail call i32 @foo(), !range !0, !noundef !{} 22 %and = and i32 %id, 511 23 ret i32 %and 24} 25 26; CHECK-LABEL: {{^}}test_call_known_max_range_m1: 27; CHECK: bl foo 28; CHECK: and w{{[0-9]+}}, w0, #0xff 29; CHECK: ret 30define i32 @test_call_known_max_range_m1() #0 { 31entry: 32 %id = tail call i32 @foo(), !range !1, !noundef !{} 33 %and = and i32 %id, 255 34 ret i32 %and 35} 36 37; and can be eliminated 38; CHECK-LABEL: {{^}}test_call_known_max_range_attr: 39; CHECK: bl foo 40; CHECK-NOT: and 41; CHECK: ret 42define i32 @test_call_known_max_range_attr() #0 { 43entry: 44 %id = tail call noundef range(i32 0, 1024) i32 @foo() 45 %and = and i32 %id, 1023 46 ret i32 %and 47} 48 49; CHECK-LABEL: {{^}}test_call_known_max_range_attr_no_noundef: 50; CHECK: bl foo 51; CHECK: and w{{[0-9]+}}, w0, #0x3ff 52; CHECK: ret 53define i32 @test_call_known_max_range_attr_no_noundef() #0 { 54entry: 55 %id = tail call range(i32 0, 1024) i32 @foo() 56 %and = and i32 %id, 1023 57 ret i32 %and 58} 59 60declare i32 @foo() 61 62attributes #0 = { norecurse nounwind } 63attributes #1 = { nounwind readnone } 64 65!0 = !{i32 0, i32 1024} 66!1 = !{i32 0, i32 1023} 67