<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/137572>137572</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            SROA pass and llvm.fake.use
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          hongjia
      </td>
    </tr>
</table>

<pre>
    I run into a problem with the MSP430 backend.

With the following program:

``` C
short gs = 1234;
int gi = 12345;

float foo(void)
{
  double vd = -876.543;
  int a = gi + gs;
 return a;
}
```

And compile it with `clang` (the main branch):

```
 ~/build/bin/clang -S -emit-llvm -Og -target msp430 t.c
```

The generated IR:

```
; ModuleID = 't.c'
source_filename = "t.c"
target datalayout = "e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16"
target triple = "msp430"

@gs = dso_local local_unnamed_addr global i16 1234, align 2
@gi = dso_local local_unnamed_addr global i16 12345, align 2

; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read, argmem: none, inaccessiblemem: readwrite)
define dso_local float @foo() local_unnamed_addr #0 {
entry:
  %0 = load i16, ptr @gi, align 2, !tbaa !2
  %1 = load i16, ptr @gs, align 2, !tbaa !6
  %add = add nsw i16 %1, %0
  %conv = sitofp i16 %add to float
  notail call void (...) @llvm.fake.use(i16 %add) #2
  notail call void (...) @llvm.fake.use(double -8.765430e+02) #2
  ret float %conv
}

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite)
declare void @llvm.fake.use(...) #1

attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(read, argmem: none, inaccessiblemem: readwrite) "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }
attributes #2 = { nounwind }

!llvm.module.flags = !{!0}
!llvm.ident = !{!1}

!0 = !{i32 1, !"wchar_size", i32 2}
!1 = !{!"clang version 21.0.0git (https://github.com/llvm/llvm-project.git 7baa09297603adef3183364d8990b97e9be23d31)"}
!2 = !{!3, !3, i64 0}
!3 = !{!"int", !4, i64 0}
!4 = !{!"omnipotent char", !5, i64 0}
!5 = !{!"Simple C/C++ TBAA"}
!6 = !{!7, !7, i64 0}
!7 = !{!"short", !4, i64 0}
```

And `llc` cannot compile the IR:

```
 ~/build/bin/llc -filetype asm -o - -O1 --debug --mtriple msp430 t.ll
```

```
...
Legalizing node: t12: ch = fake_use t10, ConstantFP:f64<-8.765430e+02>
Analyzing result type: ch
Legal result type
Analyzing operand: t10: ch = fake_use t9, t7
Legal operand
Analyzing operand: t11: f64 = ConstantFP<-8.765430e+02>
Soften float operand 1: t12: ch = fake_use t10, ConstantFP:f64<-8.765430e+02>
SoftenFloatOperand Op #1: t12: ch = fake_use t10, ConstantFP:f64<-8.765430e+02>

LLVM ERROR: Do not know how to soften this operator's operand!
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /home/hjcao/build/bin/llc -filetype asm -o - -O1 --debug --mtriple msp430 t.ll
1.      Running pass 'Function Pass Manager' on module 't.ll'.
2.      Running pass 'MSP430 DAG->DAG Pattern Instruction Selection' on function '@foo'
 #0 0x000055fca09602ca llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/hjcao/data/temp/llvm-project/llvm/lib/Support/Unix/Signals.inc:804:22
 #1 0x000055fca0960708 PrintStackTraceSignalHandler(void*) /home/hjcao/data/temp/llvm-project/llvm/lib/Support/Unix/Signals.inc:880:1
 #2 0x000055fca095dec0 llvm::sys::RunSignalHandlers() /home/hjcao/data/temp/llvm-project/llvm/lib/Support/Signals.cpp:105:20
 #3 0x000055fca095fc74 SignalHandler(int, siginfo_t*, void*) /home/hjcao/data/temp/llvm-project/llvm/lib/Support/Unix/Signals.inc:418:13
 #4 0x00007f1c69f2cdf0 (/lib/x86_64-linux-gnu/libc.so.6+0x3fdf0)
 #5 0x00007f1c69f8195c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #6 0x00007f1c69f2ccc2 raise ./signal/../sysdeps/posix/raise.c:27:6
 #7 0x00007f1c69f154ac abort ./stdlib/abort.c:81:3
 #8 0x000055fca088853e llvm::report_fatal_error(llvm::Twine const&, bool) /home/hjcao/data/temp/llvm-project/llvm/lib/Support/ErrorHandling.cpp:126:9
 #9 0x000055fca0888357 llvm::report_fatal_error(llvm::StringRef, bool) /home/hjcao/data/temp/llvm-project/llvm/lib/Support/ErrorHandling.cpp:87:68
#10 0x000055fca077d160 llvm::DAGTypeLegalizer::SoftenFloatOperand(llvm::SDNode*, unsigned int) /home/hjcao/data/temp/llvm-project/llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp:1127:53
#11 0x000055fca06e8011 llvm::DAGTypeLegalizer::run() /home/hjcao/data/temp/llvm-project/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp:335:46
#12 0x000055fca06ebf0f llvm::SelectionDAG::LegalizeTypes() /home/hjcao/data/temp/llvm-project/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.cpp:1060:37
#13 0x000055fca06c5142 llvm::SelectionDAGISel::CodeGenAndEmitDAG() /home/hjcao/data/temp/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:979:36
...
```

