brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · d4ba1f3 Raw
107 lines · plain
1; RUN: llc < %s -asm-verbose=false -fast-isel -fast-isel-abort=1 -verify-machineinstrs | FileCheck %s2 3target triple = "wasm32-unknown-unknown"4 5; FastISel should not fold one of the add/sub operands into a load/store's6; offset when 'nuw' (no unsigned wrap) is not present, because the address7; calculation does not wrap. When there is an add/sub and nuw is not present, we8; bail out of FastISel.9 10@mylabel = external global ptr11 12; CHECK-LABEL: dont_fold_non_nuw_add_load:13; CHECK:       local.get  014; CHECK-NEXT:  i32.const  214748364415; CHECK-NEXT:  i32.add16; CHECK-NEXT:  i32.load  017define i32 @dont_fold_non_nuw_add_load(ptr %p) {18  %q = ptrtoint ptr %p to i3219  %r = add i32 %q, 214748364420  %s = inttoptr i32 %r to ptr21  %t = load i32, ptr %s22  ret i32 %t23}24 25; CHECK-LABEL: dont_fold_non_nuw_add_store:26; CHECK:       local.get  027; CHECK-NEXT:  i32.const  214748364428; CHECK-NEXT:  i32.add29; CHECK-NEXT:  i32.const  530; CHECK-NEXT:  i32.store  031define void @dont_fold_non_nuw_add_store(ptr %p) {32  %q = ptrtoint ptr %p to i3233  %r = add i32 %q, 214748364434  %s = inttoptr i32 %r to ptr35  store i32 5, ptr %s36  ret void37}38 39; CHECK-LABEL: dont_fold_non_nuw_add_load_2:40; CHECK:       i32.const  mylabel41; CHECK-NEXT:  i32.const  -442; CHECK-NEXT:  i32.add43; CHECK-NEXT:  i32.load  044define i32 @dont_fold_non_nuw_add_load_2() {45  %t = load i32, ptr inttoptr (i32 add (i32 ptrtoint (ptr @mylabel to i32), i32 -4) to ptr), align 446  ret i32 %t47}48 49; CHECK-LABEL: dont_fold_non_nuw_add_store_2:50; CHECK:       i32.const  mylabel51; CHECK-NEXT:  i32.const  -452; CHECK-NEXT:  i32.add53; CHECK-NEXT:  i32.const  554; CHECK-NEXT:  i32.store  055define void @dont_fold_non_nuw_add_store_2() {56  store i32 5, ptr inttoptr (i32 add (i32 ptrtoint (ptr @mylabel to i32), i32 -4) to ptr), align 457  ret void58}59 60; CHECK-LABEL: dont_fold_non_nuw_sub_load:61; CHECK:       local.get  062; CHECK-NEXT:  i32.const  -214748364463; CHECK-NEXT:  i32.sub64; CHECK-NEXT:  i32.load  065define i32 @dont_fold_non_nuw_sub_load(ptr %p) {66  %q = ptrtoint ptr %p to i3267  %r = sub i32 %q, -214748364468  %s = inttoptr i32 %r to ptr69  %t = load i32, ptr %s70  ret i32 %t71}72 73; CHECK-LABEL: dont_fold_non_nuw_sub_store:74; CHECK:       local.get  075; CHECK-NEXT:  i32.const  -214748364476; CHECK-NEXT:  i32.sub77; CHECK-NEXT:  i32.const  578; CHECK-NEXT:  i32.store  079define void @dont_fold_non_nuw_sub_store(ptr %p) {80  %q = ptrtoint ptr %p to i3281  %r = sub i32 %q, -214748364482  %s = inttoptr i32 %r to ptr83  store i32 5, ptr %s84  ret void85}86 87; CHECK-LABEL: dont_fold_non_nuw_sub_load_2:88; CHECK:       i32.const  mylabel89; CHECK-NEXT:  i32.const  490; CHECK-NEXT:  i32.sub91; CHECK-NEXT:  i32.load  092define i32 @dont_fold_non_nuw_sub_load_2() {93  %t = load i32, ptr inttoptr (i32 sub (i32 ptrtoint (ptr @mylabel to i32), i32 4) to ptr), align 494 ret i32 %t95}96 97; CHECK-LABEL: dont_fold_non_nuw_sub_store_2:98; CHECK:       i32.const  mylabel99; CHECK-NEXT:  i32.const  4100; CHECK-NEXT:  i32.sub101; CHECK-NEXT:  i32.const  5102; CHECK-NEXT:  i32.store  0103define void @dont_fold_non_nuw_sub_store_2() {104  store i32 5, ptr inttoptr (i32 sub (i32 ptrtoint (ptr @mylabel to i32), i32 4) to ptr), align 4105  ret void106}107