I find that after the SROA pass, the operand of `llvm.fake.use` is left a FP64 constant:

```
...
*** IR Dump After SROAPass on foo ***
; Function Attrs: nounwind
define dso_local float @foo() #0 {
entry:
  %0 = load i16, ptr @gi, align 2, !tbaa !2
  %1 = load i16, ptr @gs, align 2, !tbaa !6
 %add = add nsw i16 %0, %1
  %conv = sitofp i16 %add to float
  notail call void (...) @llvm.fake.use(i16 %add) #3
  notail call void (...) @llvm.fake.use(double -8.765430e+02) #3
  ret float %conv
}
...
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzMWVtv2zoS_jXMCyGDInXzQx6Ui7sBTrdB0t19NGiJknlKkQJJNc152N--GFJ2fEm2PQdpdwEjssXhx2-GM8MZhjsney3EJcqvUH5zwSe_NfZya3T_u-QXG9M-X95hO2kstTeY49GajRIDfpJ-i_1W4I-P9xkjeMObL0K3C0RqROp_7UY7o5R5krqHib3lA2J1FEEFiR98jUjttsZ63DuM2A1OKcsQu0KkltrjXu5f5vEtInWnDPe4MwbR6quRLaJLGChhGOPWTBsl8Nc2zEyqsljkGYuTMWiCeRgBaHqFezcPWeEnqzGflylvDnnGhWvd4sYMo1QCSx_NgArSKK57UAbRCvQeuNR4Y7lutkDtTGlY7d-IrjaTVC08pUZ0FVBw8ogTMUifKPV1wMmnHiee2154PLgRbO0XzTmxz1uBe6GF5V60-O7h1TURu8IfTTspcXcTLIBoCWi0hD0wk23EupNKaD6IeZyGcYpIPZNoueeKP5vJ7yREAtsqkhGxOi3Cn0QyOn8psvil273pdm84YnWV6Cr-ekyLo3W8laPas4iqRwH4ZGR2ltaZtTINVzj8XU8ayLdr3rYW98psuMIyLaJT0WvMlew1pjOG_NMY-QlINOpq0o2XRuPae-sQq_EwOR98XjiHtemsEFgbK5rJOvjmnnWDtZn0k9QtfpJKzd43iMHYZ0QrK3gbFrP9IMDCWBst4I3UvGmEcxJCMQ6B8JOVXsRIaEUntThQLAYMykiMGUSXr-mKKCM4RpHQ3j5HJ8IY0ZwESynDWzAFsBi9xcGGhxah1xjR1G84hyfdzU7fnO3enl3sZvM2RjI8tXsKewGgUT4nO7nG6K9B0ElvunEnB9O8iSYIotp4LhVuuFIYsgdE7WKxAKOgjEDYLTr-RSwmJxCtXlCCAGX0L4DMKSmpFmWRZ4wIRK8IPQK0wu-2KarykoN-0MmACyTiF3_7vpf9iC81ilsxK3mu2k5pytLIlXtv5Wbyws0OBSFcXv0vQwJSiDaJt3wcpe6TgfstJBN2AxnOTgJRCjLO8-ZLMlrjReONTTZT1wmbOPmH2ItXQTZszLGm6Vua_oR9eZUA3RPYQ784EE3Dxg0h_S86xecEimgKEU9TMsvOgrIV2h9LpIdo5GBMMornaEwRpU_Nltv1zmiwO4xiuodPj1ERpfHg-yqsA_em6YIsSC8hEKqt9yP4OqIrRFe99Ntps2jMgOgKaM4P2LLfReMXMKvccE6WdFkWhPFWdCytGCuytlouyWZZiuVGUNayFNybvtCix7TYrE94yiLDL_ZhZwpI7WdVEU2z8xnZ2QwzaDkaDzYGa73Mzs9n52ezH-UAh-M1oqtrRK-givl8VdeH6hTHk8oZvjyHL8_gQzn2XxQ6r4lQQZRqoAJquNbG74skqIbeqEZeqYCUanACFYh_HgXmbsCJwQlOPqU4SVqxmXqcJMNcGuzLIaXOSR3-hAxF6t9Ez5X8A4pRbVoBEeVTqElwsw0WgJy2npzAPiWg8bXRznPtV_eI1aFquT7N3-w26M_Vc8C1wk3KYyAfcXfLHo0czjCjsFy3kQx5lcwSuPhyD7Wb8iZMCo-uiD53qMTr9B9N54Wej54ZCKfvZ56IvwL4TzP6pzEeF--2Bhjnt39-xLcPD5_A2fCNgQMaf9HmCW_NE5z_Lurpt9JFNb2xiJZubzwK59f9b7f14y1202aQ0CeAy1kxQnviDf5z2QjRlXRuEg7RFQa9pW7U1MagaCx329A3ecsbAR76CKcPbqdhjPFCFogs72PjBGfeNAjtw8GP6GprBgGP3xtu3jOOUlj0YdI6dG3cwclS7kuPe3jxkWveCzAeNhrHEyW2EkohWoIq9DWUuVe8qT8kiN3e1B_wPfdeWI3vtPN2iks8CiXCtxm_260NbcpcwEI0xOKCfCOEkDzvGk6WBaENx2EnWI1Y7Z5d_HJvpfbBvJ_B2IhWL0KWP62N81bwAdEiFhM-1gynRobeB9GVF8N4vtU7B5AbRFeP0ziGHLr6h5bf4IXsNVduIXUDbQ-BHih0M7FyOFGjJBU-4RwB_sZ1q8D0c9tb_2yiFSSldOZJj3nmrWjIa-Z-mPQRXTe3HO9DdMewGUPHSXIwJZkpshOKXVNm-NR2YYOvsZO91J1Z-2DHa_xrTJqloeNlM-FsJlx2aVMsO9q0XbhG2MN9q4p1kSVK6ulb0uspDjQLZxYFpMBvrGs7Emt1AMyPAat0mTd4vR79FgrI9Rep1DqUD5BNeIisBaIrPXqF6OpQbBHogqeWxQxenLJtGootl04EEBc0RXS1CL-eXStGyH6jccESQTLA0hKxeodaHqOmecYbzDeQdAOOb6MpwqswvYLDY2fC6mjPq6rKmThwy5i-1x33XK2FtZD2D-L_8xO0yg2cNHP8b4xR7-cEt7Bi8D2p-53T0gKxerdjy1P-LC9_nP-jt1L3D6L7NdSrsHFVKB1ZepyAy7JNi8OMcFN_-Pw8irn0EnZmfFYRHCt083eoz2JMTjrcULbvkZSvTSs-CDgf92fMTf0B0dWOX6AEhPfJJQ1-mrNZ3eNEXYiKpOl31bWTfof8913yh7wZg6SYFTNtekJ705HugPYRYHhzhPmryaekgEOHlTP745ReNHma0TfY3z0KFd_OK9a6vR2kD4v9PC1OKcyKLMsl6FHsW5CTHuUOd9Cj-y33mHde2FAYPj58qkPJFOr-rdjX5KaLbdbh9UtBsHRYiQ5q1dV9kcVExrV_teWaadD5g-8e8M00jLgOq8PKocCDqssYvJd78wJqd8_wg1eO_4f3i29fL5L5ejH9xdeL7L2vF9l3rhdPfPOivWTtki35hbhMyyyvSFXl2cX2sqRFloqKZBUvGkGrnPIlbXjBl1VVLvPNhbykhOYkoxWheZZmC5GXZZNtyrZsGlYJjjIiBi7VIvA3tr8I_dFlysq8pBeKb4Ry4X9RlGrxhMMoohTlNxf2MoTmZuodGEA6715gvPRKXO4jJzRbRza6mKy6_Ovd20zw6yX9TwAAAP__YrAZhQ">